Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Я начал изучать Laravel и не понимают природу представления шаблонов.
index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="{{ URL::asset('/') }}css/bootstrap.min.css" />
<link rel="stylesheet" href="{{ URL::asset('/') }}css/bootstrap-theme.min.css" />
<script src="{{ URL::asset('/') }}js/bootstrap.min.js"></script>
<script src="{{ URL::asset('/') }}js/jquery-2.1.1.min.js"></script>
</head>
<body>
Start {{{ $n }}}
<br>
@foreach($p as $post)
<p>{{ $post->po_id }}, {{ $post->po_user }}, {{ $post->po_post }} </p>
@endforeach
@section('sidebar')
This is the master sidebar.
@show
</body>
</html>
test.blade.php
@extends('index')
@section('sidebar')
test_1
@show
InController.php
<?php
class InController extends BaseController
{
public function getIndex()
{
$name = 'Hello <script> alert("ho"); </script>';
$posts = Post::all();
return View::make('index')
->with('n', $name)
->with('p', $posts);
}
public function getT1()
{
return View::make('test');
}
}
route.php
<?php
Route::get('/', array(
'as' => 'home',
'uses' => 'InController@getIndex'
));
Route::get('/test', array(
'as' => 't1',
'uses' => 'InController@getT1'
));
Если вызов "http://127.0.0.1/laravel/public/test" тогда ошибка "Undefined variable: n (View: C:\..."
И это понятно.
Но как построить страницу (шаблон) где необходимо изменять лишь небольшую часть?
Header, footer, sidebars - там есть не только HTML, CSS и JS. Но также информация из DB (MySQL).
Изменения только в "content".
Пожалуйста, дайте направление, где копать.
Пропущен @yield() , но это и не удивительно, эту особенность шаблонизации laravel упускают многие.
Я опишу свой способ организации шаблонов. У меня шаблоны разбиты на три части.
Html дан в bootstrap3.
1. Главный лейаут приложения, app/views/_layout/main.blade.php :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<title>@yield('title', "Дефолтный тайтл страницы")</title>
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">
<link href="/app/css/style.css" rel="stylesheet">
</head>
<body>
<header>Мой хедер с меню и т.п.</header>
@yield("container")
<footer>Мой футер</footer>
</body>
</html>
2. Вспомогательные лейауты с сайдбарами - справа, слева и без. Вот файл app/views/_layout/leftsidebar.blade.php :
@extends('_layout.main')
@section('container')
<div class="container">
<div class="row">
<div class="col-md-3">
@yield('sidebar')
</div>
<div class="col-md-9">
@yield('content')
</div>
</div>
</div>
@stop
Остальное (справа и без сайдбара) пишется по аналогии. Здесь написано, что этот файл встраивается в _layout.main , секцией container на место, забронированное для неё (@yield("container")).
Папка лейаутов у меня начинается с подчеркивания затем, чтобы она была всегда вверху списка папок во views - легче искать.
3. И, собственно, шаблон, который вызывается из контроллера во View::make(). Например, app/views/home.blade.php :
@extends('_layout.leftsidebar')
@section('title')
Тайтл конкретной страницы
@stop
@section('sidebar')
@include("sidebar.sidebar_main")
@stop
@section('content')
Hello world.
@stop
Здесь я определяю тайтл страницы, сайдбар, который будет отображаться, и вид верстки - слева будет сайдбар или справа (тогда вместо leftsidebar я напишу rightsidebar).
В секции content я собственно рисую контент, который выводит данная вьюха.
Если сайдбар постоянно один, то чтобы не писать его секцию в каждой вьюхе, его можно захардкорить лейаутах 2го уровня , поставив вместо @yield("sidebar") - @include("sidebar.sidebar_main") , т.е. путь до вьюхи сайдбара.
Соответственно, когда вызывается View::make("home") , фреймворк берет home.blade.php , запоминает определенные там section, дальше обращается к вьюхе-"родителю", которая определяется в @extends(). Там он вставляет имеющиеся секции на место @yield() и запоминает определенные там секции. Затем берет @extends() и все повторяет, пока не дойдет до вьюхи, где @extends() уже не будет. После этого он сохраняет полученный html и отдает его на выход.
Общий принцип, надеюсь, понятен.
Изменено slider23 (09.09.2014 10:57:27)
Не в сети
Да. @yield я пропустил.
Принцип "лейаутов" для меня ясен.
Пока не ясно, как $n и $p поставляется значение.
Если открыть '/', то они заполняются и подаются.
Но если идти в '/ тест ", $n и $p не получает никакого значения.
Выделив этот раздел в отдельном файле это не решает проблему, потому что их значения не обрабатываются.
- Но если идти в ’/ тест ", $n и $p не получает никакого значения.
Естественно — откуда им взяться, ведь при вызове шаблона они не передаются:
Route::get('/test', array( 'as' => 't1', 'uses' => 'InController@getT1' ));
Идём в InController, метод getT1:
public function getT1() { return View::make('test'); }
Как видно, шаблону не передаётся ни одной переменной (тогда как в том же getIndex они есть).
Не в сети
Естественно — откуда им взяться, ведь при вызове шаблона они не передаются:
Вот что я хочу понять. Откуда их взять.
Кажется, что я нашел решение.
View::composer(array('profile','dashboard'), function ($view) {
$view->with('count', User::count());
});
View::composer('profile', 'ProfileComposer');
class ProfileComposer {
public function compose($view)
{
$view->with('count', User::count());
}
}
http://laravel.ru/docs/v4/responses#составители
Только остается вопрос о том, как он будет работать с большим количеством данных.
- Вот что я хочу понять. Откуда их взять.
Точно от туда же, откуда берутся и переменные для index. Ты ведь сам написал этот код? Понимаешь, что делает View::make('index')->with('n', $name)?
- Кажется, что я нашел решение.
Составители — хороший вариант.
- Только остается вопрос о том, как он будет работать с большим количеством данных.
Количество данных и составители — это яблоки и розовое. Две разные вещи. Если данных столько, что на них не хватает памяти — её не хватит и при составителях, и без них.
Не в сети
Страницы 1