首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩展没有块的Twig模板

扩展没有块的Twig模板
EN

Stack Overflow用户
提问于 2016-04-27 06:13:31
回答 3查看 1.2K关注 0票数 1

我有布局模板

代码语言:javascript
运行
复制
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>

很多子模板都是这样的

代码语言:javascript
运行
复制
{% extends 'layout/default.twig' %}
{% block content %}
    <p>content</p>
{% endblock %}

非常恼人的是,Twig中的每个子模板都必须包含由父块扩展的{% block content %}...{% endblock %},否则会出现错误:--扩展另一个模板的模板不能有一个主体。

是否有任何解决方案将某个变量中的所有子模板输出(不位于任何块中)绑定,然后使用它粘贴到父模板中?如下所示:

布局

代码语言:javascript
运行
复制
<html>
<body>
{{ _context.childOutput }
</body>
</html>

孩子

代码语言:javascript
运行
复制
{% extends 'layout/default.twig' %}
<p>content</p>

它将使子模板代码更加紧凑,并且不存在来自父模板块名称的依赖。

UPD在Twig's GitHub https://github.com/twigphp/Twig/issues/2027上提交了新一期

EN

回答 3

Stack Overflow用户

发布于 2016-04-27 08:28:08

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

代码语言:javascript
运行
复制
<html>
<head>
{% block meta %}{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

您可以看到包括嵌入,但是如果模板中只有一个块,那么小枝可能不是您需要的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2016-04-28 11:59:43

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

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

代码语言:javascript
运行
复制
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'
                )
            )
        )
    );
}

以及父模板:

代码语言:javascript
运行
复制
<head>
    <title>{% block title %}{{ title }}{% endblock %}</title>
    <meta name="description" content="{% block description %}{{ description }}{% endblock %}" />
</head>
<body>
    {% block body %}{{ content }}{% endblock %}
</body>

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

票数 1
EN

Stack Overflow用户

发布于 2016-04-27 15:24:30

您可以在子变量中定义一些变量,并将它们显示在父变量中:

布局

代码语言:javascript
运行
复制
<html>
<body>
{{ myValue }
</body>
</html>

孩子

代码语言:javascript
运行
复制
{% set myValue %}
    <p>content</p>
{% endset %}
{% include 'layout/default.twig' %}

这样做是因为:

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

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

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

当您只有一个变量时,它可能听起来很烦人,但是当您还必须定义页面的标题、JavaScript代码等时,您将看到这种方法的好处。在这种情况下,使用多个{% block … %}是非常有用的。

参见此示例:

布局

代码语言:javascript
运行
复制
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
    {% block javascript %}{% endblock %}
</body>
</html>

孩子

代码语言:javascript
运行
复制
{% extends 'layout/default.twig' %}

{% block title %}
    My title
{% endblock %}

{% block content %}
    <p>content</p>
{% endblock %}

{% block javascript %}
    <script>…</script>
{% endblock %}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36881696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档