如何在Twig中编写循环实现动态变量赋值与Token字符串拼接?
解决Twig模板中评审人字段的DRY重构问题
你遇到的核心问题是动态Token字符串拼接和变量处理的写法错误,下面直接给你正确的实现方案:
原重复代码示例(不符合DRY)
{% set reviewer_0 = webform_token('[webform_submission:values:reviewer_0]', webform_submission) %} {% if reviewer_0 %} <div>{{ reviewer_0 }}</div> {% endif %} {% set reviewer_1 = webform_token('[webform_submission:values:reviewer_1]', webform_submission) %} {% if reviewer_1 %} <div>{{ reviewer_1 }}</div> {% endif %} {% set reviewer_2 = webform_token('[webform_submission:values:reviewer_2]', webform_submission) %} {% if reviewer_2 %} <div>{{ reviewer_2 }}</div> {% endif %}
错误循环写法(问题出在动态变量名和Token拼接)
{# 错误:这里的reviewer_i是固定变量名,不是动态生成的reviewer_0/1/2 #} {% for i in 0..2 %} {% set reviewer_i = webform_token('[webform_submission:values:reviewer_' ~ i ~ ']', webform_submission) %} {% if reviewer_i %} <div>{{ reviewer_i }}</div> {% endif %} {% endfor %}
正确的循环实现
方案1:基于webform_token的写法
直接在循环内拼接Token字符串,用临时变量存储当前评审人值即可,不需要动态变量名:
{% for i in 0..2 %} {% set reviewer = webform_token('[webform_submission:values:reviewer_' ~ i ~ ']', webform_submission) %} {% if reviewer %} <div>{{ reviewer }}</div> {% endif %} {% endfor %}
方案2:直接访问提交数据(更高效)
如果可以直接访问webform_submission的values属性,跳过token解析会更高效:
{% for i in 0..2 %} {# 使用空合并运算符处理字段不存在的情况 #} {% set reviewer = webform_submission.values['reviewer_' ~ i] ?? null %} {% if reviewer %} <div>{{ reviewer }}</div> {% endif %} {% endfor %}
关键说明
你之前的错误在于试图创建reviewer_0这类带索引的动态变量名,但Twig中reviewer_i会被识别为固定变量名,而非动态生成的名称。实际上完全不需要这类命名的变量,循环内的临时变量reviewer在每次迭代中都会存储当前索引对应的值,既简洁又符合DRY原则。
内容的提问来源于stack exchange,提问作者esod
相关产品推荐
相关产品推荐

