在包含的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我调用它的方式是通过将sidebar
variables传递到视图。 这可以通过使用传递给视图的不同variables进一步扩展,所以你可以selectsidebar1
, sidebar2
等
我得到它用一个非常简单的黑客工作:
基本上它的行为是这样的,因为没有{% extends "foo.html.twig" %}
它不理解块,只是简单地呈现它们。
所以让我们延伸…没有:
{% extends "nothing.html.twig" %}
这没有什么是真正的1块:
# nothing.html.twig {% block main %} {% endblock %}
唯一的事情就是你需要把所有东西都包装在一个块里,这个假的“主”块。