将 Smarty 3 模板转换为 Twig 2,几个问题
Converting Smarty 3 templates to Twig 2, a few questions
我正在将一些 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}
知道如何在模板中制作 'functions' 以便稍后在模板中发送给他们的 'variables' 吗?
您可以创建 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定义的
- 宏可以在任何模板中定义,需要"imported"才能使用
- 要从当前文件导入宏,请使用特殊的
_self
源变量(这在 documentation of the import
tag 中有说明)
另请注意,我在 control whitespace 的战略位置使用了 {%-
和 -%}
(而不仅仅是 {%
和 %}
),以便生成HTML 看起来更干净。
您可以稍微更改 import
语句,以便在调用宏时可以省略 macros.
前缀:
{% from _self import editform, delform %}
{{ editform(k, val) }}
{{ delform(k, val) }}
我正在将一些 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}
知道如何在模板中制作 'functions' 以便稍后在模板中发送给他们的 'variables' 吗?
您可以创建 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定义的 - 宏可以在任何模板中定义,需要"imported"才能使用
- 要从当前文件导入宏,请使用特殊的
_self
源变量(这在 documentation of theimport
tag 中有说明)
另请注意,我在 control whitespace 的战略位置使用了 {%-
和 -%}
(而不仅仅是 {%
和 %}
),以便生成HTML 看起来更干净。
您可以稍微更改 import
语句,以便在调用宏时可以省略 macros.
前缀:
{% from _self import editform, delform %}
{{ editform(k, val) }}
{{ delform(k, val) }}