干净地包括宏中内容所需的css / js?

时间:2016-02-29 06:49:11

标签: symfony macros twig bolt-cms

我有一个像这样的页面模板:

{# page.twig #}    
{% import "_widgets.twig" as widgets %}

{% include '_header.twig' %}

<body>
    {{ widgets.fancy_widget(record.items) }}
    {# more content goes here #}
</body>

_header.twig包含<head>标记以及css和javascript的一些块:

{# _header.twig #}
<!DOCTYPE html>

<head>
    {% block javascripts %}
    {% endblock %}

    {% block stylesheets %}
    {% endblock %}
</head>

_widgets.twig包含一个生成一些标记的宏

{# _widgets.twig #}
{% macro fancy_widget(fanciful_items) %}

    {# insert special css and js into <head> only if the macro is used #}
    {% block stylesheets %}
        <link rel="stylesheet" href="css/some_fancy_widget.css">
    {% endblock %}

    {% block javascripts %}
        <script src="js/some_fancy_widget.js"></script>
    {% endblock %}


    {% for item in fanciful_items %}
        {# output some fancy markup #}
    {% endfor %}

{% endmacro %}

如果调用宏,我想要做的是将小部件css / js添加到_header.twig中的块。理想情况下,它们只会添加一次,因此多次调用不会产生额外的<link><script>标记。

这可能吗?或者有更好的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:3)

我会说你没有正确使用Twig。

实际上你的page.twig必须扩展base.html.twig。

{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>{% block title %}Welcome!{% endblock %}</title>
    {% block stylesheets %}{% endblock %}
    <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
</head>
<body>
    {% block body %}{% endblock %}
    {% block javascripts %}{% endblock %}
</body>
</html>

然后您的page.html.twig必须扩展此base.html.twig

您无法在宏中定义或覆盖块。 最简单的方法是:

在page.html.twig中:

{% extends 'base.html.twig' %}
{% import "_widgets.twig" as widgets %}
{% block stylesheets %}
    {{ parent() }}
    <link rel="stylesheet" href="css/some_fancy_widget.css">
{% endblock %}
{% block javascripts %}
    {{ parent() }}
    <script src="js/some_fancy_widget.js"></script>
{% endblock %}
{% block body %}

{% endblock %}

和其余的(你的宏): _widgets.twig:

{# _widgets.twig #}
{% macro fancy_widget(fanciful_items) %}


{% for item in fanciful_items %}
    {# output some fancy markup #}
{% endfor %}

{% endmacro %}