Drupal 開発ディレクター兼エンジニアが仕事、育児、本など雑多に書くブログ

Drupal: Webformにバリデーションを実装する

まとまった情報はそのうち会社のブログに書くとして、忘れないうちにメモ。

Webformのバリデーションについて調べてみると、まずWebform Validationというモジュールに行き着く。 https://www.drupal.org/project/webform_validation

Drupal 7ではこのモジュールが多く使われていたようだが、Drupal 8, 9へ対応したバージョンはアルファ版に留まっている。

続いてたどり着くのはこのページ。DrupalのWebformへバリデーションを実装する手順が記載されている。
https://www.drupal.org/docs/8/modules/webform/webform-cookbook/how-to-add-custom-validation-to-a-webform-element

hook_webform_element_alter()を使用した実装はOld wayとなっており、対比してHandlerを使った実装方法が紹介されている。

この実装で必要な手順は大きく4つ。

  1. webform/src/Plugin/WebformHandler/HogehogeWebformHandler.phpを作成
  2. validateForm()メソッドを実装
  3. 上記メソッド内で使用するvalidateHogehoge()メソッドを実装
  4. Webform管理画面からハンドラーを追加

1,2は概ねサンプルを見ながら書けば良い。
3に具体的なバリデーションロジックを書く。
用意したバリデーションを4でWebformに紐付ける。

hookを利用した実装と違うのは、バリデーション機能をハンドラーとして個々のWebformとは完全に切り離して実装できる点だろうか。

つまり、Handlerではどのフィールドにどういうバリデーションを実装するかだけを書いて、具体的にどのフォームで使うかということは考えなくて良い。
こうすることで、Webformが増えた際は管理画面からハンドラーを追加するだけで対応できるようになっている。
hookでWebformの種類をチェックして処理する実装だと、Webformを追加した際にコードを書き加える必要が出てくる。

ちなみに簡単なバリデーションはWebformのフィールド編集画面から追加できるため、まずはそれで対応できるかを考えた方が良い。

エンジニア一年生でもなんとかコードを書いてるので、Drupalの抽象化された仕組みは凄いな〜と思う。