在包含的 Twig 模板中覆盖块

2022-01-22 00:00:00 php twig

是否有一般好"的方法来实现此功能?我已经阅读了使用"标签,这似乎是迄今为止最好的选择,但我仍然不喜欢它不会让我引入任何外部 html,只有块.

Is there a generally "good" way to achieve this functionality? I have read about the 'use' tag, which seems like the best option so far, but I still don't like that it wont let me bring in any outside html, only blocks.

我将在下面的示例中使用包含"标签来演示我试图描述的意图.

I will use the 'include' tag in the example below to demonstrate the intent I'm trying to describe.

#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 %}

推荐答案

我找到了解决方案.使用block()函数获取child的block内容,并在include语句中作为变量传递给header.html.twig:

I found a solution. Use the block() function to get the child's block content and pass it to header.html.twig as a variable in the include statement:

#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 %}

相关文章