粒子(Particle)块

有时您只想加载CSS或JavaScript资源,而不会将它们显示在页面的底部。粒子(Particle)集成了对JavaScript和样式表的支持,即使粒子(Particle)本身不是原子。除了访问CSS和JavaScript元素之外,您基本上可以拥有包含标准粒子(Particle)内容的单个粒子(Particle)。

这是将JavaScript和样式表块嵌入页面的特定部分的一种非常有用的方法。

在一个粒子(Particle)中加载的资源只加载一次。如果您在一个粒子(Particle)中调用特定的JavaScript文件,则在另一个粒子(Particle)中这样做将不会对页面产生额外的影响。它只会加载一次。

粒子模板

在本指南中,我们将介绍出现在粒子(Particle)中的不同类型的块,以及如何使用它们从粒子(Particle)向页面添加元素,而不是将它们加载到页面模板中。

以下是一个示例文件,演示了您可以在粒子(Particle)中使用的不同块。

{% extends '@nucleus/partials/particle.html.twig' %}

{% block stylesheets %}
    {{ parent() }}
    {# any stylesheet you would like to render in <head> #}
{% endblock %}

{% block javascript %}
    {{ parent() }}
    {# any javascript you would like to render in <head> #}
{% endblock %}

{% block javascript_footer %}
    {{ parent() }}
    {# any javascript you would like to render before </body> #}
{% endblock %}

{% block particle %}
    {# particle output goes here #}
{% endblock %}

添加一个JavaScript块

给你的粒子(Particle)添加一个JavaScript块非常简单。在你的particle的twig文件中,你只需要创建一个JavaScript块并包含加载你的特定JavaScript资源的必要信息。以下是在标准粒子(Particle)中使用的JavaScript块的示例:

{% block javascript %}
    {{ parent() }}
    <script src="{{ url('gantry-theme://js/filename.js') }}"></script>
{% endblock %}

您可以将块放置在样式表或粒子(Particle)块之外,或者将它们环绕在这些其他元素(或其中的一部分)上以将JavaScript属性应用于它们。如果你想要在JavaScript之前加载JavaScript资源body页面的标签,你会交换 block javascript 同 block javascript_footer。

下面是一个用于真实应用程序的JavaScript代码块示例。在这种情况下,这是analytics.html.twig用于创建Gantry的Google Analytics原子的文件。

{% extends '@nucleus/partials/particle.html.twig' %}

{% block javascript %}
    {{ parent() }}
    {% if particle.ua.code  %}
        <script>
            (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
            (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
            }){% if particle.ua.debug %}(window,document,'script','//www.google-analytics.com/analytics_debug.js','ga');{% else %}(window,document,'script','//www.google-analytics.com/analytics.js','ga');{% endif %}
            ga('create', '{{ particle.ua.code }}', 'auto');
        {% if particle.ua.anonym  %}
            ga('set', 'anonymizeIp', true);
        {% endif %}
        {% if particle.ua.ssl  %}
            ga('set', 'forceSSL', true);
        {% endif %}
            ga('send', 'pageview');
        </script>
    {% endif %}
{% endblock %}

添加样式表块

添加样式表块与JavaScript或粒子(Particle)块的工作方式非常相似。这是一个例子:

{% block stylesheets %}
    <link rel="stylesheet" href="{{ somelocation }}" type="text/css"/>
{% endblock %}

将样式表块与JavaScript块结合起来非常简单。实际上,我们使用这种方法通过单个粒子(Particle)加载JavaScript和CSS资源。这里是一个真实例子的应用程序assets.html.twig创建自定义CSS / JS原子的文件。

{% extends '@nucleus/partials/particle.html.twig' %}

{% block stylesheets %}
    {% for css in particle.css %}
        {% set attr_extra = '' %}
        {% if css.extra %}
            {% for attributes in css.extra %}
                {% for key, value in attributes %}
                    {% set attr_extra = attr_extra ~ ' ' ~ key|e ~ '="' ~ value|e('html_attr') ~ '"' %}
                {% endfor %}
            {% endfor %}
        {% endif %}

        <link rel="stylesheet" href="{{ url(css.location) }}" type="text/css"{{ attr_extra|raw }} />
    {% endfor %}
{% endblock %}

{% block javascript %}
    {% for script in particle.javascript %}
        {% set attr_extra = '' %}
        {% if script.extra %}
            {% for attributes in script.extra %}
                {% for key, value in attributes %}
                    {% set attr_extra = attr_extra ~ ' ' ~ key|e ~ '="' ~ value|e('html_attr') ~ '"' %}
                {% endfor %}
            {% endfor %}
        {% endif %}

        <script src="{{ url(script.location) }}" type="text/javascript"{{ attr_extra|raw }}></script>
    {% endfor %}
{% endblock %}

粒子(Particle)块

为了提供一个真实的例子:这里看看 branding.html.twig文件组成品牌粒子(Particle)。

{% extends '@nucleus/partials/particle.html.twig' %}

{% block particle %}
<div class="g-branding {{ particle.css.class }}">
    {{ particle.content|raw }}
</div>
{% endblock %}