将模板文字传递给包含

时间:2021-05-06 09:22:15

标签: twig craftcms

我想通过将模板文字作为变量传递到树枝 {% includes 'X' %} 中来创建 DRY 代码,以便它们可以在包含代码中使用(下面的示例)。

我已经看到您可以将变量传递给包含,如下所示:

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

但由于我的代码将在同一页面上多次使用相同的包含模板,因此我需要在此处进行更多自定义。

我想要做的理想是在调用 includes 时设置可行,并将其回显到模板中,例如:

在页面文件中:

{% set contact_img = 'path to image location' %}
{% include "/IMPORT/Specific/full_page_img_bg" with contact_img %}

在模板中

{% set transformed_{{ VARIABLE NAME PASSED HERE }} = craft.imager.transformImage({{ VARIABLE NAME PASSED HERE }}_for_transform, [
  { width: 2000, jpegQuality: 89 },
  { width: 1300, jpegQuality: 84 },
  { width: 750, jpegQuality: 82 },
  { width: 500, jpegQuality: 80 },
], { allowUpscale: false, mode: 'fit'}) %}

<img sizes="
  (max-width: 500px) 500px,
  (max-width: 750px) 750px,
  (max-width: 1280px) 1300px,
  2000px"
  srcset="{{ craft.imager.srcset(transformed_{{ VARIABLE NAME PASSED HERE }}) }}"
  alt="{{ {{ VARIABLE NAME PASSED HERE }}.title }}" 
  class="full-background-image"/>
<div class="full-gradient"></div>

基本上就像在 JS 中如何设置函数参数并将该参数输出到函数,但是您可以使用不同的参数多次调用该函数,即

function callName(name) {
console.log(name)
}

callName('DEV-BOY')
#DEV-BOY
callName('BOY-BE_DEV')
#BOY-VE_DEV

随时提出任何问题,我相信一定有办法做到这一点, 提前致谢 - W

1 个答案:

答案 0 :(得分:1)

您可以像函数一样创建宏(将操作),参见https://twig.symfony.com/doc/2.x/tags/macro.html

示例:

{% macro input(name, value, type = "text", size = 20) %}
    <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}"/>
{% endmacro %}

{% macro textarea(name, value, rows = 10, cols = 40) %}
    <textarea name="{{ name }}" rows="{{ rows }}" cols="{{ cols }}">{{ value|e }}</textarea>
{% endmacro %}

在上面的示例中,您可以看到将宏括在 macroendmacro 语句之间。 macro 语句采用您定义的一些参数,如果需要,可以使用默认值。你可以像函数一样调用它们,例子:

<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>

所有示例均取自本答案开头链接的来源。您需要将参数化的包含放入一些宏中。理想情况下,您可以将参数化包含分离到一个单独的文件中,您可以在其中实现多个这种类型的宏,将其导入并使用您需要的参数在需要的地方调用宏。

相关问题