我正在将一些Smarty 3模板转换为Twig,只是为了熟悉Twig,因为看起来Smarty 3的维护很少(安全问题在发行版中没有修复)。
在某些Smarty模板中有一些不同的东西,我还没有弄清楚如何处理Twig:
这只是让我们从循环中抽象出实际的表单代码,这样如果有人需要编辑表单,他们就不必进入循环并弄乱它。
{function editform zoneid='' zonename=''}
...html stuff that uses zoneid and zonename
{/function}
{function delform zoneid='' zonename=''}
...html stuff that uses zoneid and zonename
{/function}
{foreach from=$zn_array key=k item=val}
<tr><td>{val}</td><td>{editform zoneid=$k zonename=$val}</td><td>{delform zoneid=$k zonename=$val}</td></tr>
{/foreach}
任何想法如何在模板中制作“功能”,可以使用模板中稍后发送给它们的“变量”?
答案 0 :(得分:0)
您可以创建macros:
{% macro editform(zoneid, zonename) -%}
Calling editform, zoneid is {{ zoneid|default('') }} and zonename is {{ zonename|default('') }}.
{%- endmacro %}
{% macro delform(zoneid, zonename) -%}
Calling delform, zoneid is {{ zoneid|default('') }} and zonename is {{ zonename|default('') }}.
{%- endmacro %}
{% import _self as macros %}
{% for k, val in zn_array %}
<tr>
<td>{{ val }}</td>
<td>{{ macros.editform(k, val) }}</td>
<td>{{ macros.delform(k, val) }}</td>
</tr>
{% endfor %}
当zn_array
为['first', 'second', 'third']
时,上面会产生这个:
<tr>
<td>first</td>
<td>Calling editform, zoneid is 0 and zonename is first.</td>
<td>Calling delform, zoneid is 0 and zonename is first.</td>
</tr>
<tr>
<td>second</td>
<td>Calling editform, zoneid is 1 and zonename is second.</td>
<td>Calling delform, zoneid is 1 and zonename is second.</td>
</tr>
<tr>
<td>third</td>
<td>Calling editform, zoneid is 2 and zonename is third.</td>
<td>Calling delform, zoneid is 2 and zonename is third.</td>
</tr>
来自documentation的一些说明:
default
filter定义的
_self
变量作为源(这在documentation of the import
tag中说明)另请注意,我在control whitespace的战略位置使用了{%-
和-%}
(而不只是{%
和%}
),因此生成的HTML看起来很像清洁剂。
您可以稍微更改import
语句,以便在调用宏时可以省略macros.
前缀:
{% from _self import editform, delform %}
{{ editform(k, val) }}
{{ delform(k, val) }}