Symfony2 - Как реализовать частичные / полные шаблоны для загрузки содержимого AJAX в веточку?
В моем веб-приложении Symfony2/twig у меня есть шаблон ветки, который содержит только <div id="#container">...</div>
нет <html></html>
упаковка. Я использую это для вызова ajax, где я встраиваю это в свой макет страницы. Давайте назовем этот макет ajax_template.html.twig
,
<h1>Headline</h1>
{% block my_content %}
<p>My content</p>
{% endblock %}
Теперь у меня есть другой шаблон, который расширит ajax_template.html.twig
, Но эта страница вызывается не через ajax, а напрямую. Так что это также расширит мои base_layout.html.twig
где все <html></html>
упаковка включена. Должно быть что-то вроде:
# won't work because no multiple inheritance supported
{% extends 'MyBundle::base_layout.html.twig' %}
{% extends 'MyBundle:MyController:ajax_template.html.twig' %}
{% block my_content %}
<p>My modified content</p>
{% endblock %}
Уже попробовал пару методов, например include()
или же use()
в моих шаблонах веток. Я также проверил, является ли текущий путь вызовом ajax:
{% if '/ajax/' in path(app.request.attributes.get('_route')) %}
{% extends 'MyBundle::base_layout.html.twig' %}
{% endif %}
Но ни один из моих подходов не работает. Есть ли у вас какие-либо идеи?
1 ответ
Ричард Миллер написал хорошую статью, в которой показан хороший способ реализации частичных шаблонов для использования в AJAX.
Статья называется " Symfony2: Ajax и шаблоны полной страницы".
Позже он опубликовал вторую, более подробную, статью, которая дополнительно охватывает мои предложения под названием " Подробнее о шаблонах AJAX".
Эти две статьи (особенно вторая) содержат подробные примеры реализации того, что вы пытаетесь сделать здесь.
По сути, дело в том, чтобы определить шаблон для расширения из переменной, поскольку вы не можете обернуть...
{% extends '..' %}
... с окружающими {% if %}
-заявление.
рабочий пример
{% set template = 'MyBundle::base_layout.html.twig' %}
{% if '/ajax/' in path(app.request.attributes.get('_route')) %}
{% set template = 'MyBundle:MyController:ajax_template.html.twig' %}
{% endif %}
{% extends template %}
Обратите внимание, что решение, включающее расширение ветки (как описано в вышеупомянутых статьях), может использоваться повторно и, как правило, является лучшей практикой.