【问题标题】:Converting Smarty 3 to Twig 2 using blocks使用块将 Smarty 3 转换为 Twig 2
【发布时间】:2018-02-13 19:23:56
【问题描述】:

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

在我的 Smarty 模板中,我的代码相当于下面的树枝代码,它根据设置的“显示”有条件地设置“标题”块。我在下面插入的模板代码不起作用,它给出了一个错误,指出标题块已经定义。我做了一些研究,发现这不适用于 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 中执行此操作的“正确”方法是什么?

再次感谢

【问题讨论】:

    标签: php twig


    【解决方案1】:

    是的,你不能多次定义同一个块,即使它们在不同的逻辑分支中。

    这两个都有效:

    {% 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 %} 标记中?

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

    【讨论】:

    • 哦,废话,我们的 smarty 模板中有很多块之外的东西。哎呀。
    • 至少在 Twig 中是没有意义的。块外的代码会去哪里?
    • 我最终纠正了这个问题,只是使用 {% set %} 来设置标题而不是使用块,因为在大多数情况下,标题实际上就是小部件的“标题”。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2020-02-16
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多