htmlからPOSTされたデータをPHPで処理してメール送信するときに、いちいちインプット要素の分だけ変数をつくったり、配列を仕込んでおくと、送信スクリプト部分を使いまわしたくてもそれなりに修正が必要になってきます。
今回はその部分を楽する方法を考えてみましたのでそのメモです。
とりあえず書いてみた
フォームのデータはPOSTで送信した場合、$_POST[‘name’]で受け取ることができます。
これは、POSTで送信されたデータは、$_POST という連想配列に格納されるからです。
なので、これをこーんなかんじで自分用のPOSTデータを受け取る配列に入れ直します。
1 2 3 4 5 |
$formdata = array(); foreach ($_POST as $idx => $val) { $formdata[$idx] = $val; if (is_array($formdata[$idx])) $formdata[$idx] = implode(',',$formdata[$idx]); } |
こうすると、$_POST のぶんだけ連想配列で $formdata[‘name’] = val みたいなのをつくれます。
なんでわざわざこんな風にしたのかというと、グローバル変数をそのまま使うのがなんか気持ち悪いのと、チェックボックスなんかの値は配列で届くためです。
チェックボックスは、
1 |
<input type="checkbox" name="chk[]" id="chk" value="foo"><label for="chk">foo</label> |
という風に、nameを配列にして書きます。こうしないと、チェックボックスなんかで複数チェックを入れても1つしか値が取れないためです。
でも実際には配列の中身全部を平文にしてメールに書きたいので、値が配列だった時はカンマ区切りで分解してから配列に入れなおしています。
そして、このデータに対して、 extract という関数を使用します。
1 |
extract ($formdata,EXTR_SKIP); |
この関数は、配列から、キー名の変数を作ってキーの値を代入してくれます。
$formdata[‘name’] = foo;
という配列のデータは、
$name = foo;
という変数になるわけですね。
こうしておくことで、フォームのエレメントが変化しても、PHP側は修正せずとも自動的に全て$name値でとりだせるようになりますので、本文のテンプレートを修正するだけでOKになりますから、修正作業をぐっと減らすことができますね。
自分はテンプレート用のPHPファイルに、ヒアドキュメントを使ってだぁーっとメールの本文テンプレートをつくっています。
ヒアドキュメントの中では、{$var} で簡単に変数の中身を展開できますので、
1 2 3 4 5 6 7 8 |
$message_template = <<< EOF {$name}さんからメッセージがありました。 EOF ; $autoreply_template = <<< EOF こんにちは、{$name}さん。 EOF ; |
みたいな感じで、そのまま差しこみタグのような使い方が出来ます。
変数の名前と、フォームのname値が一致するので、あとでフォームを修正した時に、メール本文も簡単に修正できるようになるので、便利ですよ。
コメントする