在复杂的场景中扩展树枝块

时间:2016-11-23 10:29:10

标签: twig

我们说我有这些树枝模板:

base.twig

{# base.twig #}

<html>
  <head>
    {% include 'head_js.twig' %}
  </head>
  <body>
     {% block content %}{% endblock %}
  </body>
</html>

head_js.twig

{# head_js.twig #}

{% block headJS %}
  <script src='/js/some-script.js'></script>
  {% block headJSExtra %}{% endblock %}
{% endblock %}

page.twig (由控制器加载的那个)

{# page.twig #}

{% extends base.twig %}

{% block content %}
  <p>Widget 1</p>
  {% include 'widget.twig' with { name: 'foo' } %}

  <p>Widget 2</p>
  {% include 'widget.twig' with { name: 'bar' } %}
{% endblock %}

widget.twig

{# widget.twig #}

{% if wigetAlreadyIncluded is not defined %}
  {% block headJSExtra %}
    {{ parent() }}
    <script src='/js/widget.js'></script>
  {% endblock %}

  {% set widgetAlreadyIncluded = true %}
{% endif %}
<p>My name is {{ name }}</p>

此代码无效(无法在widget.twig中使用parent(),因为它没有扩展或使用任何模板),但它应该说明我尝试了什么实现。基本思路是:

  • 为了工作, widget.twig 需要将js库作为标记加载到。
  • 可以在一个页面中多次呈现窗口小部件。
  • 其他小部件也应该能够以这种方式添加自己的标签,但是它们不应该覆盖以前添加的标签(它们应该被追加)。
  • 我不想多次添加页面中找到的任何小部件所需的任何标记。

如何实现这一点的任何想法将不胜感激。我已经阅读了两个与SO相关的问题而根本没有运气。

1 个答案:

答案 0 :(得分:0)

我终于在twig github问题跟踪器中得到了一个很好的答案。 https://github.com/twigphp/Twig/issues/2275