将Smarty 3模板转换为Twig 2,几个问题

时间:2018-02-13 16:51:57

标签: twig smarty

我正在将一些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}

任何想法如何在模板中制作“功能”,可以使用模板中稍后发送给它们的“变量”?

1 个答案:

答案 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>

See TwigFiddle

来自documentation的一些说明:

  • 默认参数值是使用宏体<{li>中的default filter定义的
  • 宏可以在任何模板中定义,需要在使用之前“导入”
  • 要从当前文件导入宏,请使用特殊的_self变量作为源(这在documentation of the import tag中说明)

另请注意,我在control whitespace的战略位置使用了{%--%}(而不只是{%%}),因此生成的HTML看起来很像清洁剂。

您可以稍微更改import语句,以便在调用宏时可以省略macros.前缀:

{% from _self import editform, delform %}

{{ editform(k, val) }}
{{ delform(k, val) }}