是否有通常“好”的方式来实现此功能?我已经阅读了关于'use'标签,这看起来是目前为止最好的选择,但我仍然不喜欢它不会让我带来任何外部HTML,只有块。
我将使用下面示例中的'include'标记来演示我想要描述的意图。
#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 %}
答案 0 :(得分:54)
我找到了解决方案。使用block()函数获取子块的内容,并将其作为include语句中的变量传递给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 %}
答案 1 :(得分:5)
我找到了一个良好且真实的解决方案,用于 嵌入 标记的documentation。我在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模板中覆盖 block 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模板的正确位置。
在级别思考中,include
的作用类似于子级(已解析),并且所有内容仅在同一级别上覆盖,因此include
不允许在另一个包含中覆盖。相反,embed
模板会被带到相同的级别(未解析),因此您可以覆盖事物。
答案 2 :(得分:1)
可以做到。这是我通过将变量传递给视图来解决问题的方法。
#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
变量传递给视图。这可以通过使用传递给视图的不同变量进一步扩展,因此您可以选择sidebar1
,sidebar2
等。
答案 3 :(得分:0)
我让它用一个非常简单的黑客工作:
基本上它的表现就是这样,因为如果没有{% extends "foo.html.twig" %}
,它就不会理解这些块并简单地将它们渲染到位。
所以,让我们延伸......没有:
{% extends "nothing.html.twig" %}
这没有什么只是一个块:
# nothing.html.twig
{% block main %}
{% endblock %}
唯一的问题是你需要将所有东西都包裹在一个块中,这个假的&#34;主要&#34;块。
答案 4 :(得分:0)
@webberig解决方案的改进,该解决方案修复了在所有扩展模板中未覆盖的块(@HerrNentu的评论):
#base.html.twig
{% if block("page_title") is defined %}
{% include 'elements/header.html.twig' with {page_title: block('page_title')} %}
{% else %}
{% include 'elements/header.html.twig' with {page_title: null} %}
{% endif %}
{% 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 %}