2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DrupalAdvent Calendar 2024

Day 13

Drupalのwebformに独自の処理を追加してみる

Last updated at Posted at 2024-12-14

説明

何か、独自の処理をさせたい場合に真っ先に思いつくのはフックだと思います。
webformにも「hook_webform_submission_presave」や「hook_webform_submission_insert」などのフックが用意されています。

ただ、このような、フックでは管理画面で任意のフォームだけにその処理を適用させることができません。(フック上で条件分岐したりしたら一応は可能ですが...)
そのようなことをしたい場合は、webformに用意されているhandlerを使えばよりスマートに記述できると発見しましたのでご紹介します。

コード

/**
 * カスタムハンドラー.
 *
 * @WebformHandler(
 *   id = "custom_handler",
 *   label = @Translation("カスタムハンドラー"),
 *   category = @Translation("外部"),
 *   description = @Translation("履歴作成前の処理をカスタマイズします"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_IGNORED,
 *   submission = \Drupal\webform\Plugin\WebformHandlerInterface::SUBMISSION_REQUIRED,
 * )
 */
class CustomHandler extends WebformHandlerBase {

  /**
   * {@inheritdoc}
   */
  public function preSave(WebformSubmissionInterface $webform_submission) {
    // フォームの入力データ.
    $data = $webform_submission->getData();
    $data['custom_data'] = '入力項目にないデータを保存します。';
    $webform_submission->setData($data);
  }

}

コード解説

上のコードを記述すると、handler追加画面、今回追加した独自処理を選択できるようになります。

test2.png

今回はpreSaveメソッドをオーバーライドしているので、フォームの履歴がデータベースに保存される直前に呼び出されます。
なので、ここに配列をセットしてあげると入力した項目と合わせて独自の項目を保存するようなことが可能になります。
他にバリデーション時に呼びだされるメソッドや、保存後に呼びだされるメソッドがあるので、色んなことができそうです。

余談

webformの履歴はデータベースのどこに保存されるのか気になった人がいると思います。
webform_submission_dataテーブルに保存されるようです。
ワードプレスの記事とカスタムフィールドのデータベースの構造と似ていると言えば分かる方も多いと思いますが、
「webform_submission」テーブルが親テーブルにあり、「webform_submission_data」テーブルがkeyとvalueで保存されるデータベース構造みたいです。

webformの履歴のデータベース構造を把握しておけば、保存した項目を後からデータを取得して何かに使いたい場合も、躓くことなくデータの取得ができるのかなと思いました。

test1.png

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?