php - 在另一个 block 内修改 Twig block

标签 php twig

layout.twig

<main class="main">
    {% block content %}{% endblock content %}
</main>

{% block footer %}{% endblock %}

页面. Twig

{% extends 'layout.twig' %}
{% block content %}
{#abc#}
    {% block footer %}
        {#123#}
    {% endblock footer %}
{% endblock content %}

当我这样做的时候。页脚 block 呈现两次。一旦在内容 block 之后,一旦它应该在的地方

注意:我简化了模板以使其更具可读性。我看到的问题是我不能在另一个 block 内使用 block 。如果我使用它会渲染两次。

我必须在 block 内容中使用页脚。我不想在每个页面中都包含扩展和内容。因为是一样的。我使用类似下面的东西。

        $tm['p'] = "{% extends '" . $layout . "' %}{% block content %}";
        $tm['p'] .= $page;
        $tm['p'] .= "{% endblock content %}";

        $load = new \Twig_Loader_Array($tm);
        $tw = new \Twig_Environment($load);
        print $tw->render("p", $dat);

最佳答案

我认为这是因为您在覆盖一个先前定义的 block 时将其嵌套在另一个先前定义的 block 中。 block 通常用于定义输出元素的位置,因此将页脚放在内容和 where it should be 中是不对的。实际上意味着在内容 block 之后,您在 layout.twig 中定义它的位置,根据您的模板文件,这是正确的位置。如果您需要覆盖页脚,您应该在 page.twig 中的内容 block 之外简单地执行此操作像这样:。

{% extends 'layout.twig' %}

{% block footer %}
    {#123#}
{% endblock footer %}

{% block content %}
    {#abc#}
{% endblock content %}

请注意,page.twig 中覆盖 block 的顺序并不重要,因为您已经在 layout.twig 中做出了相关决定.

看你的例子,我想你想放置 footer里面<main></main>不是 content堵塞。如果是这样,您可能需要修改 layout.twig .一些变化如下:

layout.twig

<main class="main">
    {% block content %}{% endblock content %}

    {% block footer %}{% endblock footer %}
</main>

当您想要设计页面布局和元素的位置,并且以后只更改它们的内容而不是它们的位置时,模板很有用。所以你应该设计你的 layout.twig根据您的需要,如果您需要其他布局,请随时创建一个额外的布局。例如,如果您需要两种布局,一种是在内容内部放置页脚,另一种是在内容外部放置页脚。

关于不重复 extends和 block (content 如您所指):在我看来,删除 extends 不是一个好主意。页面顶部的标记。很好的引用,知道哪个页面模板扩展了哪个布局。而您正在做的是将模板源代码编写为 PHP 字符串。这不是一个好的做法。我建议您考虑将模板保存在单独的文件中,就像您对 layout.twig 所做的那样。和 page.twig并将所有固定内容放入其中。如果您发现自己经常重复某些代码,那么您可能需要重新考虑您的模板结构,因为模板层次结构的主要优点之一是通过重用避免编写通用代码。

关于php - 在另一个 block 内修改 Twig block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45530477/

相关文章:

php - foreach 循环只运行一个

使用消息占位符时 Symfony/Twig 无法正确翻译

javascript - 如何使用 Twig 路径函数将 JavaScript 变量传递给 Symfony 路由

html - twig for 循环将每 2 个元素放入一个新容器中

php - session 超时在 Cakephp 2 中不起作用

php - 如何使用php中下拉列表框中的选定值显示数据库中的特定字段

php - 通过表单提交输入新行后,如何使用 AJAX 刷新数据库表?

php - 仅当姓氏不唯一时才显示名字

symfony - 带 Twig 的自定义表单字段模板

php - Twig,呈现模板并将模板作为电子邮件、CSS 和一些缺少的 img 发送