Field Config Cardinality
個々のFieldインスタンスに対して、Field Storageで定義されたカーディナリティ(値の数)をBundle単位でオーバーライドし、異なる制限を設定できるようにします。
field_config_cardinality
インストール
composer require 'drupal/field_config_cardinality:^4.0'
composer require 'drupal/field_config_cardinality:^3.0'
composer require 'drupal/field_config_cardinality:8.x-1.2'
概要
Field Config Cardinalityは、異なるBundle(コンテンツタイプ、Entityタイプなど)間で同じFieldに対して異なるカーディナリティ制限を設定する機能を提供します。Drupal Coreでは、Fieldのカーディナリティはfield storageレベルで定義されるため、Fieldのすべてのインスタンスが同じカーディナリティ設定を共有します。このモジュールは、管理者がBundle単位で異なる値の制限を設定できるインスタンスレベルのカーディナリティオーバーライドを追加します。
例えば、storageレベルで無制限のカーディナリティを持つ「タグ」エンティティ参照フィールドがある場合、このモジュールを使用して記事は5つのタグに制限し、ページは無制限のタグを許可することができます。モジュールは、Field設定エンティティのサードパーティ設定としてカーディナリティ設定を保存することでこれを実現します。
このモジュールは、Options Select、Entity Reference Autocomplete、Media Libraryウィジェットの修正版を含む、インスタンスカーディナリティ設定を尊重する拡張Fieldウィジェットも提供します。さらに、カーディナリティと必須フィールドの状態に基づいて、セレクトウィジェットの空ラベルテキストのカスタマイズをサポートしています。
Features
- Bundle単位でfield storageのカーディナリティをオーバーライドするインスタンスレベルのカーディナリティを設定
- 特定のBundleで無制限カーディナリティのFieldを特定の数に制限するサポート
- エンティティ参照フィールド、リストフィールド(integer、float、string)、ファイル/画像フィールド、Media LibraryフィールドおよびMedia Libraryフィールドとの互換性
- インスタンスカーディナリティを適切に強制するカスタムウィジェット:カーディナリティ対応セレクトリスト、カーディナリティ対応Entity Reference Autocomplete、カーディナリティ対応Media Library
- 無制限/制限および必須/任意の状態に対応した異なるラベルを持つセレクトウィジェットの空ラベルテキストのカスタマイズ
- インスタンスカーディナリティ制限に達した際の「さらに追加」ボタンの自動非表示
- storageレベルで定義された最大カーディナリティを尊重(storageカーディナリティを超えることはできません)
Use Cases
異なるコンテンツタイプでのタグ制限
storageレベルで無制限のカーディナリティを持つ「タグ」タクソノミー参照フィールドが複数のコンテンツタイプで共有されています。このモジュールを使用すると、記事は5つのタグ、ブログ投稿は10のタグに制限し、ページは無制限のタグを許可できます。これにより、単一の共有フィールドを使用しながらコンテンツガバナンスの柔軟性を提供します。
Bundle単位でのメディアアイテムの制限
「ギャラリー画像」メディア参照フィールドはstorageで無制限として設定されています。商品コンテンツタイプでは4つの画像のみを許可し、ポートフォリオアイテムでは無制限にしたい場合があります。このモジュールはMedia Libraryウィジェットを使用してこのBundle単位の制限を可能にします。
エンティティ参照の単一値オーバーライド
「著者」エンティティ参照フィールドはユーザーEntityを参照し、storageで無制限のカーディナリティを持っています。ニュース記事では複数の著者を許可したいが、シンプルページでは正確に1人の著者にしたい場合があります。シンプルページのインスタンスカーディナリティを1に設定することで、オートコンプリートウィジェットは複数値インターフェースではなく単一フィールドを表示します。
より良いUXのためのカスタム空ラベル
コンテキストに応じて異なるプレースホルダーテキストが必要な「優先度」リストフィールドがあります。必須フィールドではプレースホルダーとして「- 優先度を選択 -」を表示し、任意フィールドでは「- 優先度なし -」を表示したい場合があります。このモジュールの空ラベルカスタマイズにより、Fieldインスタンスごとにユーザー体験を調整できます。
コンテンツタイプ別のファイルアップロード制限
「ドキュメント」ファイルフィールドはstorageレベルで無制限に設定されています。ユーザープロファイルではドキュメントのアップロードを3ファイルに制限し、管理ページでは無制限にしたい場合があります。モジュールはインスタンスカーディナリティ制限を超えるアップロードスロットを非表示にすることでこれを強制します。
Tips
- インスタンスカーディナリティはfield storageのカーディナリティを超えることはできません - storageカーディナリティが十分に高く設定されているか、無制限であることを確認してください
- インスタンスカーディナリティで「無制限」オプションを使用する場合、field storageも無制限として設定されている必要があります
- モジュールはhook_field_widget_info_alterを通じてCoreウィジェットを修正するため、同じウィジェットを修正する他のモジュールと競合する可能性があります
- サードパーティ設定は設定エクスポートに含まれるため、drush config:exportを使用するとカーディナリティ設定がエクスポートされます
- セレクトウィジェットでは、カスタム空ラベルの完全なサポートを得るためにCardinalityOptionsSelectWidgetを明示的に使用してください
- 複数値フィールドでインスタンスカーディナリティを1に設定すると、ウィジェットの動作が単一値モードに変わり、「さらに追加」ボタンが非表示になります
Technical Details
Admin Pages 1
/admin/structure/types/manage/{type}/fields/{field}/edit
モジュールは標準のField設定編集フォームを拡張し、追加のカーディナリティ設定を提供します。これらの設定は既存のField編集ページに新しいフィールドセットとして表示され、管理者がこの特定のFieldインスタンスに対して異なるカーディナリティ制限を設定できるようにします。
Hooks 4
hook_field_widget_info_alter
デフォルトのmedia_library_widgetとentity_reference_autocompleteウィジェットクラスを、インスタンスカーディナリティをサポートするカスタムクラスに置き換えます。
hook_form_alter (field_config_edit_form)
Field設定編集フォームに「カーディナリティインスタンス」フィールドセットを追加し、管理者がインスタンスレベルのカーディナリティと空ラベルオプションを設定できるようにします。
hook_field_widget_complete_form_alter
フォームレンダリング中にFieldウィジェットにインスタンスカーディナリティ設定を適用します。カーディナリティ制限を超えるアイテムを非表示にすることでmanaged_fileフィールドを処理し、カーディナリティが1の場合はマルチセレクトをシングルセレクトに変換します。
hook_preprocess_field_multiple_value_form
インスタンスカーディナリティに基づいて表示されるアイテムを制限するために複数値フィールドのレンダリングを修正します。カーディナリティ制限に達した場合は「さらに追加」ボタンを非表示にします。
Security Notes 2
- モジュールは既存のDrupal Field権限で保護された管理専用のField設定ページにフォーム要素を追加します
- インスタンスカーディナリティはフォームレベルで強制されます。API送信には追加のサーバーサイドバリデーションが必要な場合があります