可替代template_from_string,用于通过调用自定义Twig函数来处理字符串



对于包含对自定义Twig函数(或任何其他复杂Twig代码(的调用的字符串,是否有使用template_from_string()的替代方法?

这是我现在拥有的代码的简化版本。

{% set content = {
'item_1' : {
'images' : {
'src': 'assets/images/img_1-600.jpg',
'srcset': "{{ assets('assets/images/img_1-600.jpg') }} 600w, {{ assets('assets/images/img_1-1200.jpg') }} 1200w",
}
}
# additional items follow
}
{% for data in content %}
<img src="{{ data.images.src }}" srcset="{{ include(template_from_string(data.images.srcset)) }}" alt="">
{% endfor %}

assets()函数只是返回给定路径的静态资产的修订版本(即assets('assets/images/img_1-600.jpg)呈现为类似'assets/images/img_1-600-a4c2254a6d.jpg)的东西。

问题始于img srcset属性,该属性可能会变得非常复杂,并且通常包含对多个资产的引用,这些资产需要返回静态资产的修订值。

现在我知道我可以修改assets()函数来支持这种复杂的场景,但我想保持简单,让assets()只处理1:1的转换。

通过使用Twig提供的功能实现这一点的唯一方法似乎是template_from_string((与include相结合,这本身并不可怕,但对于评估和渲染字符串这样的简单操作来说,它确实有点笨重。

更不用说template_from_string默认情况下需要加载StringLoaderExtension(),出于性能原因,我希望再次避免使用它。

虽然串联方法不是一个坏主意,但经过深思熟虑,我得出的结论是,这是拥有自定义Twig函数更有意义的地方之一。

与简单的串联相比,支持使用函数的主要论点是,使用函数无需担心模板代码的正确格式(即,忘记srcset属性值中资产和大小描述符之间的空格(。

这种方法还完全消除了使用template_from_string()或附加扩展依赖项的任何需要。

这是最终的解决方案。

模板代码,简单明了,有很多概述。

{% set content = {
'item_1' : {
'images' : {
'src': 'assets/images/img-600.jpg',
'srcset': srcset([
[ assets('assets/images/img-600.jpg'), '600w' ],
[ assets('assets/images/img-800.jpg'), '800w' ],
[ assets('assets/images/img-1000.jpg'), '1000w' ],
[ assets('assets/images/img-1200.jpg'), '1200w' ]
]),
}
}
# additional items follow
}
{% for data in content %}
<img src="{{ data.images.src }}" srcset="{{ data.images.srcset }}" alt="">
{% endfor %}

实际的Twig函数称为srcset,用于根据上述模板中提供的数据生成srcset属性的值。

public function srcset(array $srcset)
{
$output = [];
foreach ($srcset as $set) {
// Both parameters need to exist or the set isn't added to the output...
if (!(isset($set[0]) && isset($set[1]))) {
// ... just some exception handling that isn't of relevance for the question
// ...
continue;
}
$output[] = sprintf('%s %s', $set[0], $set[1]);
}
return implode(', ', $output);
}

为了避免任何额外的插件,您可以直接连接变量

{% set content = {
'item_1' : {
'images' : {
'src': 'assets/images/img_1-600.jpg',
'srcset': assets('assets/images/img_1-600.jpg')~'  600w,'~assets('assets/images/img_1-1200.jpg')~' 1200w',
}
}
} %}

最新更新