将 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>

See TwigFiddle


来自 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) }}