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 %}

Обратите внимание, что решение, включающее расширение ветки (как описано в вышеупомянутых статьях), может использоваться повторно и, как правило, является лучшей практикой.

Другие вопросы по тегам