包括部分模板


19

我正在尝试使用具有自定义主题的Drupal 8,由于结构上的巨大差异,我有一个页面-front.twig.html和page.twig.html,我想创建用于常规Symfony2项目中的phrozn oder,例如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可以做到吗?

Answers:


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


include和传递价值呢?假设我想包含image-formatter并传递urlnull以避免生成链接的图像。
SaidbakR

此答案中提供的示例似乎无效。
arnoldbird '17

3
请注意,@mytheme解析为mytheme+字符串的路径/templates。换句话说,@mytheme解析到mytheme/templates目录。
丹尼尔斯,2017年

为了进一步阐明@daniels的评论。如果您的自定义主题名为mytheme,并且位于'themes / custom / mytheme',则Twig名称空间@mytheme解析为'themes / custom / mytheme / templates'。包括位于模板@mytheme/fragments/footer.html.twig意味着它将解析为“主题/自定义/ mytheme的/模板/片段/ footer.html.twig”
ec0g

15

使用主题目录的完整路径。如果使用名称空间,则必须将代码带到另一个站点或主题,然后才能对其进行更改。

这应该工作:

{% include directory ~ '/templates/parts/footer.html.twig' %}

这在进行次主题设计时非常方便。在“父主题”中进行设置,然后在子主题的模板目录中使用一个版本。
安德鲁·基林

这是唯一对我有用的答案。
arnoldbird '17

5

当文件不存在时,也可以使用Twig对数组的使用来创建后备。

例如。如果footer.html.twig不可用,则将使用defaultfooter.html.twig。

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
结合使用文件名中的变量,可以根据上下文类型包含不同的文件。

Nb:我仍在尝试确定这是否是最佳实践。




1

对于Drupal 8

执行{% include 'FILE_NAME.html.twig' %}Drupal 时,在主题中包含一个树枝文件, Drupal期望您的FILE位于您当前的主题目录中。只需将其放在此处即可使用。

在模块中包含一个树枝文件

如果要将其添加到模块中,则必须在THEME函数中进行声明。在您的.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 /”中。
Verter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.