Read-only Field Widget
エンティティ編集フォームでフィールドフォーマッターを使用して、フィールド値を読み取り専用形式で表示するフィールドウィジェットを提供します。
readonly_field_widget
インストール
composer require 'drupal/readonly_field_widget:^2.1'
概要
Read-only Field Widgetモジュールは、エンティティフォーム上で編集可能なフォーム入力を読み取り専用のフォーマット済み出力に置き換えるフィールドウィジェットを提供します。これは、フォーム内でのフィールドの存在を維持しながら、ユーザーによる変更を許可せずに編集フォーム上でフィールド値を表示したい場合に便利です。
このウィジェットはDrupalのフィールドフォーマッターシステムを使用してフィールド値をレンダリングするため、読み取り専用データの表示方法を完全に制御できます。利用可能なフォーマッターを持つすべてのフィールドタイプを動的にサポートするため、編集不可のフィールド表示を作成するための汎用的なソリューションとなります。
このモジュールはフィールドアクセスをインテリジェントに処理します。ユーザーがフィールドの編集アクセス権を持っていないが閲覧アクセス権を持っている場合、読み取り専用ウィジェットはフィールド値を表示します。これはDrupalのフィールドレベルのアクセス制御システムを尊重しながら、制限されたフィールドを単に非表示にするよりも優れたユーザー体験を提供します。
Features
- 汎用的なフィールドタイプサポート - フォーマッターが利用可能なあらゆるフィールドタイプで動作
- 表示にフィールドフォーマッターを使用 - 読み取り専用表示にすべてのフォーマッターオプションと設定を活用可能
- 設定可能なラベル位置 - 上部、インライン、非表示、視覚的に非表示のラベル配置から選択可能
- フォーマッター設定の統合 - ウィジェット設定で選択したフォーマッターのすべての設定に直接アクセス可能
- オプションのフィールド説明表示 - 読み取り専用値の下にフィールドのヘルプテキストを表示または非表示
- エラーバリデーション切り替え - 読み取り専用フィールドのバリデーションエラーを表示するかどうかを制御
- アクセス制御の統合 - フィールドレベルの閲覧権限を尊重し、閲覧はできるが編集はできないユーザーにフィールドを表示
- エンティティ参照サポート - 設定されたフォーマッターを使用して参照エンティティを適切に表示
- デフォルト値のサポート - エンティティ作成フォームでフィールドのデフォルト値と連携
- Drupal 8、9、10、11と互換性あり
Use Cases
自動生成されたフィールド値の表示
計算フィールド、自動生成された参照番号、システムが割り当てた値など、プログラムで入力されるフィールドや自動化されたプロセスを通じて入力されるフィールドにreadonlyウィジェットを使用します。ユーザーは誤って変更することなく値を確認できます。
変更なしでエンティティ参照を表示
参照コンテンツを閲覧可能だがコンテンツ編集者によって変更されるべきではないエンティティ参照フィールドの場合、readonlyウィジェットは変更を防ぎながら、利用可能なフォーマッター(ラベル、レンダリングされたエンティティなど)を使用して参照エンティティを表示できます。
階層化された編集権限の作成
一部のユーザーが特定のフィールド値を閲覧できるが変更はできないようにする場合、readonlyウィジェットをDrupalのフィールドレベルのアクセス制御と組み合わせます。閲覧のみのアクセス権を持つユーザーはフォーマットされた値を見ることができ、閲覧アクセス権を持たないユーザーはフィールドを見ることができません。
作成フォームでのデフォルト値の保持
エンティティ作成中に閲覧可能だが編集不可であるべきデフォルト値を持つフィールドの場合、readonlyウィジェットはデフォルト値を表示します。これは事前に割り当てられたカテゴリ、ステータス値、またはシステムデフォルトを表示するのに便利です。
計算または派生データの表示
集計値や外部システムから取得したデータなど、他のソースから計算されたデータを表示するフィールドの場合、readonlyウィジェットはこの情報が表示専用でありフォームを通じて直接編集できないことをユーザーに理解させます。
監査証跡とメタデータの表示
作成日、作成者情報、リビジョン履歴、その他のメタデータフィールドを編集フォームで読み取り専用形式で表示します。ユーザーは変更のリスクなしに他のフィールドを編集しながら、この重要なコンテキストを見ることができます。
Tips
- フォーム表示テーブルのウィジェット概要には、クイックリファレンスとして現在のフォーマッター、ラベル位置、説明設定が表示されます
- リンクだけでなく参照エンティティの完全な表示を表示したい場合は、エンティティ参照に「Rendered entity」フォーマッターを使用してください
- 「Visually Hidden」ラベルオプションは、視覚的にはラベルを非表示にしながらアクセシビリティを維持します
- 誰が読み取り専用フィールド値を閲覧できるかを細かく制御するには、Field Permissionsモジュールと組み合わせてください
- 異なるユーザーロールでreadonlyウィジェットをテストし、フィールドアクセスが期待通りに動作することを確認してください
- 複数値フィールドの場合、フィールド全体が読み取り専用としてレンダリングされます - 個々のデルタ値を選択的に編集することはできません
Technical Details
Hooks 3
hook_field_widget_info_alter
readonly_field_widgetをすべてのフィールドタイプで利用可能にします。モジュールは利用可能なすべてのフィールドフォーマッターを反復処理してサポートされているフィールドタイプを収集し、この完全なリストをreadonlyウィジェットのfield_typesプロパティに割り当てます。
hook_form_alter
閲覧権限に基づいてreadonlyウィジェットフィールドのフィールドアクセスを制御します。フィールドがreadonlyウィジェットを使用している場合、そのフォームアクセスは編集権限ではなく、現在のユーザーがフィールド値を閲覧できるかどうかに基づいて設定されます。これにより、閲覧のみのアクセス権を持つユーザーにもフィールドを表示できます。
hook_theme_suggestions_alter
readonlyウィジェットを使用する際のtitleフィールドに特化したテンプレート候補を処理します。Coreはノードタイトルの「field」テンプレートを上書きしますが、これはreadonly_field_widgetの動作と競合します。このhookは、readonlyウィジェットで設定されたタイトルに標準の「field」テンプレートが使用されることを保証します。
Troubleshooting 5
readonlyウィジェットはフィールドに値がある場合にのみ表示されます。フィールドにデフォルト値が設定されているか、エンティティにそのフィールドの既存の値があることを確認してください。新規エンティティフォームでは、デフォルト値のないフィールドは表示されません。
これは想定された動作です。フィールドのデフォルト値設定を表示する際、readonlyウィジェットはデフォルト値を設定するために編集可能なウィジェットに切り替える必要があることを示すステータスメッセージを表示します。一時的にウィジェットを変更し、デフォルトを設定してから、readonlyに戻してください。
フォーマッタータイプを変更した後、フォーマッター固有の設定を調整する前にAJAXリクエストが完了するのを待ってください。設定フォームは選択されたフォーマッターに基づいて動的に更新されます。
モジュールにはCoreのテンプレート上書きに対応するためのtitleフィールド用の特別な処理が含まれています。問題が続く場合、カスタムテーマがモジュールのテーマ候補と競合する方法でフィールドテンプレートを上書きしていないか確認してください。
モジュールは編集権限ではなく閲覧権限に基づいてフィールドアクセスを設定します。フィールドアクセスhookまたは設定が閲覧アクセスを正しく定義していることを確認してください。ユーザーから完全に非表示(閲覧アクセスなし)のフィールドはフォームに表示されません。
Security Notes 4
- readonlyウィジェットを通じて表示されるフィールド値は、Drupalのフィールドレベルのアクセス制御を尊重します - 閲覧アクセス権のないユーザーにはフィールドが表示されません
- ウィジェットはサーバーサイドのバリデーションを妨げません。error_validationを有効にすると、フィールドの制約違反をキャッチするのに役立ちます
- readonlyウィジェットを通じて値を変更することはできませんが、他のコードやAPIがフィールド値を変更する可能性はあります - これは表示のみの保護です
- モジュールはDrupalの標準エンティティビュービルダーとフォーマッターシステムを使用し、それらのセキュリティ特性を継承しています