Symfony / Twig:从扩展包中扩展样式表块

时间:2016-01-07 09:42:55

标签: symfony twig

我想从我创建的包中扩展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包含样式表,则文件被正确包含。 所以,似乎有一些突破。

任何人都可以帮助我?

1 个答案:

答案 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.twiglayout.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中删除块标记(但不包括样式表内容本身)。这应该会给你想要的结果。