はじめに
FormITの解説は今回でいったん終わりです。退屈されている方もいらっしゃるかもしれませんが、FormITは挙動がわかりやすいスニペットで、MODx全体を理解するのにも役立ちますので、今しばらくお付き合いください。
二重投稿を防止する
前回までのようなメールフォームを作成した場合、データ送信後に誤ってブラウザのリロードボタンが押されてしまうと、同じ内容がポストされてしまい、挙動としてはあまり美しくありませんし、大量のspam投稿が発生する可能性もあります。
こちらもカスタムのフックを活用することで、二重投稿を防止させることができます。二重投稿を防止させるための方法はいくつか考えられるでしょうが、今回は投稿時の「名前」「メールアドレス」「投稿内容」を連結した文字列のMD5ハッシュを作成し、セッション中に前回保存されたハッシュ値があれば比較、値が同じであれば、エラーを出力、そうでない場合は改めてセッションの内容を更新する、という形にしてみました。
フォーム用のリソースは例のごとく、次のようになります。スニペット中で定義している
というエラーは、[[!+fi.error.customError]]という形で表示させることができますので、任意の場所にこのタグを挿入しておきます。
投稿後、リロードボタンを押した場合の挙動は次のようになります。
メールアドレスの再確認
問い合わせフォームの中には、投稿者のメールアドレスをなるべく正確に取得するため、
の2つのテキストボックスを用意しておき、両方の値がマッチした場合に投稿を受け付ける、というものがあります。
これまでの練習内容から大体想像がつくかもしれませんが、カスタムフックを使用することで、このようなフォームも簡単に実現できます。
問い合わせフォームの内容は次のようになります。今回は解説の都合上、スタイルシートファイルを用意していませんので、HTML中にspanタグや文字色を直接ハードコードしていますが、実際には文字の装飾などはCSSファイル側で指定したほうがスマートでしょう。
また、これに合わせてDenyDuplicatedFormフックの内容も少し変更しておいたほうが良いでしょう。
画面の様子は次のようになります。
最後に
以上、3回に渡ってFormITスニペットの解説を行ってきましたが、メールフォームとはいえ非常に奥が深いことがご理解いただけたのではないかと思います。一点だけ注意点があるとすれば、スニペットのバージョンアップ時の挙動や仕様が変更になる可能性があるということです。FormITに限った話ではありませんが、バージョンアップ前には必ずバックアップをとるようにしておきましょう。