在包含的Twig模板中覆盖块

是否有一个通常“好”的方式来实现这个function? 我已经阅读了有关'使用'标签,这似乎是迄今为止最好的select,但我仍然不喜欢,它不会让我带任何外部的HTML,只有块。

我将在下面的示例中使用“包含”标签来演示我正在描述的意图。

#base.html.twig {% include 'elements/header.html.twig' %} {% block content %}{% endblock %} {% include 'elements/footer.html.twig' %} #header.html.twig <h1>This is my header</h1> {% block page_title %} Default Page Title {% endblock %} #index.html.twig {% extends 'layouts/base.html.twig' %} {# I want to be able to do this somehow #} {% block page_title %} This is my overridden page title {% endblock %} {% block content %} here is the index page content {% endblock %} 

我find了解决scheme。 使用block()函数获取子块的内容,并将其作为include语句中的一个variables传递给header.html.twig:

 #base.html.twig {% include 'elements/header.html.twig' with {page_title: block('page_title')} %} {% block content %}{% endblock %} {% include 'elements/footer.html.twig' %} #header.html.twig <h1>This is my header</h1> {% if page_title is empty %} Default Page Title {% else %} {{ page_title }} {% endif %} #index.html.twig {% extends 'layouts/base.html.twig' %} {% block page_title %} This is my overridden page title {% endblock %} {% block content %} here is the index page content {% endblock %} 

查看embedded标签: http : //twig.sensiolabs.org/doc/tags/embed.html

不能像你想要的那样工作,但是我认为它现在已经很接近了。

可以办到。 这是我的解决scheme,通过传递一个variables到视图。

 #layout.twig {% if sidebar is empty %} This is the default sidebar text. {% else %} {% block sidebar %}{% endblock %} {% endif %} {% block content %}{% endblock %} #index.twig {% extends "layout.twig" %} {% block sidebar %} This is the sidebar. It will override the default text. {% endblock %} {% block content %} This is the content. {% endblock %} #index.php (SlimPHP) $app->render('index.twig', ['sidebar' => true]); 

由于我正在使用SlimPHP我调用它的方式是通过将sidebarvariables传递到视图。 这可以通过使用传递给视图的不同variables进一步扩展,所以你可以selectsidebar1sidebar2

我得到它用一个非常简单的黑客工作:

基本上它的行为是这样的,因为没有{% extends "foo.html.twig" %}它不理解块,只是简单地呈现它们。

所以让我们延伸…没有:

 {% extends "nothing.html.twig" %} 

这没有什么是真正的1块:

 # nothing.html.twig {% block main %} {% endblock %} 

唯一的事情就是你需要把所有东西都包装在一个块里,这个假的“主”块。