标记'使用'树枝模板系统重复内容

时间:2015-02-19 23:31:27

标签: html symfony inheritance twig template-engine

使用sf2.6.4和Twig模板系统,标签使用'我有一种奇怪的行为。

使用简单的基本模板定义默认导航栏和标题内容:

{# base.html.twig #}
<html lang="fr">
  <head></head>
  <body>

    {%  block navbar %}<hr> nav bar foo bar<hr>{% endblock %}

    <!-- a default header -->
    {% block header %}
        {%  include 'AppBundle:TestingTwigUse:header.html.twig' %}
    {% endblock %}

  </body>

使用给定的默认header.html.twig模板:

{#  header.html.twig  #}
{% block header_container %}
  {% block header_title %}&lt;h1>Default title</h1>{% endblock %}
  {% block header_content %}
    <div>
        This default text header, blablabla...
    </div>
  {% endblock %}
{% endblock %}

当我尝试构建索引模板时,继承基本模板并使用&#39;覆盖标题内容。使用&#39;标记如下:

{# index.html.twig #}
{% extends "AppBundle:TestingTwigUse:base.html.twig" %}

{% block header %}
    {% use 'AppBundle:TestingTwigUse:header.html.twig' %}
    {% block header_container %}
        {{ parent() }}
        {% block header_content %}
            ***** child template specific content ****
        {% endblock %}
    {% endblock %}
{% endblock %}

我对header_content块有两次奇怪的结果:

    ***** child template specific content **** ***** child template specific content ****

任何想法?

2 个答案:

答案 0 :(得分:1)

我认为问题是你有两个header_content阻止 - 一个在index.twig.html,第二个在parent()来电。第二个定义首先覆盖,在编译后会导致重复。

如果您要覆盖默认文字,则应删除parent()电话。如果要更新(追加)默认文本 - 您应该重构块结构以避免使用相同的名称。

UPD 请尝试以下索引

{# index.html.twig #}
{% extends "AppBundle:TestingTwigUse:base.html.twig" %}

{% block header_content %}
     ***** child template specific content ****
{% endblock %}

UPD 2 检查此solution

  

我找到了解决方案。使用block()函数获取子块   内容并将其作为include中的变量传递给header.html.twig   声明

答案 1 :(得分:0)

最终有两个解决方案:

使用'use',我们可以获得我们想要保留的部分,但却失去了继承:

{% block header %}
    {% use 'AppBundle:TestingTwigUse:header.html.twig' with header_title as parent_header_title %}
    {% block header_title %}
        {{ block('parent_header_title') }}
    {% endblock %}
    ***** child template specific content ****
{% endblock %}

结合了包含AND扩展行为的'embeb':

{% block header %}
    {% embed 'AppBundle:TestingTwigUse:header.html.twig'  %}
       {%  block header_content %}
       ***** child template specific content ****
       {% endblock %}
    {% endembed %}
{% endblock %}