Symfony2 Assetic + Twig Template Наследование JavaScript
Моя проблема:
У меня есть 3 шаблона:
-
main.html.twig
(основной файл макета)
-
layout.html.twig
(переопределение макета пакета, содержащее определенные JS-теги).
-
create.html.twig
(файл шаблона страницы, который также содержит определенные JS-теги на странице)
Я определяю блок под названием "javascript" в своем базовом макете (main.html.twig
), затем переопределяя его (но вызываю {{ parent() }}
в layout.html.twig
). Это отлично работает, а теги JS из основного файла шаблона все еще включены выше в шаблоне layout.html.twig
.
Затем я делаю то же самое в файле create.html.twig
, переопределяя блок следующим образом:
{% block javascripts %}
{{ parent() }}
{% javascripts '@BundleName/Resources/public/js/application.album.uploader.js'
'@BundleName/Resources/public/js/jquery.uploadify.js'
'@BundleName/Resources/public/js/swfuploadify.js' filter='?yui_js' %}
<script src='{{ asset_url }}' type='text/javascript'></script>
{% endjavascripts %}
{% endblock %}
В этот момент вместо того, чтобы просто перекрывать блок javascript в родительском (layout.html.twig
) и включающий all скрипты, определенные в шаблонах выше него, он делает следующее:
- Сбрасывает теги
<script>
в середине вывода (что вызывает ошибку, потому что в моем main.html.twig
файле я включаю только библиотеку jQuery в конце разметки HTML
- Затем он также выгружает скрипты вместе с остальными (как я ожидаю)
Я не уверен, что вызывает сброс скриптов в середине шаблона create.html.twig
, и я также смущен тем, почему их дважды выгружают на экран (один раз в середине создайте, а затем один раз внизу, вместе со всеми остальными моими сценариями от main.html.twig
и layout.html.twig
.
Есть ли у кого-нибудь идеи? Дайте мне знать, если что-то неясно или я могу предоставить дополнительную информацию.
ИЗМЕНИТЬ:
Содержимое файла ниже...
main.html.twig: https://gist.github.com/7f29353eaca0947528ce
layout.html.twig: https://gist.github.com/734947e9118b7765715e
create.html.twig: https://gist.github.com/c60c8d5c61e00ff86912
ИЗМЕНИТЬ 2:
У меня сегодня был другой взгляд на проблему, и похоже, что он делает то же самое для таблиц стилей. Я попытался определить новый блок под названием pagescripts
в моем layout.html.twig
, а затем использовать блок в моем create.html.twig
, но это имело тот же результат, он просто сбрасывает сценарии и таблицы стилей везде, где я использую
{% block pagescripts %}
(scripts here)
{% endblock}
Ответы
Ответ 1
Я нашел проблему. В create.html.twig
я определял свой контент {% block javascripts %}
внутри моего {% block content %}
, поэтому я полагаю, что Twig визуализировал вывод блока javascripts
внутри блока content
.
Перемещение содержимого {% block javascripts %}
вне блока {% block content %}
устраняет проблему.
Ответ 2
Вот пример main.html.twig:
<body>
{% block stylesheets %}
{% endblock %}
{% block jsscript %}
{% endblock %}
{% block content %}
{% endblock %}
</body>
в ваш файл create.html.twig
{% extends '::base.html.twig' %}
{% block jsscript %}
my javascript files...
{% endblock %}
{% block content %}
<h1>Create</h1>
<form action="{{ path('entity_create') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<p>
<button type="submit">Create</button>
</p>
</form>
{% endblock %}
Если у вас все еще есть проблема, вы можете добавить функцию готовности документа:
$(document).ready(function() {
// put all your jQuery goodness in here.
});