不使用块

时间:2016-04-27 06:13:31

标签: twig

我有布局模板

<html>
<body>
{% block content %}{% endblock %}
</body>
</html>

许多儿童模板都是这样的

{% extends 'layout/default.twig' %}
{% block content %}
    <p>content</p>
{% endblock %}

非常烦人的是,Twig中的每个子模板必须包含{% block content %}...{% endblock %}以通过父块进行扩展,否则会出现错误:扩展另一个模板的模板不能有正文。

是否有任何解决方案将某个变量中的所有子模板输出(不在任何块中)绑定,然后用它来粘贴父模板?像这样:

布局

<html>
<body>
{{ _context.childOutput }
</body>
</html>

{% extends 'layout/default.twig' %}
<p>content</p>

它将使子模板代码更紧凑,并且不会出现父模板块名称的依赖关系。

UPD 在Twig的GitHub上提交新问题https://github.com/twigphp/Twig/issues/2027

3 个答案:

答案 0 :(得分:1)

每个模板中的2行允许您在一个模板中重新定义多个块。我无法看到你想要的解决方案是如何做到的。

<html>
<head>
{% block meta %}{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

您可以看到includeembed,但如果您的模板中只有一个块,那么twig可能不是您需要的解决方案

答案 1 :(得分:1)

this GitHub issue中看到您在控制器中定义变量时,我有以下想法。我假设子模板只包含静态代码,因为您没有描述这一点。

您可以修改控制器中的功能,以便获取子模板的内容,然后直接将其传递给父模板:

IPlugin

父模板:

function acmeAction()
{
    // …

    return $this->render(
        'AcmeBundle:layout:default.html.twig',
        array(
            'title' => $title,
            'description' => $description,
            'content' => file_get_contents(
                $this->container->get('kernel')->locateResource(
                    '@AcmeBundle/Resources/views/layout/child.html.twig'
                )
            )
        )
    );
}

这样您就不需要在子模板中定义父级。

答案 2 :(得分:0)

您可以在子项中定义一些变量并将其显示在父项中:

布局

<html>
<body>
{{ myValue }
</body>
</html>

{% set myValue %}
    <p>content</p>
{% endset %}
{% include 'layout/default.twig' %}

这是因为:

  

包含的模板可以访问活动上下文的变量。

来源:http://twig.sensiolabs.org/doc/tags/include.html

  

非常烦人的是,Twig中的每个子模板必须包含{% block content %}...{% endblock %}以通过父块扩展

虽然当你只有一个变量时听起来很烦人,但是当你必须同时定义页面标题,JavaScript代码等时,你会发现这种方法的好处。在这种情况下,使用多个{ {1}}非常有用。

见这个例子:

布局

{% block … %}

<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
    {% block javascript %}{% endblock %}
</body>
</html>