FormAlter as Plugin

従来のhook_form_alter()実装をオブジェクト指向のPluginに置き換える、Plugin ベースのフォーム変更システムを提供します。

pluginformalter
1,353 sites
23
drupal.org

インストール

Drupal 11, 10 v8.x-1.8
composer require 'drupal/pluginformalter:8.x-1.8'
Drupal 9, 8 v8.x-1.7
composer require 'drupal/pluginformalter:8.x-1.7'

概要

FormAlter as Pluginは、Drupalフォームの変更方法を現代化する開発者向けユーティリティモジュールです。従来の手続き型hook_form_alter()アプローチの代わりに、アノテーションを使用したオブジェクト指向のPluginを作成してフォームを変更できます。このアプローチにより、コード構成の改善、Dependency Injectionのサポート、関心の分離の明確化が実現します。

このモジュールは3種類のフォーム変更をサポートしています:標準的なDrupalフォーム(form_idまたはbase_form_idによる)、Paragraphsウィジェットフォーム(paragraph_typeによる)、Inline Entity Formフォーム(entity_typeとbundleによる)。各Pluginタイプには独自のアノテーションとマネージャーサービスがあり、特定のフォームを正確にターゲットにできます。

さらに、このモジュールはWebprofilerモジュールと統合されており、デバッグツールバーで各フォームを変更しているPluginを表示するため、開発とデバッグが容易になります。

注意: Drupal 11.2以降、Drupal CoreがOOP Hookをネイティブにサポートするようになったため、このモジュールは非推奨警告を発生させます。このモジュールはDrupal 12.0.0で動作しなくなるため、開発者はCoreのOOP Hookに移行する必要があります。

Features

  • hook_form_alter()をオブジェクト指向アプローチに置き換えるPluginベースのフォーム変更システム
  • ワイルドカードマッチングによるform_idまたはbase_form_idでのフォームターゲティングをサポート
  • Paragraphsモジュール統合によるParagraphタイプウィジェットフォームの変更
  • Inline Entity Formモジュール統合によるIEF Entityフォーム、参照フォーム、テーブルFieldの変更
  • フォーム変更の順序を制御するためのweightベースのPlugin順序付け
  • 複数のPluginが予測可能な実行順序で同じフォームを変更可能
  • デバッグツールバーにすべてのFormAlter Pluginを表示するWebprofiler統合
  • ContainerFactoryPluginInterfaceによる完全なDependency Injectionサポート
  • ローカライゼーションサポートのためのStringTranslationTraitをベースクラスに含む

Use Cases

ドメイン別のフォーム変更整理

アプリケーションの各機能領域に対して個別のFormAlter Pluginを作成します。例えば、ログイン変更用のUserLoginFormAlter、コンテンツ編集用のNodeFormAlter、ECサイト用のCommerceCheckoutFormAlterを作成します。各PluginはDependency Injectionによりロジックを明確にカプセル化します。

すべてのNodeフォームの変更

base_form_idターゲティングを使用して、すべてのNodeフォームを一度に変更します。@FormAlter(id = "node_form_base_alter", base_form_id = {"node_form"})でPluginを作成し、すべてのコンテンツタイプにカスタムバリデーションやField変更などの共通機能を追加します。

条件付きフォーム変更

Pluginシステムとformater()メソッド内の条件ロジックを組み合わせます。Pluginはターゲットフォームがレンダリングされるときにのみインスタンス化され、実装内で追加の実行時条件を追加できます。

特定のParagraphタイプのターゲティング

Paragraphsモジュールを使用する場合、ParagraphsFormAlter Pluginを作成して特定のParagraphタイプフォームをカスタマイズします。例えば、画像Paragraphウィジェットを変更してカスタムJavaScript動作やバリデーションを追加します。

Inline Entity Formの拡張

InlineEntityFormAlter Pluginを使用して、フォームにEntityが埋め込まれる方法をカスタマイズします。特定のEntityタイプとbundleをターゲットにしたり、Entity参照リストのテーブルField表示を変更したりします。

変更順序の制御

複数のPluginが同じフォームを変更する場合、weightプロパティを使用して実行順序を制御します。weightが低いものが先に実行されます。これは、ある変更が別の変更の結果に依存する場合に不可欠です。

フォーム変更のデバッグ

Webprofilerが有効な場合、モジュールはデバッグツールバーに各フォームに影響を与えるすべてのFormAlter Pluginを表示します。これにより、どのPluginがフォームを変更しているかを特定し、予期しない動作を追跡できます。

Tips

  • Pluginクラスは検出されるためにsrc/Plugin/FormAlter/ディレクトリに配置する必要があります
  • form_idでワイルドカードパターン(例:'node_*_form')を使用して複数のフォームをターゲットにできます
  • ベースクラスFormAlterBaseには便利なStringTranslationTraitとDependencySerializationTraitが含まれています
  • ContainerFactoryPluginInterface(FormAlterBaseに含まれる)を実装してPluginにサービスを注入します
  • Pluginはform_idとbase_form_idの両方のターゲティングをサポートし、base_form_idの変更はform_idの変更より先に実行されます
  • Drupal 11.2以降では、このモジュールの代わりにCoreのOOP Hook機能への移行を検討してください
  • Pluginを追加または変更した後、変更を反映するためにCacheをクリアしてください

Technical Details

Hooks 1
pluginformalter_form_alter_info_alter

3つのPluginマネージャーのいずれかで検出されたFormAlter Plugin定義を変更します。

Troubleshooting 5
Pluginが検出されない

Pluginが正しい名前空間(Drupal\yourmodule\Plugin\FormAlter)にあること、正しいアノテーション(@FormAlter、@ParagraphsFormAlter、または@InlineEntityFormAlter)があること、すべてのCacheをクリアしていることを確認してください。

Plugin変更が期待した順序で適用されない

Pluginアノテーションのweightプロパティを調整してください。weightが低いものが先に実行されます。必要に応じてpluginformer_form_alter_info_alter Hookを使用して実行時にweightを変更できます。

Drupal 11.2以降で非推奨警告が表示される

これらの警告は、モジュールがDrupal CoreのOOP Hookを優先して非推奨になったことを示しています。Drupal 12にアップグレードする前に、Coreのhook_form_alter OOP実装への移行を計画してください。

Webprofiler統合がFormAlterを表示しない

pluginformalterとwebprofilerの両方のモジュールが有効になっていることを確認してください。Cacheをクリアして、サービスプロバイダーがformsデータコレクターを正しくデコレートしていることを確認してください。

Paragraphsのフォーム変更がトリガーされない

@ParagraphsFormAlterアノテーション(@FormAlterではない)を使用していること、paragraph_typeが正確に一致していることを確認してください。paragraph_typeはParagraphタイプのマシン名である必要があります。