Включить частичный шаблон

19

Я пытаюсь использовать Drupal 8, с пользовательской темой, из-за больших структурных различий в моих требованиях. У меня есть страница - front.twig.html и page.twig.html, я хотел бы создать части шаблона, используемые в phrozn oder в обычном проекте Symfony2, например, footer.html.twig и header.html.twig. Эти шаблоны сохраняются в подкаталоге / parts /.

Но когда я называю эти шаблоны как обычно, я просто получаю строку с названием шаблона.

Например:

{# in page.html.twig or page--front.html.twig #}
{% include 'parts/footer.html.twig' %} 

Возвращает имя файла в виде строки:

parts/footer.html.twig

Это возможно сделать с помощью Drupal 8?

felipep
источник

Ответы:

33

Вы не можете делать относительные пути, все пути должны быть либо из корня Drupal, либо основаны на пути к пространству имен в вашем каталоге шаблонов: https://www.drupal.org/node/2143557 .

Я бы избегал «от корня Drupal» и использовал пространства имен, по крайней мере, до тех пор, пока не будет решен https://www.drupal.org/node/2291449 .

{% include '@mytheme/parts/footer.html.twig' %}

Редактировать: если вы хотите передать дополнительные аргументы для цикла или для проверки некоторых переменных во включенном twigшаблоне, вы должны написать так:

{% include '@mytheme/includes/form-block.html.twig' with {dog: true} %}

Изменить: Теперь, когда https://www.drupal.org/node/2291449 был зафиксирован, вы также можете сделать:

{% include 'footer.html.twig' %}

См. Https://www.drupal.org/node/2369981, чтобы узнать, почему вы видите имя файла как строку, а не как полезное исключение.

Cottser
источник
А как насчет includeпередачи значений? Предположим, я хотел бы включить image-formatterи пропустить urlноль, чтобы избежать создания связанного изображения.
SaidbakR
Примеры, приведенные в этом ответе, похоже, не работают.
arnoldbird
3
Имейте @mythemeв виду, что разрешает путь mytheme+ строки /templates. Другими словами, @mythemeразрешается в mytheme/templatesкаталог.
Даниэльс
Чтобы уточнить комментарий от @daniels. Если ваша пользовательская тема называется mytheme и она находится в «themes / custom / mytheme», тогда пространство имен Twig преобразуется@mytheme в «themes / custom / mytheme / templates» . Включение шаблона, расположенного по адресу, @mytheme/fragments/footer.html.twigозначает, что он будет преобразован
ec0g
15

Используйте полный путь к каталогу темы. Если вы используете пространство имен, вам придется изменить его, если вы перенесете код на другой сайт или тему.

Это должно работать:

{% include directory ~ '/templates/parts/footer.html.twig' %}
Андре
источник
это очень удобно при создании подтем. Установите это в вашей родительской теме, а затем укажите версию в каталоге шаблонов дочерней темы.
Эндрю Киллен
Это единственный ответ, который работал для меня.
arnoldbird
5

Также возможно использование массива Twig для создания запасного варианта, когда файл не существует.

Например. Если footer.html.twig недоступен, будет использоваться defaultfooter.html.twig.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Объедините это с использованием переменных в именах файлов, и вы можете включать разные файлы в зависимости от своего рода контекста.

Nb: Я все еще пытаюсь понять, является ли это лучшей практикой или нет.

granticusiv
источник
5

Обратите внимание, что вы можете передавать переменные после withключевого слова:

{# template.html will have access to the variables from the current context and the additional ones provided #}
{% include 'template.html' with {'foo': 'bar'} %}

{% set vars = {'foo': 'bar'} %}
{% include 'template.html' with vars %}

См. Документацию Twig http://twig.sensiolabs.org/doc/tags/include.html.

Рафаэль Ларринага
источник
1

Для Drupal 8

Включение файла ветки в тему, когда вы выполняете {% include 'FILE_NAME.html.twig' %}Drupal, ожидает, что ваш FILE будет находиться в вашем текущем каталоге тем. Просто положите его туда, и оно будет работать.

Включение файла ветки в ваш модуль

Если вы хотите добавить его в МОДУЛЬ, вы должны объявить его в функции ТЕМА. В вашем файле .module просто добавьте следующее:

<?php function YOUR_MODULE_NAME_theme($existing, $type, $theme, $path) {   
   'FILE_NAME' => [
      'variables' => [
      ],
      'template' => 'FILE_NAME',
    ], ?>

Затем поместите файл Twig в файл YOUR_MODULE / template / FILE_NAME.html.twig.

Карим Рачади
источник
Это неверная информация о пути. Чтобы включить файл из модуля с крючком темы, вам нужен другой способ: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}}} Не забывайте, что файлы шаблонов должны быть в 'yourModuleName / templates /'.
Вертер