説明
何か、独自の処理をさせたい場合に真っ先に思いつくのはフックだと思います。
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追加画面、今回追加した独自処理を選択できるようになります。
今回はpreSaveメソッドをオーバーライドしているので、フォームの履歴がデータベースに保存される直前に呼び出されます。
なので、ここに配列をセットしてあげると入力した項目と合わせて独自の項目を保存するようなことが可能になります。
他にバリデーション時に呼びだされるメソッドや、保存後に呼びだされるメソッドがあるので、色んなことができそうです。
余談
webformの履歴はデータベースのどこに保存されるのか気になった人がいると思います。
webform_submission_dataテーブルに保存されるようです。
ワードプレスの記事とカスタムフィールドのデータベースの構造と似ていると言えば分かる方も多いと思いますが、
「webform_submission」テーブルが親テーブルにあり、「webform_submission_data」テーブルがkeyとvalueで保存されるデータベース構造みたいです。
webformの履歴のデータベース構造を把握しておけば、保存した項目を後からデータを取得して何かに使いたい場合も、躓くことなくデータの取得ができるのかなと思いました。