Laravel 4. Шаблоны и шаблонизатор Blade (часть 4)

Категория: Laravel

Основу шаблонизатора 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

категория: Laravel