1

在我的 Symfony2/twig webapp 中,我有一个 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调用的,而是直接调用的。所以它也应该扩展 my 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 %}

但我的方法都不起作用。你有什么想法?

4

1 回答 1

4

Richard Miller写了一篇不错的文章,展示了一种为 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 %}

请注意,涉及树枝扩展的解决方案(如上述文章中所述)是可重复使用的,通常是更好的做法。

于 2013-11-26T18:17:12.747 回答