Twig访问需要变量扩展的变量

时间:2018-02-14 18:12:58

标签: php twig

我在Twig模板中有以下代码:

       {% macro option_display(type) -%}
    {% if server.options_array.options.{{type}}.name is defined %}
        {{server.options_array.options.{{type}}.name}} +${{server.options_array.options.~type~.price}}
    {%else%}
        None
    {% endif %}
{%- endmacro %}

我收到此错误:

  

Twig_Error_Syntax:预期的名称或号码

如何让它扩展变量'输入'在那种情况下?我也尝试过使用~type~concat)。

类似于PHP中的$server['options_array']['options'][$type]['name'];

1 个答案:

答案 0 :(得分:0)

只需使用括号表示法:

{% macro option_display(type) -%}
    {% if server.options_array.options[type].name is defined %}
        {{ server.options_array.options[type].name }} +${{ server.options_array.options[type].price }}
    {% else %}
        None
    {% endif %}
{%- endmacro %}

在检查server.options_array.options[type]是否已定义之前,您可能还想检查是否已定义server.options_array.options[type].name

此外,就像documentation of the macro tag所说的那样,“与PHP函数一样,宏无法访问当前模板变量。”因此,您可能还需要将server变量传递给宏。

所以这是一个更完整的例子:

{% macro option_display(server, type) -%}
    {% set option = server.options_array.options[type]|default(null) %}
    {% if option.name is defined %}
        {{ option.name }} +${{ option.price }}
    {% else %}
        None
    {% endif %}
{%- endmacro %}

{% from _self import option_display %}

{{ option_display(server, 'foo') }}
{{ option_display(server, 'bar') }}

请注意,我正在使用辅助变量optiondefault filter。如果没有过滤器,如果Twig_Error_Runtime数组没有您正在使用的密钥,则会出现server.options_array.options异常。 (是否获得此例外取决于environment option strict_variables的值。)

See TwigFiddle