我在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'];
。
答案 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') }}
请注意,我正在使用辅助变量option
和default
filter。如果没有过滤器,如果Twig_Error_Runtime
数组没有您正在使用的密钥,则会出现server.options_array.options
异常。 (是否获得此例外取决于environment option strict_variables
的值。)