部分的なテンプレートを含める


19

Drupal 8をカスタムテーマで使用しようとしています。要件に大きな構造の違いがあるため、ページ--front.twig.htmlとpage.twig.htmlがあります。 foot.html.twigやheader.html.twigなどの通常のSymfony2プロジェクトのphroznオーダー。これらのテンプレートは、サブディレクトリ/ parts /に保存されます。

しかし、このテンプレートを通常どおり呼び出すと、テンプレートの名前を含む文字列を受け取ります。

例えば:

{# in page.html.twig or page--front.html.twig #}
{% include 'parts/footer.html.twig' %} 

ファイル名を文字列として返します。

parts/footer.html.twig

Drupal 8でそれを行うことは可能ですか?

回答:


33

相対パスを実行することはできません。すべてのパスは、Drupalルートから、または「テンプレート」ディレクトリへの名前空間付きパスhttps://www.drupal.org/node/2143557に基づいている必要があります

少なくともhttps://www.drupal.org/node/2291449が解決されるまで、「Drupalルートから」を避け、名前空間を使用します。

{% include '@mytheme/parts/footer.html.twig' %}

編集:ループまたは追加の引数をインクルードされたtwigテンプレートにチェックするための追加の引数を渡したい場合は、次のように書く必要があります:

{% include '@mytheme/includes/form-block.html.twig' with {dog: true} %}

編集:https : //www.drupal.org/node/2291449がコミットされたので、次のこともできます。

{% include 'footer.html.twig' %}

ファイル名が有用な例外ではなく文字列として表示された理由については、https://www.drupal.org/node/2369981を参照してください


どの程度includeと値を渡しますか?リンクされた画像の作成を避けるためにimage-formatterurlnullを含めて渡したいとします。
-SaidbakR

この回答で提供されている例は機能しないようです。
アーノルドバード

3
+文字列の@mythemeパスに解決されることに注意してください。つまり、ディレクトリに解決されます。mytheme/templates@mythememytheme/templates
ダニエルズ

@danielsからのコメントをさらに明確にするため。カスタムテーマの名前がmythemeで、「themes / custom / mytheme」にある場合、Twig名前空間@mytheme「themes / custom / mytheme / templates」に解決されます。にあるテンプレートを含めると、「themes / custom / mytheme / templates / fragments / footer.html.twig」に@mytheme/fragments/footer.html.twig解決されます
-ec0g

15

テーマディレクトリへのフルパスを使用します。名前空間を使用する場合、コードを別のサイトまたはテーマに持ち込む場合は、名前空間を変更する必要があります。

これは動作するはずです:

{% include directory ~ '/templates/parts/footer.html.twig' %}

これは、サブテーマを行うときに非常に便利です。これを親テーマに設定し、子テーマのテンプレートディレクトリにバージョンを作成します。
アンドリューキレン

これは私のために働いた唯一の答えです。
アーノルドバード

5

Twigの配列の使用を使用して、ファイルが存在しない場合にフォールバックを作成することもできます。

例えば。footer.html.twigが利用できない場合、defaultfooter.html.twigが使用されます。

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
これをファイル名の変数の使用と組み合わせて、何らかのコンテキストに応じて異なるファイルを含めることができます。

Nb:これがベストプラクティスであるかどうか、まだ解決しようとしています。




1

Drupal 8の場合

{% include 'FILE_NAME.html.twig' %}Drupal を実行するときにテーマ小枝ファイルを含めると、 FILEが現在のテーマディレクトリに配置されることが期待されます。そこに置くだけで動作します。

モジュールに小枝ファイルを含める

モジュールに追加する場合は、テーマ関数で宣言する必要があります。.moduleファイルに次を追加します。

<?php function YOUR_MODULE_NAME_theme($existing, $type, $theme, $path) {   
   'FILE_NAME' => [
      'variables' => [
      ],
      'template' => 'FILE_NAME',
    ], ?>

次に、TwigファイルをYOUR_MODULE / template / FILE_NAME.html.twigに配置します


パスに関する間違った情報です。モジュールからのファイルをテーマフックに含めるには、別の方法が必要です。{{include( '@ yourModuleName / twigFileName.html.twig'、{var1:var1Val、var2:var2Val})}}忘れないでください、テンプレートファイルは「yourModuleName / templates /」にあります。
Verter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.