问题描述
我想通过将模板文字作为变量传递到树枝 {% 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
解决方法
您可以像函数一样创建宏(将操作),参见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,rows = 10,cols = 40) %}
<textarea name="{{ name }}" rows="{{ rows }}" cols="{{ cols }}">{{ value|e }}</textarea>
{% endmacro %}
在上面的示例中,您可以看到将宏括在 macro
和 endmacro
语句之间。 macro
语句采用您定义的一些参数,如果需要,可以使用默认值。你可以像函数一样调用它们,例子:
<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password',null,'password') }}</p>
所有示例均取自本答案开头链接的来源。您需要将参数化的包含放入一些宏中。理想情况下,您可以将参数化包含分离到一个单独的文件中,您可以在其中实现多个这种类型的宏,将其导入并使用您需要的参数在需要的地方调用宏。