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(){
	}
}
?>



/css/base.css

@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;
}