修改另一个块内的Twig块

3

layout.twig

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

{% block footer %}{% endblock %}

page.twig

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

当我这样做时,页脚块会呈现两次。一次在内容块之后,一次在应该的位置。
注意:为了使模板更易读,我简化了它们。我看到的问题是我不能在另一个块内使用块。如果我使用它,它会呈现两次。
我必须在块内容内使用页脚。我不想在每个页面中都包含扩展和内容。因为它是相同的。我使用像下面这样的东西。
        $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);

您提到了两个块,footerfooterjs,能否请您澄清一下? - Nima
我编辑了这个问题。在简化模板时,我打错了一个字。 - reladawrefurhost
我认为这是不可能的。https://github.com/symfony/symfony/issues/3415 - reladawrefurhost
1
你想要实现什么?将页脚放在其他位置?还是覆盖两个块? - Nima
1个回答

2

我认为这是因为在覆盖一个块时,您将先前定义的块嵌套在另一个先前定义的块中。块通常用于定义输出元素的位置,因此将页脚放置在内容内有点错误,并且“应该在”实际上意味着在内容块之后,在您在layout.twig中定义的地方,根据您的模板文件,那是正确的位置。如果您需要覆盖页脚,则应像这样在page.twig中的内容块外部执行:

{% extends 'layout.twig' %}

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

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

请注意,在page.twig中覆盖块的顺序并不重要,因为您已经在layout.twig中做出了决定。
从您的示例来看,我认为您想将footer放在<main></main>内而不是content块内。如果是这样,您可能需要修改layout.twig。一些类似以下的更改:
<main class="main">
    {% block content %}{% endblock content %}

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

当您想要设计页面布局和元素的位置,并且后期只更改其内容而不更改其位置时,模板非常有用。因此,您应根据自己的需求设计layout.twig,如果需要备选布局,则可以随意创建另一个布局。例如,如果您需要两个布局,一个带页脚在内容内部,另一个带页脚在内容外部。

关于在每个页面中不重复使用extends和块(如您所指出的content):我认为从页面顶部删除extends标签不是一个好主意。它很好地进行参考,以了解哪个页面模板扩展了哪个布局。而您正在做的是将模板源代码编写为PHP字符串。这不是一种好的做法。我建议您考虑像layout.twigpage.twig一样将模板保存在单独的文件中,并将所有固定内容放入其中。如果您发现自己经常重复某些代码,则可能需要重新考虑您的模板结构,因为模板层次结构的主要优点之一是通过重用避免编写常见代码。


我知道我可以像上面那样使用它。但我必须在内容内部使用它。有什么机会吗? - reladawrefurhost
你的目标是什么?是要改变 page.twigfooter 区块的位置吗? - Nima
我不想重复继承和内容块。我已经编辑了我的原始问题。 - reladawrefurhost
我更新了我的回答。我认为你应该考虑一下你的模板结构,并更加熟悉Twig。你错过了一些很好的Twig特性,这些特性将帮助你更轻松地完成工作。 - Nima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接