【问题标题】:Cant override blocks in included twig template无法覆盖包含的树枝模板中的块
【发布时间】:2015-05-19 11:29:35
【问题描述】:

请帮助我理解在 twig 中使用模板继承的正确方法。

我有一个模板 base.html.twig,我的所有其他模板都扩展了它。这包含html、head、body等标签和一些块。

我想将 base.html.twig 模板中的

部分移动到它自己的文件 head.html.twig 中。如果我使用 include 指令,那么该部分中的标题块将不再被扩展模板正确覆盖。

我确定我可以通过将标题设置为扩展模板中的变量并将其传递到我的 include 语句中来解决此问题。但是现在我的页面需要在

部分中加载额外的 javascript,因此我必须添加变量来指示要加载哪些...

显然,这是一个可怕的组合。这样做的正确方法是什么?

编辑:在@goto 的建议下,我尝试用嵌入替换包含。现在我的代码看起来像:

{# base.html.twig #}
<!DOCTYPE html>
<html>
{% embed 'AppBundle::head.html.twig' %}
    {% block title %}My Company Name{% endblock %}
{% endembed %}
<body>
    {% block content %}{% endblock %}
</body>
</html>

{# head.html.twig #}
<head>
    <title>{% block title %}{% endblock %}</title>
    <!-- load other css, js, etc -->
</head>

{# page.html.twig #}
{% extends 'AppBundle::base.html.twig' %}
{% block title %}{{ page.title }} - My Company Name{% endblock %}
{% block content %}
    <h1>{{ page.title }}</h1>
    {{ page.content|raw }}
{% endblock %}

但这不起作用,标题总是“我的公司名称”。

【问题讨论】:

    标签: symfony templates twig


    【解决方案1】:

    找到了解决办法。我需要“使用”标签:

    {# base.html.twig #}
    <!DOCTYPE html>
    <html>
    {% use 'AppBundle::head.html.twig' %}
    {% block head %}
        {{ parent() }}
    {% endblock %}
    <body>
        {% block content %}{% endblock %}
    </body>
    </html>
    
    {# head.html.twig #}
    {% block head %}
        <head>
            <title>{% block title %}My Company Name{% endblock %}</title>
            <!-- load other css, js, etc -->
        </head>
    {% endblock %}
    
    {# page.html.twig #}
    {% extends 'AppBundle::base.html.twig' %}
    {% block title %}{{ page.title }} - My Company Name{% endblock %}
    {% block content %}
        <h1>{{ page.title }}</h1>
        {{ page.content|raw }}
    {% endblock %}
    

    【讨论】:

      【解决方案2】:

      好的,例如你有一个 base.html.twig

      <html>
      <head>
          <title>{% block title %}{% endblock %}</title>
      
          <link rel="shortcut icon" href="{{ Someurl }}">
      
          {% block css %}
           ..... ///some css here
          {% endblock %}
      
          {% block js %}
          ...//javascript goes here
          {% endblock %}
          .......
      

      使用树枝继承,您可以像这样覆盖孩子中的任何这些块:

      child.html.twig

      {% extends ::base.html.twig %}
      {% block js %}
          {{ parent() }}
         .... your new js
      {% endblock %}
      

      使用关键字{{ parent() }},您会将现有数据从基本模板包含到您当前的数据中,没有它您将获得明确的块。

      【讨论】:

      • 感谢您的回复。我的设置稍微复杂一些。请参阅我的编辑示例。
      • @Aaron 阅读了embedhere的例子
      • 谢谢,我已经对该页面进行了相当多的研究,也许我的速度很慢,但我看不出如何在这里使用它。在他们的所有示例中,嵌入标签(以及嵌入的内容)都位于子模板中,该子模板也是重新定义块的位置。在我的示例中,我试图在基本模板中包含 head.html.twig 内容,但标题块是在 page.html.twig 中(重新)定义的。似乎嵌入确实打算进入子模板(page.html.twig),但这显然对我不起作用。我尝试将它添加到基本模板(见上文),但这不起作用。
      【解决方案3】:

      尝试嵌入而不是包含,它允许您重新定义包含部分的内部块:

      {% embed "YourBundle:Acme:_embedded.html.twig" %}
          {% block header%}
              A new header
          {% endblock header%}
          {% block body%}
              A new body
          {% endblock body%}
      {% endembed %}
      

      查看the doc了解更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多