我阅读了embed标签的文档,找到了一个不错的解决方案。 我在Symfony 4中使用Twig 2.0。
我的结构
#templates/base.html.twig
{% block navbar %}
{% block menu %}
{% include '_menu' %}
{% endblock menu %}
{% endblock navbar %}
{% block content %}
{# several blocks defined #}
{% block footer '' %}
{% endblock content %}
#templates/_menu.html.twig
{% block sub_app_menu_itens %}
Main App Menu Item{% endblock sub_app_menu_itens %}
Menu itemAnother menu itemYet another menu item使用上面的代码,当我创建index.html.twig时,显示默认内容所需的唯一代码是
#templates/index.html.twig
{% extends 'base.html.twig' %}
并覆盖已定义的块。但是,当我需要创建另一个使用这些骨架的页面时,如果我尝试覆盖包含的另一个_partial模板中的块sub_app_menu_itens,将无法正常工作。
Main App Menu Item始终显示且永不覆盖(上面的代码)#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 %}
SubApp Menu Item{% endblock sub_app_menu_itens %}
从未显示include。 尝试了很多东西,例如include,甚至没有条件的有条件限制。
解决方案
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 %}
并简化部分模板以仅具有所需的html
#templates/subapp/_menu.html.twig
SubApp Menu Item现在include将显示在_menu模板的正确位置。
从级别上考虑,include的工作方式类似于子级别(已解析),并且所有内容都只能在同一级别上覆盖,因此include不允许在其他包含中覆盖。 而是将embed模板带到同一级别(未解析),因此您可以覆盖内容。