Inline Entity Form
親エンティティフォーム内で参照エンティティのインライン管理(作成、編集、削除)を行うためのウィジェットを提供します。
inline_entity_form
概要
Inline Entity Formは、親エンティティフォーム内で参照エンティティを直接インライン管理できる強力なDrupalモジュールです。主な用途は、親子関係(商品表示→商品、注文→ラインアイテム、ノード→参照コンテンツなど)において、子エンティティを別のフォームではなく親のコンテキスト内で主に管理する場合です。
このモジュールは、entity_referenceおよびentity_reference_revisionsフィールドタイプで使用できる2つのフィールドウィジェットを提供します。Simpleウィジェットは、単一値の必須フィールドで1つのターゲットバンドルを持つ場合に適した、フィールドセット内に埋め込まれたエンティティフォームを表示します。Complexウィジェットは、参照エンティティの追加、編集、削除、複製、並び替えのボタンを備えた包括的なテーブルベースのインターフェースを提供します。
主な機能には、新しい参照エンティティのインライン作成、親フォームを離れずに既存エンティティの編集、オートコンプリートによる既存エンティティの参照、参照削除時のエンティティ削除動作の設定、複数値参照のドラッグ&ドロップ並び替え、折りたたみ可能なフォームコンテナ、異なるエンティティフォームレイアウト用のカスタムフォームモードサポート、リビジョン対応エンティティの自動リビジョン作成、完全な多言語/翻訳サポートが含まれます。
このモジュールは、ハンドラベースのアーキテクチャにより高度に拡張可能です。すべてのエンティティタイプに対してインラインフォームハンドラが自動的に登録され、ノードには特別な処理が提供されます。開発者はInlineFormInterfaceを実装することで、特定のエンティティタイプ用のカスタムハンドラを作成できます。いくつかのhookにより、モジュールやテーマがエンティティフォーム、参照フォーム、テーブルフィールド表示を変更できます。
Features
- インラインエンティティ管理用の2つのフィールドウィジェットを提供:Simple(単一値)とComplex(複数値)
- entity_referenceおよびentity_reference_revisionsフィールドタイプをサポート
- 親エンティティフォーム内で直接、画面遷移なしに新しい参照エンティティを作成
- 完全なフォームサポートで既存の参照エンティティをインライン編集
- 設定可能なマッチング(STARTS_WITHまたはCONTAINS)によるオートコンプリート検索で既存エンティティを追加
- ワンクリックで既存の参照エンティティを複製
- 設定可能な削除動作(常に保持、常に削除、またはユーザーに決定させる)でエンティティ参照を削除
- tabledragを使用した複数参照エンティティのドラッグ&ドロップ並び替え
- 視覚的な煩雑さを軽減する折りたたみ可能・展開可能なフォームコンテナ
- インライン編集とスタンドアロン編集で異なるフォーム表示を可能にするカスタムフォームモードサポート
- リビジョン対応エンティティタイプで設定時の自動リビジョン作成
- インラインエンティティの自動翻訳処理を含む完全な多言語サポート
- エンティティタイプごとのカスタムインラインフォームハンドラを可能にするハンドラベースのアーキテクチャ
- エンティティテーブルに公開/非公開ステータス表示を追加する特殊なノードインラインフォームハンドラ
- 自動ウィジェットタイプマッピングによるDrupal 7からDrupal 8+へのマイグレーションサポート
- ラベル、フィールド、コールバックカラムタイプをサポートする拡張可能なテーブル表示
- エンティティフォーム、参照フォーム、テーブルフィールドを変更するためのhookシステム
Use Cases
商品バリエーション付き商品表示(Commerce)
Drupal Commerceでは、商品表示に商品バリエーション(異なるサイズ、色など)が含まれます。商品参照フィールドでIEF Complexウィジェットを使用すると、店舗管理者は商品表示フォーム上で直接すべてのバリエーションを作成・編集できます。各バリエーションは独自の価格、SKU、属性を持つことができ、すべて別のフォームに移動することなくインラインで管理できます。
注文ラインアイテム管理
ECの注文には複数のラインアイテムが含まれます。IEF Complexウィジェットにより、注文管理者は注文フォーム上で直接ラインアイテムを追加、編集、削除できます。これは、完全なラインアイテムフォームにアクセスする必要がある電話注文や手動調整に特に便利です。
埋め込みメディア付き記事
コンテンツタイプ「Article」が「Media」エンティティへのエンティティ参照フィールドを持っている場合、IEF Simpleウィジェットを使用すると、編集者は記事フォーム内で直接関連するメディアアイテムを作成または編集できます。折りたたみオプションにより、完全なメディア編集機能を提供しながらフォームをすっきりと保てます。
親子コンテンツ関係
階層的なコンテンツ構造(レッスンを含むコースなど)を構築する場合、LessonsフィールドのIEF Complexウィジェットにより、コンテンツ編集者はコースフォーム内ですべてのレッスンを管理できます。ドラッグ&ドロップ並び替えにより、レッスンを適切に順序付けできます。
Paragraphsスタイルのコンテンツ構築
ParagraphsモジュールにはI独自のウィジェットがありますが、IEFはentity_reference_revisionsフィールドで使用して、同様のパラグラフ的なコンテンツ構築体験を作成できます。各パラグラフタイプには独自のインラインフォームがあり、コンテンツは親内で並び替えや管理が可能です。
インラインエンティティ付きノード翻訳
インラインエンティティを含むノードを翻訳する際、IEFは自動的に翻訳ワークフローを処理します。親がフランス語に翻訳される場合、インラインエンティティフォームはフランス語翻訳を表示し(必要に応じて作成)、フィールドの翻訳可能性設定を尊重します。
Tips
- Simpleウィジェットでは、最良の結果を得るためにエンティティ参照フィールドを正確に1つのターゲットバンドルで設定してください
- エンティティが他の場所で参照されている可能性がある場合は、removed_referenceに「ユーザーに決定させる」オプションを使用してください
- インライン編集用の専用フォームモードを作成して、必須フィールドのみを表示しフォームの複雑さを軽減してください
- ネストされたIEF(インラインエンティティ自体がインラインエンティティフィールドを持つ)を使用する場合、再帰を防ぐために親エンティティタイプ/バンドルが子と異なることを確認してください
- Complexウィジェットはtabledragによる並び替えに最適ですが、行フォームが開いているときはtabledragは自動的に無効になります
- 大きなインラインフォームには折りたたみオプションの使用を検討し、親フォームの使いやすさを向上させてください
- allow_existingオプションは強力ですが、大規模サイトではパフォーマンスに影響する可能性があります。より良いパフォーマンスのためにSTARTS_WITHマッチングを使用してください
- hook_inline_entity_form_table_fields_alterを使用して、在庫ステータス、価格、その他の関連データなどのカスタムカラムをエンティティテーブルに追加できます
Technical Details
Hooks 3
hook_inline_entity_form_entity_form_alter
IEFウィジェットに含まれる前にエンティティフォームをモジュールやテーマが変更できるようにします。フォーム要素の変更、バリデーションの追加、フィールドの表示/非表示変更、カスタム処理の追加に使用できます。
hook_inline_entity_form_reference_form_alter
IEFウィジェットに含まれる前に参照フォーム(既存エンティティ追加用のオートコンプリートフォーム)をモジュールやテーマが変更できるようにします。オートコンプリートフィールドのカスタマイズや追加フィールドの追加に便利です。
hook_inline_entity_form_table_fields_alter
IEFエンティティテーブルに表示されるフィールドをモジュールが変更できるようにします。新しいカラムの追加、既存のカラムの削除、カラム設定の変更が可能です。label、field、callbackカラムタイプをサポートします。
Troubleshooting 6
エンティティタイプにインラインフォームハンドラがあることを確認してください。フォーム表示設定でウィジェットが適切に選択されていることを確認してください。ユーザーがターゲットエンティティタイプの作成/編集権限を持っていることを確認してください。
ターゲットタイプ/バンドルのエンティティが存在し、アクセス可能であることを確認してください。フィールドの選択ハンドラ設定が期待されるエンティティを許可していることを確認してください。表示権限が適切に設定されているか確認してください。
inline_entity_form要素の#save_entityプロパティがTRUE(デフォルト)であることを確認してください。送信を妨げているインラインフォームのバリデーションエラーがないか確認してください。
ターゲットエンティティタイプで翻訳が有効になっていることを確認してください。言語フィールドが翻訳用に設定されていることを確認してください。エンティティタイプでcontent_translationモジュールが有効になっていることを確認してください。
これは期待される動作です。複製は同じフィールド値でコピーを作成します。複製は保存時に新しいIDを取得します。複製後にhook_inline_entity_form_entity_form_alterを使用して特定のフィールドをクリアする必要があるかもしれません。
removed_reference設定とエンティティアクセス権限を確認してください。「常に削除」に設定されている場合、ユーザーには削除権限が必要です。また、フィールドが必須で代替エンティティを追加する方法がない状態でないか確認してください。
Security Notes 4
- エンティティアクセスが尊重されます。ユーザーは権限を持つエンティティのみ作成、編集、削除できます
- 「既存を追加」エンティティのオートコンプリートは、表示アクセスと選択ハンドラの制限を尊重します
- removed_referenceが「削除」に設定されている場合、ユーザーがウィジェットを通じて暗黙の削除権限を持つべきか確認してください
- フォームトークンバリデーションにより、インラインフォーム送信に対するCSRF攻撃を防止します