使用块将Smarty 3转换为Twig 2

时间:2018-02-13 19:23:57

标签: php twig

希望这将是我最后的困惑点。

在我的Smarty模板中,我有什么等同于下面的树枝代码,它根据设置的'show'有条件地设置'heading'块。我在下面插入的模板代码不起作用,它给出了一个错误,说明已经定义了标题块。我做了一些研究,我发现这不适用于Twig,我想是因为它在检查if语句之前编译它对我来说完全反直觉但我没有创建Twig。 =)

{% if show is defined %}
        {% if show == 'add_form' %}
            {% block heading %}Add{% endblock %}
        {% elseif show == 'main' %}
            {% block heading %}Main{% endblock %}
 {% endif %}

我只在模板中使用这种风格,其中有一堆非常微小的视图(实际上是2-3行HTML),所以我想我可以为每个模板制作单独的模板文件,但这看起来像一吨额外的文件。 在Twig中这样做的“正确”方法是什么?

再次感谢

1 个答案:

答案 0 :(得分:0)

是的,即使它们位于不同的逻辑分支中,也无法多次定义同一个块。

这两种方法都有效:

{% if show is defined %}
    {% block heading %}
        {% if show == 'add_form' %}
            Add
        {% elseif show == 'main' %}
            Main
        {% endif %}
    {% endblock %}
{% endif %}
{% block heading %}
    {% if show is defined %}
        {% if show == 'add_form' %}
            Add
        {% elseif show == 'main' %}
            Main
        {% endif %}
    {% endif %}
{% endblock %}

See TwigFiddle

我认为第二个更清晰(至少在这种情况下),因为扩展另一个模板的模板不能包含Twig块之外的内容。这意味着如果你尝试做这样的事情:

{% extends 'layout.twig' %}

{% block heading %}
    Some content
{% endblock %}

Hello world!

您将收到此消息的Twig_Error_Syntax异常:

  

扩展另一个模板的模板不能包含Twig块之外的内容。您是否忘记将内容放在{% block %}标记内?

因此,如果将所有代码放在块中,模板将保持清晰。