Twig
Medusa\Helpers\Frontend\Twig отвечает за серверный рендер Twig-шаблонов через fluent-API helper-класса.
Выбор frontend-сущности
Для работы с Twig используется конструктор new Medusa\Helpers\Frontend\Twig($entity), где
$entity — имя каталога внутри одного из зарегистрированных source-каталогов frontend:
use Medusa\Helpers\Frontend;
$twig = new Frontend\Twig('themes');
Изменение имени Twig-файла
По умолчанию helper рендерит файл index.html.twig. Имя файла можно изменить методом
$twig->setIndexFilename($filename) до первого вызова html():
$twig->setIndexFilename('view.html.twig');
Метод возвращает текущий объект, поэтому его можно использовать в цепочке вызовов.
Регистрация Twig-шаблона
Регистрация шаблона выполняется методом $twig->include($name, $data = []), где $name —
имя каталога внутри зарегистрированного source-каталога frontend, например, внутри
www/frontend/{entity}/, а $data — контекст Twig:
$twig->include('default', [
'html' => [
'lang' => 'ru',
],
'head' => [
'title' => 'Приветствие',
],
]);
Метод include() возвращает текущий объект, поэтому может вызываться цепочкой несколько раз.
Подключение Vite-фрагментов
Подключение Vite-фрагментов выполняется методом $twig->with(Medusa\Helpers\Frontend\Vite $object):
$vite = new Medusa\Helpers\Frontend\Vite('themes');
$twig->with(
$vite->include('default', [
'title' => 'Добро пожаловать!',
'subTitle' => 'Это страница приветствия!',
])
);
Метод with() возвращает текущий объект, поэтому может вызываться цепочкой несколько раз.
Medusa\Helpers\Frontend\Vite более подробно описан в разделе Помощники -> Vite.
Получение HTML-результата
Получение результата выполняется методом $twig->html($toString = false):
$html = $twig->html(true);
Метод html() по умолчанию возвращает массив HTML-фрагментов. Если передать аргумент
$toString со значением true, метод вернёт готовую HTML-строку.
Пример содержимого файла www/frontend/themes/default/index.html.twig:
<!doctype html>
<html lang="{{ html.lang | default('en') }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ head.title | default('Page') }}</title>
{{ head.preload | join('\n\t') | raw }}
{{ head.styles | join('\n\t') | raw }}
</head>
<body>
{{ body.content | join('\n\t') | raw }}
{{ body.scripts | join('\n\t') | raw }}
{{ body.state | join('\n\t') | raw }}
</body>
</html>