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/