我在阅读embed标签的文档时找到了一个很好且真实的解决方案。我在 Symfony 4 中使用 Twig 2.0。
我的结构
#templates/base.html.twig
{% block navbar %}
<nav>
{% block menu %}
{% include '_menu' %}
{% endblock menu %}
</nav>
{% endblock navbar %}
{% block content %}
{# several blocks defined #}
{% block footer '' %}
{% endblock content %}
#templates/_menu.html.twig
<ul>
{% block sub_app_menu_itens %}
<li>Main App Menu Item</li>
{% endblock sub_app_menu_itens %}
<li>Menu item</li>
<li>Another menu item</li>
<li>Yet another menu item</li>
</ul>
使用上面的代码,当我创建我的index.html.twig时,显示默认内容所需的唯一代码是
#templates/index.html.twig
{% extends 'base.html.twig' %}
并覆盖定义的块。但是,当我需要创建另一个使用这些骨架的页面时,如果我尝试在包含的另一个 _partial 模板中覆盖块 sub_app_menu_itens,则不起作用。<li>Main App Menu Item</li>
总是显示并且从不被覆盖(上面的代码)
#templates/subapp/index.html.twig
{% extends 'base.html.twig' %}
{% block title %}{{ 'agencia.homepage'|trans }}{% endblock %}
{% block menu %}
{% include 'subapp/_menu.html.twig' %}
{% endblock menu %}
{% block user_content %}Content Here{% endblock %}
#templates/subapp/_menu.html.twig
{% extends '_menu.html.twig' %}
{% block sub_app_menu_itens %}
<li>SubApp Menu Item</li>
{% endblock sub_app_menu_itens %}
<li>SubApp Menu Item</li>
从未显示。尝试了很多事情extends
,甚至没有运气的条件。
解决方案
embed标签解决子部分模板块被覆盖。
#templates/subapp/index.html.twig
{% block menu %}
{% embed '_menu.html.twig' %}
{% block sub_app_menu_itens %}
{% include 'subapp/_menu.html.twig' %}
{% endblock sub_app_menu_itens %}
{% endembed %}
{% endblock menu %}
并简化 _partial 模板以仅具有所需的 html
#templates/subapp/_menu.html.twig
<li>SubApp Menu Item</li>
现在<li>SubApp Menu Item</li>
将显示在_menu 模板的正确位置。
在级别上思考,ainclude
像子级别(已解析)一样工作,并且所有事物仅在同一级别上被覆盖,因此include
不允许在另一个包含中覆盖。相反,embed
模板被带到同一级别(未解析),因此您可以覆盖事物。