TWIG - 在不同的模板中包含变量

TWIG - include variables in different template

我想在不同的模板中包含相同的变量

vars_catchphrase.twig

{% set catchphrase_size = '' %}
{% if var.tile_catchphrase|length <= 4 %}
    {% set catchphrase_size = 'size-lg' %}
{% elseif var.tile_catchphrase|length >= 5 and var.tile_catchphrase|length <= 8 %}
    {% set catchphrase_size = 'size-md' %}
{% elseif var.tile_catchphrase|length >= 9 and var.tile_catchphrase|length <= 12 %}
    {% set catchphrase_size = 'size-sm' %}
{% elseif var.tile_catchphrase|length >= 13 %}
    {% set catchphrase_size = 'size-xs' %}
{% endif %}

我试图将其包括在内(因为上下文有时不同):

{% include 'vars_catchphrase.twig' with { 'var' : post } %}

当上下文与 post 不同时,我使用另一个:

{% include 'vars_catchphrase.twig' with { 'var' : item } %} 

example.twig

{% for item in list %}
    {% include 'vars_catchphrase.twig' with { 'var' : item } %}

    <p class="catchphrase {{ catchphrase_size }}">{{ item.title }}</p>
{% endfor %}

变量为空。我可以帮忙吗?

您包含的模板有自己的变量作用域,这意味着在该模板内定义的变量在模板之外是未知的。这就是说,包含的模板也不能改变父级的上下文(默认情况下),这是由于 twig 按值而不是引用传递上下文数组。

foo.twig

{% set foo = 'foo' %}
{% include 'bar.twig' %}
{{ foo }}

bar.twig

{% set foo = 'bar' %}

上面的example还是会输出foo


为了解决您的问题,我建议将自定义过滤器添加到 twig

<?php
    $twig->addFilter(new \Twig\TwigFilter('catchphrase_size', function($value) {
        switch(true) {
            case strlen($value->tile_catchphrase) >= 13: return 'size-xs';
            case strlen($value->tile_catchphrase) >= 9: return 'size-sm';
            case strlen($value->tile_catchphrase) >= 5: return 'size-md';
            default: return 'size-lg';
        }
    });

这样你就可以随时随地使用过滤器了,

{% for item in list %}
    <p class="catchphrase {{ item|catchphrase_size }}">{{ item.title }}</p>
{% endfor %}