我有布局模板
<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
答案 0 :(得分:1)
每个模板中的2行允许您在一个模板中重新定义多个块。我无法看到你想要的解决方案是如何做到的。
<html>
<head>
{% block meta %}{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
答案 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>