移至主內容
首頁  >  Drupal目錄  >  Twig 模板中的巨集

Twig 模板中的巨集

Tag :
twig, macros
Written by Shiuan on 20 December 2023

From the official Twig documentation: 巨集可與常規程式語言中的函數相比。它們可用於將常用的 HTML 慣用語,放入可重複使用的元素中,以避免代碼重複。

{% macro input(name, value, type, size) %}
 <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}

巨集在幾個方面與原生的 PHP 函數有所不同:

  • 預設參數值是通過在巨集主體中使用 default 過濾器來定義的

  • 巨集的參數始終是可選的

  • 如果向巨集傳遞了額外的位置參數,它們將以一個列表形式的值出現在特殊的 varargs 變量中

    但與 PHP 函數一樣,巨集無法訪問當前模板的變數。您可以通過使用特殊的 _context 變量將整個上下文作為參數傳遞。

調用巨集

從_self

可以將巨集放在調用它的相同 Twig 中。在這種情況下,使用 _self 上下文...

{{ _self.input(name, value, type, size) }}

從外部文件

但最佳實踐是將巨集(可為複數)放在一個獨立的文件中(例如,macros.twig),以便可以在多個模板中使用巨集(可為複數)。

例如,在名為 “mytheme” 的自定義主題中,我們將巨集文件放在這裡...

[site_root]/themes/custom/mytheme/templates/macros.twig

注意:巨集文件可以命名為任何 .twig,但不能有 'html' 擴展名稱(即,macros.html.twig 將無效)。該文件必須放置在 “templates” 目錄中,無論它在哪裡使用(即,對於您放置在 .../mytheme/layouts 中的布局構建器,巨集必須存在於 ../mytheme/templates 中)。

在您想使用該巨集的模板中,添加此導入語句。

{% import '@mytheme/macros.twig' as myMacros %}

@mytheme 可以神奇地定位到您主題的 “templates” 目錄,但您必須在導入語句中定義任何進一步的目錄結構,如下所示:

{% import '@mytheme/foo/bar/macros.twig' as myMacros %}

請注意,該文檔的較舊版本聲明不需要定義嵌套的目錄結構,所以可能會有所不同。如果您在自定義的模組中執行此操作,請使用相同的技術,只需使用模組名稱而不是主題名稱(例如,@mycustommodule)。

然後使用巨集...

{{ myMacros.input(name, value, type, size) }}


舉例

在Drupal 8+中時常創建巨集,例如,使用巨集創建主導覽(詳情請見 menu.html.twig)。

返回Drupal
首頁  >  Drupal  >  Twig 模板中的巨集

Twig 模板中的巨集

Tag :
twig, macros
Written by Shiuan on 20 December 2023

From the official Twig documentation: 巨集可與常規程式語言中的函數相比。它們可用於將常用的 HTML 慣用語,放入可重複使用的元素中,以避免代碼重複。

{% macro input(name, value, type, size) %}
 <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}

巨集在幾個方面與原生的 PHP 函數有所不同:

  • 預設參數值是通過在巨集主體中使用 default 過濾器來定義的

  • 巨集的參數始終是可選的

  • 如果向巨集傳遞了額外的位置參數,它們將以一個列表形式的值出現在特殊的 varargs 變量中

    但與 PHP 函數一樣,巨集無法訪問當前模板的變數。您可以通過使用特殊的 _context 變量將整個上下文作為參數傳遞。

調用巨集

從_self

可以將巨集放在調用它的相同 Twig 中。在這種情況下,使用 _self 上下文...

{{ _self.input(name, value, type, size) }}

從外部文件

但最佳實踐是將巨集(可為複數)放在一個獨立的文件中(例如,macros.twig),以便可以在多個模板中使用巨集(可為複數)。

例如,在名為 “mytheme” 的自定義主題中,我們將巨集文件放在這裡...

[site_root]/themes/custom/mytheme/templates/macros.twig

注意:巨集文件可以命名為任何 .twig,但不能有 'html' 擴展名稱(即,macros.html.twig 將無效)。該文件必須放置在 “templates” 目錄中,無論它在哪裡使用(即,對於您放置在 .../mytheme/layouts 中的布局構建器,巨集必須存在於 ../mytheme/templates 中)。

在您想使用該巨集的模板中,添加此導入語句。

{% import '@mytheme/macros.twig' as myMacros %}

@mytheme 可以神奇地定位到您主題的 “templates” 目錄,但您必須在導入語句中定義任何進一步的目錄結構,如下所示:

{% import '@mytheme/foo/bar/macros.twig' as myMacros %}

請注意,該文檔的較舊版本聲明不需要定義嵌套的目錄結構,所以可能會有所不同。如果您在自定義的模組中執行此操作,請使用相同的技術,只需使用模組名稱而不是主題名稱(例如,@mycustommodule)。

然後使用巨集...

{{ myMacros.input(name, value, type, size) }}


舉例

在Drupal 8+中時常創建巨集,例如,使用巨集創建主導覽(詳情請見 menu.html.twig)。