【第4回】 Twigテンプレートによるレンダリング

Unmanaged Files in Drupal: Rendering via a Twig Template (Part 4)
目次

パート3では、Block Pluginを通じてファイルハンドラーを公開し、サイトビルダーがUI経由で領域に出力を配置できるようにしました。これは柔軟性の点では非常に優れていますが、時にはより厳密な制御が必要な場合があります。つまり、ブロックシステムに依存することなく、ページテンプレート内に直接固定されたマークアップを配置したい場合です。

テンプレートの登録

このアプローチは、Drupalのテーマシステム(hook_theme())を使用して、モジュールが提供するTwigテンプレートを登録します。これにより、カスタムテンプレートが検出可能になり、コントローラーから直接渡される定義済み変数と共に使用できるようになります。

<?php
/**
 * Implements hook_theme().
 *
 * カスタムテーマが不要になるよう、モジュール提供のテンプレートを登録します。
 */
function unmanaged_files_theme() {
  return [
    'unmanaged_files_test' => [
      'variables' => [
        'image_url' => NULL,
        'uri' => NULL,
        'message' => NULL,
      ],
      'template' => 'unmanaged-files-test',
    ],
  ];
}

コントローラー

コントローラーは、PHPで手動でマークアップを構築するのではなく、新しいテーマフックを使用してコンテンツをレンダリングします。

<?php
/**
 * モジュールテンプレートを使用してunmanaged filesテストページをレンダリングします。
 */
public function view(): array {
  $uri = $this->handler->getRandomFile();
  
  if (!$uri) {
    return [
      '#theme' => 'unmanaged_files_test',
      '#message' => $this->t('public://segregated_maps配下にファイルが見つかりません'),
      '#cache' => ['max-age' => 1],
    ];
  }
  
  $url = $this->urlGen->generateAbsoluteString($uri);
  
  return [
    '#theme' => 'unmanaged_files_test',
    '#image_url' => $url,
    '#uri' => $uri,
    '#cache' => ['max-age' => 1],
  ];
}

テンプレート

Twigテンプレートはmodules/custom/unmanaged_files/templates/unmanaged-files-test.html.twigとして保存され、コントローラーから出力される変数をレンダリングします。

{# /**
 * @file
 * サービスによって選択されたランダムなunmanaged fileをレンダリングします。
 */ #}
<div>
  <h1>Unmanaged filesテスト</h1>
  
  {% if image_url %}
    <p>選択: {{ uri }}</p>
    <img src="{{ image_url }}" alt="ランダムマップ" />
  {% else %}
    <p>{{ message }}</p>
  {% endif %}
</div>

テスト手順:

  1. パート3のブロックを無効化して重複を避ける
  2. ddev drush crを使用してキャッシュをクリアする
  3. /unmanaged-files/testにアクセスして新しいテンプレート出力をテストする

なぜこのアプローチなのか?

パート3(Block Plugin):UI駆動の配置と表示制御を可能にし、編集者による使用に理想的です。

パート4(Twigテンプレート):テンプレート内で正確で固定されたマークアップが必要なテーマ作成者や開発者に、より厳密な制御を提供します。

両方の方法は同じサービスに依存しており、統合レイヤー(ブロック対テーマ)のみが異なります。

パート5では、このシリーズはカスタムTwig関数を通じてハンドラーを公開する方法を探求し、{{ random_unmanaged_file() }}のようなインライン使用を可能にします。

この記事は 「Unmanaged Files in Drupal (Part 4): Rendering via a Twig Template」の翻訳記事です。

カテゴリ

タグ