Twigテンプレートのマクロ
Twig公式ドキュメントより:「マクロは通常のプログラミング言語の関数に匹敵します。繰り返さないように、頻繁に使用される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変数を使用して、コンテキスト全体を引数として渡すことができます。
マクロの呼び出し
From _self
マクロは、それを呼び出すのと同じTwigファイルに配置できます。この場合、_selfコンテキストが使用されます...
{{ _self.input(name, value, type, size) }}
外部ファイルから
ただし、複数のテンプレートでマクロを使用できるように、マクロは別のファイル(例:macros.twig)に配置することをお勧めします。
たとえば、カスタムテーマ「mytheme」では、マクロファイルをここに配置します...
[site_root]/themes/custom/mytheme/templates/macros.twig
注:マクロファイルはany.twigという名前を付けることができますが、html拡張子を持つことはできません(つまり、macros.html.twigは機能しません)。また、ファイルは使用場所に関係なく「templates」ディレクトリに配置する必要があります(つまり、.../mytheme/layoutsに配置したLayout Builderレイアウトの場合、マクロは../mytheme/templatesに存在する必要があります)。
マクロを使用するテンプレートに、このimportステートメントを追加します。
{% import '@mytheme/macros.twig' as myMacros %}
@mythemeはテーマの「templates」ディレクトリを自動的に見つけますが、追加のディレクトリ構造はimportステートメントで定義する必要があります。例:
{% import '@mytheme/foo/bar/macros.twig' as myMacros %}
このドキュメントの古いバージョンでは、ネストされたディレクトリ構造の定義は不要とされていたため、ymmvに注意してください。カスタムモジュールでこれを行う場合は、テーマ名の代わりにモジュール名を使用するだけで同じ手法を使用します(例:@mycustommodule)。
次に、マクロを使用します...
{{ myMacros.input(name, value, type, size) }}
例
Drupal 8では、マクロはたとえばメインナビゲーションの作成に使用されます(menu.html.twigファイルを参照)。