色々なメールフォームプログラムは、
無料でもあるし、有料でも簡単に使えるものなど沢山ありますが
様々な場面を考慮し、かつ簡単に作れるようにするため、案件ごとで見れば不必要なプログラムまで内包しているものです。
そのせいで色々な制約や仕様に従う必要が出てきて逆にややこしいときがあります。
メールフォームプラグインなどの中身を見るとコアの部分は思ったより大したことしてなさそうなので、一度機能を削ぎ落として作ってみようかと思いました。
しかし本職がプログラマではないので、勘でオリジナリティ溢れるやり方をしてる可能性が高いです。あくまで参考のひとつとして、そして自分の勉強のためにやってみてるんだろうなーという優しい目で見てください。
■想定する構造
1 2 3 4 |
index.php … 入力ページ confirm.php … 確認ページ mai.php … 送信プログラム thanks.php … 完了ページ |
■手順1
メールフォーム以前の手順になりますが、
「入力」⇒「確認」⇒「完了」という流れで遷移させて、いきなり「確認ページ」に来ても「入力ページ」にリダイレクトするところまでやります。
ページ遷移だけで言えば、formタグもaタグと基本的に変わらなそうな予感がしますので、aタグのhrefと同様に絶対パスや相対パスでaction属性に設定して、サブミットすればページ遷移できました。
1 |
<form method="post" action="{遷移したい飛び先のパス}"> |
今回は「入力ページ」から「確認ページ」に行きたいので
1 |
<form method="post" action="confirm.php"> |
となります。
次に、いきなり「確認ページ」に来ても「入力ページ」に戻す方法ですが、これは送信ボタン自体にもフォーム部品と同様にname値が指定できますので当然「確認ページ」にPOSTされるだろうと思い、「確認ページ」でPOST情報をprint_rしてみました。
1 2 3 |
<form method="post" action="confirm.php"> <input type="submit" name="input" value="確認画面へ"> </form> |
1 2 3 4 |
Array ( [input] => 確認画面へ ) |
バッチリやで!
ということで、confirm.phpの冒頭で
1 2 3 4 5 6 |
<?php if( empty($_POST['input']) ) { header('location: index.php'); exit(); } ?> |
POST情報の中でname=”input”が空だったら、index.phpにリダイレクトして、exit()でそれ以降の処理を停止します。
これで手順1のタスクは完了。
送信ボタンだけだと寂しいのでなんとなくinput type=”text”をつけて「確認ページ」でも入力内容表示してそれっぽくしたのが下記ソース。
1 2 3 4 |
<form method="post" action="confirm.php"> <input type="text" name="text" value=""> <input type="submit" name="input" value="確認画面へ"> </form> |
1 2 3 4 5 6 7 |
<?php if( empty($_POST['input']) ) { header('location: index.php'); exit(); } ?> <p><?php echo $_POST['text']; ?></p> |
■手順2
初歩中の初歩は出来たので、今後は実際に「入力」⇒「確認」⇒「完了」まで進みたいと思います。
あと完了ページにてコンバージョンタグを設置するときのことも考え、フォーム送信後、完了ページに来て、その場でリロードしても「入力ページ」に戻ってくれて、二重に計測されない設計をしたいと思います。
まずは「確認ページ」から「mail.php」に入力内容を飛ばして「完了ページ」に遷移したいと思います。
先ほどの「確認ページ」のソースからちょっといじって
1 2 3 4 5 6 7 8 9 10 11 |
<?php if( empty($_POST['input']) ) { header('location: index.php'); exit(); } ?> <form method="post" action="mail.php"> <p><?php echo $_POST['text']; ?></p> <input type="hidden" name="text" value="<?php echo $_POST['text']; ?>"> <input type="submit" name="confirm" value="送信する"> </form> |
確認してもらうためにPOST情報を表示して、hiddenフィールドも設定しておきます。
ソースで見ると見た目が違うだけで「入力ページ」と何も変わらないことが分かりました。
次に「mail.php」ですが、先ほどの応用して
1 2 3 4 5 6 7 8 9 |
<?php if( empty($_POST['confirm']) ) { header('location: index.php'); exit(); } else { header('location: thanks.php'); exit(); } ?> |
メール送信のプログラム自体は後付けにしますので今は遷移だけ。
name=”confirm”が空なら、つまり「確認ページ」で「確認画面へ」のボタンを押して遷移してこなかった場合は「入力ページ」にリダイレクト。
name=”confirm”があれば「完了ページ」にリダイレクトです。
これで「入力」⇒「確認」⇒「完了」の流れが出来ました。
次に「完了ページ」でのリロード対策ですが、
まず「完了ページ」へはPOSTされてきたわけではなくリダイレクトされてきた訳ではないので先程までの方法では「入力ページ」にリダイレクトできません。
というかそもそもPOSTされてきたらリロードしてもPOST情報は背負ったままなので考え方が違いました。
なので考えた結果、下記のように
1 2 3 4 5 6 7 8 9 10 11 |
<?php if( empty($_POST['confirm']) ) { header('location: index.php'); exit(); } else { session_start(); $_SESSION['form_comp'] = true; header('location: thanks.php'); exit(); } ?> |
1 2 3 4 5 6 7 8 9 10 |
<?php session_start(); if( !isset($_SESSION['form_comp']) ){ header('location: index.php'); exit(); } else { unset($_SESSION['form_comp']); echo '<p>送信が完了しました。</p>'; } ?> |
「mail.php」で「完了ページ」に遷移する際、SESSIONを持たせておきます。
そして「完了ページ」表示の際に、SESSIONを削除しておきます。
そうすれば「完了ページ」表示前はSESSIONを持っているが、表示後にはSESSION持ってないのでリロードしたら「入力ページ」に戻ります。
この辺から、あやしくなってきました。
本職の人が見れば、なんだこの作りは…と怒られそうな予感もしますが、とりあえずこれ以降はまた追々書きます。
1件のコメント