我想从我创建的包中扩展stylesheets
块以扩展FOSUserBundle
。
This is how to extend from inside the same bundle,但我想扩展另一个扩展第三方软件包的软件包。
这是代码:
{# src/MyNamespace/UserBundle/views/layout.html.twig #}
{% extends '::base.html.twig' %}
{% block stylesheets %}
{{ parent() }}
{% stylesheets filter='scssphp,cssrewrite' output='css/app.css'
'bundles/mynamespace/scss/Profile.scss'
%}
{% endstylesheets %}
{% endblock %}
{% block title %}My title{% endblock %}
{% block body %}
{% block fos_user_content %}{% endblock %}
{% endblock %}
所以,基本上,我已经扩展FOSUserBundle
在我的src
目录as explained here中创建了另一个包。
我的`base.html.twig模板的代码是这样的:
{# app/Resources/views/base.html.twig #}
...
<head>
...
<title>{% block title %}{% endblock %}</title>
<meta name="description" content="{% block metaDescription %}{% endblock %}" />
{% include('::_common/Stylesheets.html.twig') %}
...
这是包含的Stylesheets.html.twig
:
{% block stylesheets %}
{% stylesheets filter='scssphp,cssrewrite' output='css/app.css'
'bundles/app/css/bootstrap.css'
...
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
{% endblock %}
问题是,src/MyNamespace/UserBundle/views/layout.html.twig
中的CSS从未包含在页面中,如果它与app/console asstes:install
一起安装,然后与app/console assetic:dump
一起转储。
生成CSS并将其放入web/css/app_Profile_1.css
但不会包含在页面中(不在主页或其他AppBundle
页面中,而不在MyNamespaceUserBundle
页面中。
同时将行<link rel="stylesheet" href="{{ asset_url }}" />
添加到src/MyNamespace/UserBundle/views/layout.html.twig
块,不包括CSS。
显然,如果直接从_common/Stylesheets.html.twig
包含样式表,则文件被正确包含。
所以,似乎有一些突破。
任何人都可以帮助我?
答案 0 :(得分:1)
如果没有layout.html.twig中<link rel="stylesheet">
中的{% block stylesheets %}
,它就不会输出Profile.scss的链接。
更重要的是,{% include %}
和{% block %}
的效果与{% extends %}
出现时的效果完全不同。这个组合有点奇怪,所以首先是背景。
{% block %}
只是一些内容的命名包装器。在没有{% extends %}
的情况下,会立即输出一个块,并在其中定义。 (好像你定义了一个函数,然后立即调用它。)
然而,当您扩展另一个模板时,&#34;全局范围中的块定义&#34;扩展模板的替换扩展模板中的块的定义。这只是一个重新定义;该块仍然在父模板中的相同位置被调用。
{% include %}
呈现另一个模板,并在线插入评估结果。虽然它可以访问当前上下文的变量,但它本身就是它自己的独立渲染器。重要的是,它不用您期望的模板代码替换它自己。
所以发生了什么:
layout.html.twig
延伸base.html.twig
。 layout.html.twig
定义样式表块(但不发出它)。 base.html.twig
包含Stylesheets.html.twig
,因此base.html.twig
获得了评估Stylesheets.html.twig
的结果(因此您获得了{% stylesheets %}
标记的内容,但重要的是, not事实上,那里甚至还有一个街区。
然后,因为base.html.twig
中没有实际存在{% block stylesheets %}
的地方,layout.html.twig
中定义的块永远不会被调用。
解决方案是将{% block stylesheets %}
移至base.html.twig
。如果您想在Stylesheets.html.twig
中保留实际的样式表定义,那么您可以这样做:
{% block stylesheets %}
{% include('::_common/Stylesheets.html.twig') %}
{% endblock %}
从Stylesheets.html.twig
中删除块标记(但不包括样式表内容本身)。这应该会给你想要的结果。