Laravel 4. Шаблоны и шаблонизатор Blade (часть 4)
Основу шаблонизатора Blade составляют секции (section), наследование (extends) и включение (include) подшаблонов. По умолчанию, шаблоны расположены в каталоге app/views/, и должны иметь расширение .blade.php. В качестве разделителя каталогов, при указании пути к шаблону, можно использовать точку или слеш.
Рендеринг шаблона
Пример рендеринга шаблона и передача переменных из контроллера:
return View::make('user.list', ['users' => $users]);
Наследование и включение подшаблонов
В примере шаблон user.list расширяет основной шаблон layout.
{{-- layout.blade.php --}} <!-- это комментарий -->
<html>
<head>
{{ HTML::style('assets/css/style.css') }}
@yield('css')
</head>
<body>
<div id="content-wrap">
@section('content')
<p>Основное содержимое</p>
@show <!-- показать секцию "content" -->
</div>
@yield('footer', 'Контент по умолчанию');
{{ HTML::script('assets/library/jquery/2.1.1.js') }}
@yield('script') <!-- вывести секцию дополнительных скриптов "script" -->
</body>
</html>
{{-- user/list.blade.php --}}
@extends('layouts.scaffold')
@section('content')
<!-- Вставить содержимое родительской секции "content" (только для @extends) -->
<h2>Пользователи</h2>
@if (isset($users) && count($users)) <!-- условный оператор Blade -->
@foreach ($users as $i => $user) <!-- цикл -->
<!-- включение подшаблона -->
@include('user.item', ['item' => $user, 'key' => 'НЕ ПОДДЕРЖИВАЕТ МНОГОСТРОЧНУЮ ЗАПИСЬ'])
@endforeach
@else
Нет пользователей
@endif
@stop <!-- указывает что секцию не нужно рендерить сразу же -->
{{-- user/item.blade.php --}}
<div>
{{{$item->email}}} <!-- экранирование и вывод значения свойства -->
</div>
Примечание
По умолчанию, содержимое каждой последующей секции добавляется в конец предыдущей секции. Для перезаписи используйте директиву @overwrite
:
@section('content')
Контент секции (блока)
@overwrite
Тогда зачем конструкция ?
Циклы
Blade предоставляет несколько конструкций циклов:
@foreach ($users as $user)
{{ $user->name }}
@endforeach
@forelse($users as $user)
{ $user->name }}
@empty
Нет пользователей
@endforelse
@for ($i = 0; $i < 10; $i++)
{{ $i }}
@endfor
@while ($i < 10)
{{$i++}}
@endwhile
Формы
Добавление пустой опции в select:
{{Form::select('role', (['Выберите роль'] + $options), Input::get('role'), ['class' => 'fieldRole'])}}
Хелперы
Сформировать ссылку на роут:
{{{ URL::route('product', ['article' => $product->article]) }}}
Советы
Используйте экранирование данных, если вы не ожидаете получить HTML код в переменной:
{{{ $item->title }}}
Примечание
Для экранирования используется ф-ция htmlspecialchars()
:
htmlspecialchars('content', ENT_QUOTES, 'UTF-8');
Исключить область из обработки шаблонизатором:
@{{ Эта часть не обрабатывается шаблонизатором }}
Проверить наличие переменной перед выводом:
{{{ isset($name) ? $name : 'Default' }}}
Вывести данные или значение по умолчанию (PHP >= 5.3):
{{{ $count ?: '' }}}
Присвоить переменную в шаблоне:
{{ ($var = 'Присвоить переменную в шаблоне') ? '' : '' }}
{{-- */ $var = 'Присвоить переменную в шаблоне'; /* --}}
#laravel, #blade, #template