我在阅读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菜单项</li>
从未显示。尝试了很多东西,如extends
甚至带条件语句都没成功。
解决方案
嵌入标签解决了子部分模板块可以被覆盖的问题。
#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 %}
简化部分模板,仅保留所需的html。
#templates/subapp/_menu.html.twig
<li>SubApp Menu Item</li>
现在,<li>SubApp 菜单项</li>
将会显示在 _menu 模板的正确位置。
从层次思考,include
像是一个子级(被解析的),所有的内容只能在同一级别上覆盖,所以 include
不允许在另一个 include
中进行覆盖。相反,embed
模板则被带到了同一级别(未解析),因此您可以覆盖其中的内容。