samorez999
@samorez999

Yii2 + Twig = не рендерится дочерний шаблон, почему?

Собственно, сабж. Поставил последнюю версию Yii2 и сверху накатил плагин yiisoft/yii2-twig версии 2.4

Что я делаю: создаю материнский шаблон layouts/main.twig
<!doctype html>
<html lang="en">
<head>
    <title>Document</title>
</head>
  <body>
    <h1>Главная страница</h1>
    {% block content %}{% endblock %}
  </body>
</html>


Создаю дочерний шаблон home/index.twig и наследуюсь от главного
{% extends "@app/views/layouts/main.twig" %}

{% block content %}
    Дочерняя страница
{% endblock %}


Из HomeController'a рендерю дочерний шаблон, но в браузер выводится только материнский.
Все пути правильные, потому что любое изменение в путях приводит к ошибке "шаблон не найден".

Что я упускаю? Вроде бы с точки зрения синтаксиса все верно. Элементарные примеры же.

Вот конфиг twig на всякий случай:
spoiler
'view' => [
            'class' => 'yii\web\View',
            'renderers' => [
                'twig' => [
                    'class' => 'yii\twig\ViewRenderer',
                    'cachePath' => '@runtime/Twig/cache',
                    // Array of twig options:
                    'options' => [
                        'auto_reload' => true,
                    ],
                    'globals' => [
                        'html' => ['class' => '\yii\helpers\Html'],
                    ],
                    'uses' => ['yii\bootstrap'],
                ],
                // ...
            ],
        ],
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
samorez999
@samorez999 Автор вопроса
Отвечу сам себе.
Помог вот этот пример на гитхабе.
Это расширение работает немного иначе, чем обычный твиг. Здесь шаблон не нужно наследовать, он наследуется сам, когда ты в конфиге указываешь дефолтный лэйаут и переходишь по нужному урл.
spoiler
например, 'layout' => 'main.twig'

Наследование происходит при срабатывании экшена и вызова из него соответствующего вида
spoiler
например, срабатывание экшена indexAction в HomeController при переходе по ссылке site.com/home совершает неявное наследование вида home/index.twig от layouts/main.twig.


Если объяснять проще, то код дочернего шаблона будет выглядеть вот так:
// оператор extends не нужен
{% block content %}
    Дочерний шаблон
{% endblock %}


А код лейаута вот так:
<!doctype html>
<html lang="en">
<head></head>
<body>
// как будто выводишь обычные данные, без {% block %} {% endblock %}
{{ content | raw }}
</body>
</html>


Вот как-то так. Может кому-то поможет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы