Computed Field
管理者ユーザーがエンティティタイプに動的に計算されるフィールドを追加できるようにします。フィールド値は開発者が作成したプラグインによって生成されます。
computed_field
インストール
composer require 'drupal/computed_field:^3.0'
概要
Computed Field モジュールは、Drupal エンティティにデータベースに保存されるのではなく動的に計算される値を持つフィールドを作成するための堅牢なフレームワークを提供します。これにより、開発者はエンティティの既存データ、関連エンティティ、またはその他のロジックに基づいて値を生成する computed field プラグインを作成できます。
computed field は Drupal の Field システムとシームレスに統合され、保存されるフィールドと同じ field type およびフォーマッターを使用します。これにより、サイト構築者は文字列フォーマッター、エンティティ参照フォーマッター、またはその他の互換性のある表示形式など、使い慣れたウィジェットを使用して計算値を表示できます。
モジュールは2つのアタッチモードをサポートしています:自動アタッチ(プラグインがコード内でターゲットのエンティティタイプ/バンドルを宣言する)と、設定によるアタッチ(サイト管理者がUIを通じてフィールドを作成する)です。Computed Field UI サブモジュールは、コードなしで computed field を作成・管理するためのユーザーフレンドリーなインターフェースを提供します。
主要な機能として lazy builder システムがあり、ホストエンティティとは異なるキャッシュ要件を持つフィールドを処理します。これにより、外部データに依存したり複雑なキャッシュ依存関係を持つ計算値が、ページキャッシングのパフォーマンスに影響を与えることなく正しくレンダリングされます。
Features
- カスタムプラグインロジックから動的な値を生成する computed field を作成
- あらゆる Drupal field type(string、entity_reference、text、link、image など)をサポートし、既存のフォーマッターを再利用可能
- プラグインアノテーションによる自動フィールドアタッチ - コードで宣言されたフィールドが指定されたエンティティタイプとバンドルに自動的に追加される
- 管理 UI を通じた設定可能なフィールドアタッチ - サイト構築者がコーディングなしで computed field を作成可能
- 現在のエンティティを参照しているエンティティを検索する組み込みの Reverse Entity Reference プラグイン
- 異なるキャッシュコンテキストを持つ動的に計算された値の適切なキャッシングのための lazy builder サポート
- Field UI との完全な統合 - computed field が「表示の管理」インターフェースで保存されたフィールドと並んで表示される
- base field(全バンドル)とバンドル固有フィールドの両方をサポート
- レガシーアノテーションと並行してモダンなプラグイン定義のための PHP 8 attribute サポート
- 柔軟なフィールド設定のための設定フォームを持つ configurable プラグイン
Use Cases
関連コンテンツを自動的に表示する
組み込みの Reverse Entity Reference プラグインを使用して、現在のエンティティを参照しているコンテンツを自動的に表示します。例えば、ユーザープロフィール上に著者のすべての記事を表示したり、関係を手動で維持することなくカテゴリ内のすべての製品を表示したりできます。
派生値を計算する
エンティティの他のフィールドから値を計算する computed field を作成します。例としては、姓/名フィールドからのフルネーム、数量と単価からの合計金額、生年月日フィールドから計算される年齢などがあります。
コンテキスト情報を表示する
現在のユーザー、時間、またはリクエストパラメータなど、現在のリクエストコンテキストに依存する情報を表示します。lazy builder を使用して、動的コンテンツを表示しながら適切なキャッシングを確保します。
関連エンティティからデータを集計する
レビューエンティティからの平均評価、ラインアイテムからの注文合計金額、コメント数など、関連エンティティからの統計や集計を計算します。lazy builder システムは、関連コンテンツが変更されたときのキャッシュ無効化を処理します。
複雑な出力をフォーマットする
出力が複雑なマークアップ、埋め込みビュー、または標準のフィールドフォーマッターに適さないその他の要素を必要とする場合、computed_render_array field type を使用して完全な render array を返します。
バンドル間で自動的にフィールドをアタッチする
開発者はアノテーション設定を通じて特定のエンティティタイプとバンドルに自動的にアタッチする computed field プラグインを作成でき、バンドルごとの手動セットアップなしでサイト全体で一貫した機能を確保できます。
Tips
- 単一の値を返すプラグインには SingleValueTrait を使用してください - 完全な配列構造を構築する代わりに singleComputeValue() を実装するだけで済むため、実装が簡素化されます
- 複雑なキャッシング要件を持つプラグインの場合、useLazyBuilder() から TRUE を返し、getCacheability() で適切なキャッシュメタデータを提供して、正しいキャッシュ無効化を確保してください
- プラグインのアノテーション/attribute に no_ui: TRUE を設定すると、管理 UI のドロップダウンに表示されなくなります - 自動的にのみアタッチされるべきプラグインに便利です
- 自動プラグインは「dynamic」プロパティを使用し、attachAsBaseField()/attachAsBundleField() メソッドをオーバーライドして、既存のフィールドに基づく複雑なアタッチロジックを実現できます
- computed_render_array field type は、標準のフォーマッターでは不十分な場合に出力を完全に制御できます
- computed field は読み取り専用であり、エンティティフォームには表示されないことを覚えておいてください - これらは純粋に表示目的です
Technical Details
Admin Pages 4
/admin/structure/types/manage/{bundle}/fields/add-computed-field
コンテンツタイプに新しい computed field を作成するためのフォーム。computed field プラグインの選択、設定(利用可能な場合)、フィールドラベルとマシン名の設定が可能です。
/admin/structure/types/manage/{bundle}/fields/computed/{computed_field}
既存の computed field のラベルやプラグイン設定を含む設定を変更するための編集フォーム。
/admin/structure/types/manage/{bundle}/fields/computed/{computed_field}/delete
エンティティバンドルから computed field を削除するための確認フォーム。
/admin/reports/fields/computed
サイトに設定されているすべての computed field を一覧表示するレポート。エンティティタイプ、バンドル、プラグイン情報を表示します。
権限 1
Hooks 1
hook_computed_field_info_alter
モジュールがキャッシュされる前に computed field プラグイン定義を変更できるようにします。プラグインプロパティの変更、クラスの変更、またはディスカバリーからのプラグインの削除に使用できます。
Troubleshooting 5
Views での自動 base field 宣言のために https://www.drupal.org/project/drupal/issues/3349739 から Core パッチを適用してください。バンドルフィールドはまだ Core サポートがないため、手動での Views 統合が必要です。
プラグインが useLazyBuilder() で TRUE を返し、getCacheability() で適切なキャッシュタグを返すことを実装していることを確認してください。lazy builder システムは、提供されたメタデータに基づいてキャッシュ無効化を処理します。
これは既知の Drupal core の問題です(https://www.drupal.org/project/drupal/issues/3045509)。バンドルフィールドはフィールドマップに含まれません。フィールドは表示目的では正しく機能します。
プラグインクラスが ConfigurableInterface と PluginFormInterface の両方を実装していることを確認してください。buildConfigurationForm()、validateConfigurationForm()、submitConfigurationForm() が適切に実装されているか確認してください。
これは https://www.drupal.org/project/drupal/issues/3016895 で追跡されています。必要に応じて、削除後にビュー表示からフィールドを手動で削除してください。
Security Notes 4
- 「administer computed_field entities」権限は制限されており、信頼できる管理者にのみ付与すべきです
- Computed field プラグインはアタッチされているエンティティへの完全なアクセス権を持ちます - プラグインコードが出力を適切にサニタイズしていることを確認してください
- 他のエンティティをクエリするプラグインを実装する場合、アクセス権限を尊重するためにエンティティクエリで accessCheck(TRUE) を使用してください
- 関連エンティティからデータを公開するプラグインには注意が必要です - 適切なアクセスチェックが実施されていることを確認してください