パート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>テスト手順:
- パート3のブロックを無効化して重複を避ける
ddev drush crを使用してキャッシュをクリアする/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」の翻訳記事です。
カテゴリ
タグ