【问题标题】:Symfony2: How to properly include assets in conjunction with Twig template inheritance?Symfony2:如何正确包含资产与 Twig 模板继承?
【发布时间】:2012-09-09 01:50:20
【问题描述】:

我目前正在使用 Symfony 2.1.0 开发一个 Web 应用程序。

我已经通读了本书的Templating chapter,我正在尝试在我的网页中包含资产(目前,它只是一个样式表)。

我使用的是书中提到的Three-level inheritance system,我的应用结构目前是这样的:

  • 应用/资源/视图/
    • base.html.twig: 基本模板,包含 titlestylesheetsbody 块。
  • src/My/PageBundle/Resources/views
    • layout.html.twig: 布局模板(扩展基本模板),将主样式表附加到 stylesheet 块,并覆盖 body 块,包括 navigation.html.twig 和定义一个 content
    • layout-admin.html.twig: 与上面相同,但包括 navigation-admin.html.twig
    • src/My/PageBundle/Resources/views/Main
      • 标准模板,扩展布局模板并覆盖其内容
    • src/My/PageBundle/Resources/views/Administration
      • 管理模板。与上述相同,但扩展了管理布局模板。
  • src/My/PageBundle/Resources/public/css
    • main.css: 主样式表

如您所见,我已将样式表放入我的包中。我不知道这是否是好的做法。

现在,我在 layout.html 中添加了这个:

{% block stylesheets %}
    {{ parent() }}

    <link rel="stylesheet" type="text/css" href="{{ asset('css/main.css)' }}" />
{% endblock %}

asset('css/main.css') 只是链接到/css/main.css,而./app/console assets:install 将资产安装在web/bundles/mypagebundle/ 中。我不喜欢这样,我的包名称会公开可见(这可能会让用户怀疑我正在使用 Symfony,而且我喜欢保留我网页的内部结构,嗯,内部的)。是否可以更改assets:install 将安装资产的目录?在 web/ 中手动安装资产对我来说似乎很乏味。

我也在考虑使用 Assetic 进行资产管理,因为我个人喜欢自动缩小我的脚本/样式表并将它们全部存储在一个文件中的可能性。但是,我听说如果您在不同级别包含样式表,这是不可能的,即它不适用于三级继承系统。有可能解决这个问题吗?另外,使用 Assetic 可以让我对公众隐藏我的捆绑包名称吗?

【问题讨论】:

    标签: php symfony twig assets symfony-2.1


    【解决方案1】:

    使用资产将解决您的所有问题。

    我听说如果您在不同级别包含样式表,这是不可能的,即它不适用于三级继承系统

    可以,但它会为每个级别生成一个 css 文件(实际上就像使用asset())。

    例子:

    布局:

    {% block stylesheets %}
        {{ parent() }}
        {% stylesheets 'main.css' %}
            <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
        {% endstylesheets %}
    {% endblock %}
    

    子模板:

    {% block stylesheets %}
        {{ parent() }}
        {% stylesheets 'sub.css' %}
            <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
        {% endstylesheets %}
    {% endblock %}
    

    结果:

    <link rel="stylesheet" type="text/css" href="..." />
    <link rel="stylesheet" type="text/css" href="..." />
    

    另外,子模板可以完全覆盖样式表块,因此只生成一个样式表(但它不那么枯燥):

    {% block stylesheets %}
        {% stylesheets 'main.css' 'sub.css' %}
            <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
        {% endstylesheets %}
    {% endblock %}
    

    结果(生产/非调试):

    <link rel="stylesheet" type="text/css" href="..." />
    

    【讨论】:

    • 那么不可能让Assetic将所有级别的所有样式表粘合在一起吗?因为使用第二种方法,如果我决定在顶层添加另一个样式表,我将不得不更改所有子模板,对吧?
    • 对。您还可以在 config.yml 中定义“主要”资产(请参阅文档)并引用此资产,而不是直接引用 main.css。这样您就可以更改主要资产,而无需更改所有模板。
    • 谢谢。顺便说一句,我的应用程序结构的其余部分对您来说是一种好的做法,还是我缺少什么?
    • 看起来像通常的结构:)
    • 很高兴知道,谢谢。例如,我不太确定将样式表放在哪里,因为我还无法区分整个应用程序和我的包。如果可以的话,我会投票(但我不能,抱歉)
    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2011-10-20
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多