Создание контента Вашего сайта

Шаблоны и части в Blade

Одним из самых больших преимуществ языка шаблонов является возможность создавать переиспользуемые макеты и частичные. Jigsaw дает Вам доступ ко всем функциям шаблонов и управляющим структурам Blade, которые доступны в Laravel (дополнительные сведения о макетах Blade смотрите в официальной документации Blade).

Определение макета

Сами макеты - это просто базовые шаблоны Blade, которые имеют один или несколько вызовов @yield, где дочерние шаблоны могут отображать свое содержимое.

Базовый главный макет может выглядеть так:

<!DOCTYPE html>
<html>
    <head>
        <title>Удивительная паутина</title>
    </head>
    <body>
        <header>
            Мой удивительный сайт
        </header>

        @yield('content')

        <footer>
            <p>©2016 Удивительная Компания</p>
        </footer>
    </body>
</html>

В Jigsaw прямо из коробки есть каталог /source/_layouts с основным макетом.

Расширение макета

Чтобы расширить макет, создайте шаблон, который указывает, какой макет расширять в директиве @extends, и какие разделы необходимо заполнить с помощью директивы @section:

@extends('_layouts.master')

@section('content')
    <div>
        <p>Содержание моей замечательной домашней страницы.</p>
    </div>
@endsection

Макеты и частичные данные указываются относительно каталога source с использованием точечной нотации, где каждая точка представляет собой разделитель каталогов в имени файла, а расширение .blade.php опускается.

Частичные шаблоны

Чтобы включить шаблон в другой шаблон, используйте директиву @include:

<!DOCTYPE html>
<html>
    <head>
        <title>Удивительная паутина</title>
    </head>
    <body>
        @include('_partials.header')

        @yield('content')

        @include('_partials.footer')
    </body>
</html>

Вы можете передать данные в частичные шаблоны, передав ассоциативный массив в качестве второго параметра:

<!DOCTYPE html>
<html>
    <head>
        <title>Удивительная паутина</title>
    </head>
    <body>
        @include('_partials.header', ['page_title' => 'My Amazing Site'])

        @yield('content')

        @include('_partials.footer')
    </body>
</html>

Затем эти данные доступны в Вашем частичном шаблоне как обычная переменная:

<!-- _partials/header.blade.php -->
<header>
    {{ $page_title }}
</header>

Компоненты

Jigsaw поддерживает как классовые, так и анонимные компоненты Blade.

Для отображения компонента Вы можете использовать тег компонента Blade в одном из Ваших шаблонов Blade. Теги компонентов Blade начинаются со строки x-, за которой следует имя кебаба класса компонента:

<x-input />

В Jigsaw представления автоматически обнаруживаются из каталога source/_components; чтобы создать анонимные компоненты в стиле <x-, Вам нужно только поместить шаблон Blade в этот каталог.

Компоненты на основе классов могут быть зарегистрированы вручную с помощью $bladeCompiler->component(), как подробно описано в разделе расширение Blade с помощью пользовательских директив ниже; или они могут быть обнаружены автоматически с помощью пространства имен Components. Чтобы автоматически загружать компоненты на основе классов, которые используют пространство имен Components, добавьте запись autoload в свой файл composer.json:

composer.json

"autoload": {
    "psr-4": {
        "Components\\": "where/you/want/to/keep/component/classes/"
    }
}

...а затем обновите ссылки автозагрузки Composer, запустив composer dump-autoload в Вашем терминале.

Предотвращение рендеринга макетов, частичных шаблонов и компонентов

Поскольку важно, чтобы макеты, части и компоненты никогда не рендерились сами по себе, Вам необходимо указать Jigsaw, когда файл не должен отображаться.

Чтобы предотвратить рендеринг файла или папки, просто поставьте перед ними знак подчеркивания:

source
_assets
_layouts
master.blade.php
assets
index.blade.php
...

По умолчанию Jigsaw предоставляет Вам каталог /_layouts, но Вы можете создавать любые файлы или каталоги, которые Вам нужны; все, что имеет префикс с подчеркиванием, не будет отображаться непосредственно в /build_local.

Например, если Вам нужно место для хранения всех Ваших частичных данных, Вы можете создать каталог с именем _partials:

source
_assets
_layouts
_partials
footer.blade.php
header.blade.php
assets
index.blade.php
...

Поскольку каталог _partials начинается с символа подчеркивания, эти файлы не будут отображаться при создании Вашего сайта, но по-прежнему будут доступны для @include в других Ваших шаблонах.


Расширение Blade с помощью настраиваемых директив

Jigsaw дает Вам возможность расширить Blade с помощью настраиваемых директив, так же, как Вы можете с Laravel. Для этого создайте файл blade.php на корневом уровне Вашего проекта Jigsaw (на том же уровне, что и config.php), и верните массив директив с ключом имени директивы, каждая из которых возвращает замыкание.

Например, Вы можете создать специальную директиву @datetime($timestamp) для форматирования данной целочисленной метки времени как даты в Ваших шаблонах Blade:

blade.php

return [
    'datetime' => function ($timestamp) {
        return '<?php echo date("l, F j, Y", ' . $timestamp . '); ?>';
    }
];

В качестве альтернативы файл blade.php получает переменную с именем $bladeCompiler, которая предоставляет экземпляр \Illuminate\View\Compilers\BladeCompiler. С его помощью Вы можете создавать собственные директивы Blade, компоненты с псевдонимами с именами @include или другие расширенные управляющие структуры Blade:

blade.php

<?php

/** @var \Illuminate\View\Compilers\BladeCompiler $bladeCompiler */

$bladeCompiler->directive('datetime', function ($timestamp) {
    return '<?php echo date("l, F j, Y", ' . $timestamp . '); ?>';
});

$bladeCompiler->aliasComponent('_components.alert');

$bladeCompiler->include('includes.copyright');

page.blade.php

/** до */

@component('_components.alert')
    Pay attention to this!
@endcomponent

@include('_partials.meta.copyright', ['year' => '2021'])


/** после */

@alert
    Pay attention to this!
@endalert

@copyright(['year' => '2021'])

Указание путей подсказки Blade

Чтобы использовать пути/пространства имен Blade-подсказок в разметке (например, email:components::section), укажите путь к каталогу с помощью ключа viewHintPaths в config.php:

config.php

<?php

return [
    'viewHintPaths' => [
        'email:templates' => __DIR__.'/source/_layouts',
        'email:components' => __DIR__.'/source/_components',
        'email:partials' => __DIR__.'/source/_partials'
    ]
];