К содержанию
Medusa
Документация

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>