htmlフォーム→phpチェックして戻るときとか〜
・2012-03-06 記事修正しました。
簡易メールフォームについてです。
サンプルはこちら→W7工廠分室|トップページ
ただし、サンプルでは部分的にコメントアウトしてメール送信はできないようにしています。
(匿名メールフォームにも自分宛にもしたくないのでw 画面遷移は体験できます)
まあ・・・全部PHPで作ればいいのだけれどw
htmlでもうフォームまでつくっちゃったし。
そのときちょっとはまったのですが「htmlに戻ったとき入力データが消える」www
なんとかできたので自分メモ用に・・・
■画面遷移
入力フォーム画面(request.html)
→確認画面(エラー指摘/送信確認)(request2.php)
→送信完了画面(request2.php)
■仕様
htmlの<!--{mailform}-->の前後はPHPのexplodeで切り貼りするのでhtmlにメールフォームを組み込んだ形になる
■確認画面において
1.問題がない場合は送信・戻るボタン両方
2.問題がある場合は戻るボタンのみ
3.戻るボタンを押すとrequest.htmlに戻る(入力したデータはそのまま)
■結論
戻るボタンでsubmitをformの外に出してやらないとだめでした。
<!--送信ボタン--> <form action="" method="post"> <input type="hidden" name="mode" value="mailsend"/> <input type="submit" class="submit" id="mailsend" value="送信する"/> </form><!--/#mailform--> <!--戻るボタン--> <form action="" method="post"> <input type="hidden" name="mode" value="return"/> </form><!--/#mailform--> <input type="button" class="submit" id="return" value="戻る" onClick="history.back()"/> /* ←ここをformの外に出す */
formの中ではうまくいきませんでした。
そこらへんが理解できていないけどw
■ソース
request.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <link type="text/css" rel="stylesheet" href="css/base.css" media="screen"/> </head> <body> <div id="reqform"> <!--{mailform}--> <form action="request2.php#reqform" method="post"> <input name="subject" type="hidden" value="資料請求"/> <label for="name">氏 名<span class="essencial">(必須)</span></label> <input name="name" id="name" type="text" size="15"/><br /> <label for="tel">電 話<span class="essencial">(必須)</span></label> <input name="tel" id="tel" type="text"/><br /> <label for="mail">メール</label> <input name="mail" id="mail" type="text"/><br /> <label for="address">ご住所</label> <input name="address" id="address" type="text"/><br /> <label for="comment">備考欄</label> <textarea name="comment" id="comment" rows="" cols=""></textarea><br /> <input type="hidden" name="mode" value="validate"/><br /> <input type="submit" class="submit" id="validate" value="確認する"/> </form> <!--{mailform}--> </div> </body> </html>
request2.php
<?php session_start(); mb_language("japanese"); mb_internal_encoding("UTF-8"); require_once("./phplib/mail.php"); require_once("./phplib/validate.php"); define("MAILTO","めーるあどれす");/* ここに送信先のメールアドレス */ define("REQUEST","request.html"); class mailData2 extends mailData{ public function sendMail(){ //overwrite function $from="$this->name<$this->mail>"; $body="氏 名:$this->name\n連絡先:$this->tel\nメール:$this->mail\nご住所:$this->address\n備考欄:\n$this->comment"; $send=mb_send_mail($this->to,$this->subject,$body,"From:".$from); if($send){ ?> <p class="attention">送信しました。<br /> <?php echo $this->name.'様('; if($this->mail==""){echo $this->tel;}else{echo $this->mail;} ?>)へご連絡をさせて頂きます。<br /> </p> <?php }else{ echo "<p>送信失敗しました.</p>"; } } } class validateCheck2 extends validateCheck{ public function getRes(){ //new function if($this->flg){ return $this->data; }else{ return "$this->data<br /><span class='warning'>$this->emes</span>"; } } } function validateForm($m,$f){?> <table> <tr><th>氏 名:</th><td><?php echo $m->name?></td></tr> <tr><th>電 話:</th><td><?php echo $m->tel?></td></tr> <tr><th>メール:</th><td><?php echo $m->mail?></td></tr> <tr><th>ご住所:</th><td><?php echo $m->address?></td></tr> <tr><th>備考欄:</th><td><?php echo $m->comment?></td></tr> </table><br /> <?php if($f){?> <form action="" method="post"> <input type="hidden" name="mode" value="mailsend"/> <input type="submit" class="submit" id="mailsend" value="送信する"/> </form><!--/#mailform--> <?php } ?> <form action="" method="post"> <input type="hidden" name="mode" value="return"/> </form><!--/#mailform--> <input type="button" class="submit" id="return" value="戻る" onClick="history.back()"/> /* ←ここをformの外に出す */ <?php } function separateHTML($req){ return explode('<!--{mailform}-->',file_get_contents($req)); } $mode=htmlspecialchars($_POST['mode']); switch($mode){ case "validate": $m=new mailData2(MAILTO); $m->setData($_POST['subject'],$_POST['name'],$_POST['tel'],$_POST['mail'],$_POST['address'],$_POST['comment']); /*-- validate check --*/ $name=new validateCheck2($m->name); $name->nullCheck(); $m->name=$name->getRes(); $tel=new validateCheck2($m->tel); $tel->telCheck(); $m->tel=$tel->getRes(); $vflg=false; if($name->getFlg() & $tel->getFlg()){$vflg=true;} if($m->mail!=""){ $mail=new validateCheck2($m->mail); $mail->mailCheck(); $m->mail=$mail->getRes(); if($mail->getFlg() & $vflg){$vflg=true;}else{$vflg=false;} } /*-- echo html --*/ $html=separateHTML(REQUEST); echo $html[0]; validateForm($m,$vflg); echo $html[2]; $_SESSION['maildata']=serialize($m); break; case "mailsend": $m=unserialize($_SESSION['maildata']); $html=separateHTML(REQUEST); echo $html[0]; $m->sendMail(); echo $html[2]; break; case "return": break; default: echo "エラー"; exit(); } ?>
/phplib/mail.php
<?php class mailData{ var $to; var $subject; var $name; var $tel; var $mail; var $address; var $commnent; function __construct($mailto){ $this->to=$mailto; } public function setData($s,$n,$t,$m,$a,$c){ $this->subject=htmlspecialchars($s); $this->name=htmlspecialchars($n); $this->tel=htmlspecialchars($t); $this->mail=htmlspecialchars($m); $this->address=htmlspecialchars($a); $this->comment=htmlspecialchars($c); } public function sendMail(){ $from="$this->name<$this->mail>"; $body="$this->tel\n$this->address\n$this->comment"; $send=mb_send_mail($this->to,$this->subject,$body,"From:".$from); if($send){ return true; }else{ return false; } } } ?>
/phplib/validate.php
<?php class validateCheck{ var $data; var $flg; var $emes; function __construct($d){ $this->data=$d; } public function getMes(){ if($this->flg){ return ""; }else{ return $this->emes; } } public function getFlg(){ return $this->flg; } public function nullCheck(){ if($this->data==""){$this->flg=false;}else{$this->flg=true;} $this->emes="入力されていません"; } public function mailCheck(){ $this->flg=ereg("^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$",$this->data); $this->emes="アドレスが不正です"; } public function passCheck(){ $this->flg=ereg("[a-zA-Z0-9]{4,}",$this->data); $this->emes="4文字以上の数字・英文字です"; } public function nameCheck(){ } public function telCheck(){ $flg1=ereg("^[0-9]{2}\-[0-9]{4}\-[0-9]{4}$",$this->data); $flg2=ereg("^[0-9]{3}\-[0-9]{4}\-[0-9]{4}$",$this->data); if($flg1 || $flg2){$this->flg=true;}else{$this->flg=false;} $this->emes="XX-XXXX-XXXXまたはXXX-XXXX-XXXXです"; } public function dateCheck(){ $this->flg=ereg("[1-2][0-9]{3}-[0-1][1-9]-[0-3][0-9]",$this->data); $this->emes="XXXX-XX-XXです"; } public function commentCheck(){ } } ?>
@charset "utf-8"; *{ margin:0px; padding:0px; font-style:normal; font-weight:normal; line-height:1.5em; } body{ margin:20px; } table{ border-collapse:collapse; border-spacing:0; } label, th{ display:inline-block; width:100px; text-align:left; } input, textarea{ width:200px; font-size:1em; } input[type=button], input[type=submit]{ width:70px; } .warning{ font-size:x-small; color:red; }