2016-11-23 2 views
0

Скажем, у меня есть эти шаблоны хворостины:Расширение хворостины блоков в сложном сценарии

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, как это не расширение или с помощью какой-либо шаблон), но он должен иллюстрируют то, что я пытаюсь достичь. Основная идея заключается в том:

  • Для того, чтобы работать, widget.twig требует библиотека JS для загрузки в качестве тега в.
  • Виджет может отображаться несколько раз на одной странице.
  • Другие виджеты должны также иметь возможность добавлять свои собственные теги таким образом, но они не должны переопределять предыдущие добавленные теги (они должны быть добавлены).
  • Я не хочу добавлять несколько раз тег, который требуется для любого виджета, найденного на странице.

Любые идеи о том, как я могу достичь этого, будут очень признательны. Я прочитал два связанных с ним вопроса без всякой удачи.

ответ

Смежные вопросы