Unique Field AJAX
指定したフィールドに一意の値を強制する軽量モジュールで、オプションでAJAXベースのリアルタイムバリデーションを提供します。
unique_field_ajax
インストール
composer require 'drupal/unique_field_ajax:^2.2'
概要
Unique Field AJAXモジュールは、管理者が指定したフィールドに入力されるコンテンツが同一のコンテンツバンドル内で一意であることを要求できるようにします。これは、製品コード、シリアル番号、メールアドレスなど、重複した値を防止すべきフィールドに特に有用です。
このモジュールは、言語ごとの一意性チェック、大文字小文字を区別するまたは区別しないマッチング、AJAXベースのリアルタイムバリデーションフィードバックなどのオプションを備えた柔軟な一意性チェック機能を提供します。管理者は、トークンを使用してエラーメッセージや警告メッセージをカスタマイズし、重複した値を持つ既存のコンテンツへのリンクを表示できます。
標準的なフィールドに加えて、コンテンツタイプ設定フォームを通じてコンテンツタイプのタイトルに一意性を適用することもサポートしています。すべての設定は既存のフィールド設定インターフェースを通じて行われ、追加の管理ページは必要ありません。
Features
- 同一コンテンツバンドル内で単一値フィールドに一意の値を強制
- 言語ごとの一意性チェック - 同一言語内での重複を防止しながら、異なる言語バージョンでは同じ値を許可
- ユーザーが入力中に一意性をチェックし、フォーム送信前に即座にフィードバックを表示するAJAXベースのリアルタイムバリデーション
- テキストベースのフィールドに対する大文字小文字を区別するまたは区別しないマッチングオプション
- 警告を表示しながらも重複した値の保存を許可するオプションの「一意性を強制しない」モード
- トークンをサポートするカスタマイズ可能なエラーおよび警告メッセージ:%link(既存エンティティへのリンクを表示)と%label(フィールドラベルを表示)
- コンテンツタイプ設定フォームを通じたコンテンツタイプのタイトル一意性強制
- 複数のフィールドタイプをサポート:string、string_long、list_string、text、email、entity_reference、path、uri、link、integer、decimal、color_field_type
- 開発者が一意性クエリと結果を変更できるフックによる拡張性
- 追加のデータベーステーブルや設定エンティティは不要 - Drupalのサードパーティ設定システムを使用
Use Cases
一意の製品SKU
ECサイトでは、各製品が一意のSKU(在庫管理単位)を持つ必要があります。重複エントリを防止するために、SKUフィールドで一意性を有効にして設定します。「ABC-123」と「abc-123」を異なる製品として扱う場合は大文字小文字を区別するマッチングを使用し、重複として扱う場合は区別しないマッチングを使用します。
ユーザープロファイルの一意のメールアドレス
会員制サイトがユーザープロファイルのカスタムフィールドに追加のメールアドレスを保存します。このメールフィールドで一意性を有効にして、2人のメンバーが同じ連絡先メールを共有しないようにします。カスタムエラーメッセージを「このメールアドレスは既に別のアカウントに関連付けられています。」と設定できます。
言語ごとの一意の記事タイトル
多言語ニュースサイトが同一言語内での記事タイトルの重複を防止しながら、異なる翻訳で同じタイトルを使用できるようにしたい場合。「言語ごと」オプションを有効にすると、英語版とスペイン語版の両方で「Breaking News」を使用できますが、同じタイトルの2つの英語記事は防止されます。
警告メッセージによるソフトな強制
編集者に潜在的な重複コンテンツについて警告しながらも、必要に応じて保存する能力を維持するコンテンツ管理ワークフロー。「一意性を強制しない」とAJAXバリデーションを有効にします。編集者は「類似のコンテンツが既に存在します:%link」のような警告を見ますが、実際には重複ではないと判断した場合はコンテンツを保存できます。
リアルタイムバリデーション付きシリアル番号
製造アプリケーションがシリアル番号で製品を追跡します。AJAXバリデーションを有効にすると、倉庫作業員が入力中にシリアル番号がシステムに既に存在するかどうかを、フォームを送信する前に即座に確認できます。これによりデータ入力エラーを防ぎ、登録プロセスをスピードアップします。
一意の外部参照ID
外部システムから一意の識別子を使用してコンテンツを同期する統合シナリオ。テキストフィールドを設定して外部IDを保存し、一意性を有効にして重複レコードの誤ったインポートを防止します。hook_query_unique_field_ajax_alterを使用して、公開済みコンテンツのみをチェックするなどの追加条件を追加できます。
Tips
- 最高のユーザーエクスペリエンスのためにAJAXバリデーションを使用してください - ユーザーはフォーム送信を待たずに即座にフィードバックを受け取れます。
- カスタムメッセージの%linkトークンは、重複した値を持つ既存コンテンツへのリンクを作成し、ユーザーが既存コンテンツを確認しやすくなります。
- 言語ごとの一意性は、翻訳されたコンテンツが製品名などのフィールド値を正当に共有する可能性がある多言語サイトに特に有用です。
- 「一意性を強制しない」オプションとカスタム警告メッセージの組み合わせは、ユーザーに通知しながらもブロックしないソフトバリデーションシナリオに理想的です。
- hook_query_unique_field_ajax_alterを使用して、公開済みコンテンツのみや特定の日付範囲内のコンテンツのみをチェックするなどのカスタム条件を追加できます。
- 一意性設定をバージョン管理に保持するためにフィールド設定をエクスポートしてください - 設定はフィールド設定のサードパーティ設定として保存されます。
- プログラムによるエンティティ作成では、エンティティバリデーション中に一意性バリデーションが適用されます - 保存前に\$entity->validate()を使用してチェックしてください。
Technical Details
Admin Pages 2
/admin/structure/types/manage/{node_type}
コンテンツタイプのタイトル一意性強制を設定します。有効にすると、このコンテンツタイプ内でノードタイトルが一意である必要があります。このセクションはコンテンツタイプ編集フォームの垂直タブに表示されます。
/admin/structure/types/manage/{node_type}/fields/{field_name}
特定のフィールドに対する一意の値の強制を設定します。このセクションはフィールド設定フォームの垂直タブに表示されます。サポートされているタイプの単一値フィールドでのみ利用可能です。
Hooks 2
hook_query_unique_field_ajax_alter
フィールド値が一意かどうかをチェックするために使用されるデータベースクエリをモジュールが変更できるようにします。このフックは、追加の条件を加えたり、既存の条件を変更したり、一意性ロジックを完全に変更したりするために使用できます。
hook_unique_field_ajax_unique_results_alter
クエリ実行後の一意性チェック結果をモジュールが変更できるようにします。これは、カスタムロジックに基づいて一意性の結果をオーバーライドするために使用できます。
Troubleshooting 6
このモジュールは単一値フィールドのみをサポートしています。複数値(カーディナリティ > 1)フィールドは一意性を設定できません。一意性が必要な場合は、フィールドストレージ設定でフィールドのカーディナリティを1に変更してください。
「一意性を強制しない」が有効な場合、AJAXバリデーションはエラーの代わりに警告を表示し、フォームの送信は許可されます。重複した送信を完全に防止したい場合は、このオプションを無効にしてください。
このモジュールは特定のフィールドタイプのみをサポートしています:string、string_long、list_string、text、email、entity_reference、path、uri、link、integer、decimal、color_field_type。その他のフィールドタイプはサポートされていません。
デフォルトでは、モジュールは大文字小文字を区別しないマッチングを使用します。大文字小文字を区別する動作が見られる場合は、フィールド設定で「大文字小文字を区別」が有効になっていないか確認してください。また、MySQLのデフォルトの照合順序が大文字小文字の区別に影響する可能性があるため、データベースの照合順序が期待と一致していることを確認してください。
このモジュールは同一バンドル(コンテンツタイプ)内で一意性を強制します。バンドルを跨いだバリデーションが見られる場合は、同じコンテンツタイプ内でテストしていることを確認してください。モジュールは自動的にクエリにバンドル条件を追加します。
%linkトークンは、現在のユーザーが重複した値を持つ既存エンティティへの表示アクセス権を持っている場合にのみ機能します。ユーザーがアクセス権を持っていない場合、代わりに「不明なエンティティ」が表示されます。