是否可以跨模块和模板共享 HubL 宏?

Is it possible to share HubL macros across modules and templates?

在 HubSpot CMS 中,您可以像这样创建一个宏:

{% macro render_section(classes, background_style) %}
    <div class="mosaic-section {{classes}}" {{background_style}}>
        {{ caller() }}
    </div>
{% endmacro %}

是否可以在不同的模块和模板之间共享这个宏?或者您是否必须在需要使用它的任何地方重复宏?

是的,您可以跨模块共享宏,但与导入相同范围中的模块HTML partial/snippet 包含您创建的宏。

根据使用 {% import %} 标签的 HubL 文档(找到 here),可以从用户创建的 HTML partials/snippets 导入宏。例如,如果您要创建以下名为 macros.html 的 HTML 部分:

{% macro render_section(classes, background_style='', data='') %}
    <div class="mosaic-section {{classes}}" {{background_style}} {{data}}>
        {{ caller() }}
    </div>
{% endmacro %}

然后您可以将 macros.html 导入模板,例如,使用以下 HubL/HTML 代码调用 homepage.html

<!doctype html>
<head>
    {# standard HubL header code goes here %}
</head>
<body class="site-page two-column {{ builtin_body_classes }}" style="">

    {% import 'path/to/macros.html as module_macros %}

    <!--- more HubL/HTML code .... -->

    {{ standard_footer_includes }}
</body>
</html>

因此,添加到 homepage.html 编码模板的所有模块现在都与导入的宏处于同一范围内,因此所述模块现在可以使用宏。

如果您想从包含多个宏的 HTML 部分导入 单个 宏,您可以使用 {% from %} 标签(找到 here) 并执行以下操作:

{% from 'path/to/macros.html' import render_section %}

现在宏 render_section() 可用于编码模板中的所有后续模块。

注意:

不幸的是,我还没有找到将 use/import 宏 "globally" 放入 拖放 模板的方法——至少没有使用嵌入的 HubL 模块,它可以在生成的 HTML 标记中添加奇怪的间距问题,您可能需要使用 CSS 解决这些问题。

希望这个答案足够,有助于解决您提出的问题。