第5回 Smartyを使って実用的なページを作ってみる(その1) - Smarty講座
yossy先生のSmarty講座
Lecutures on PHP
第5回 Smartyを使って実用的なページを作ってみる(その1) (その3)
登録完了画面を作る
次に、入力画面からPOSTされた内容を受理し、その結果を表示するページを用意します。PHP側のファイル名はpost.phpとします。
post.php
<?php
// 共通の設定を読み込む
require_once( 'common.php' );
// Smartyオブジェクト取得
$smarty =& getSmartyObj();
// Smartyテンプレートに渡すパラメータ配列
// POSTされたデータをあらかじめ入れておく
$params = array(
'name' => $_POST['name'],
'address' => $_POST['address'],
'type' => $_POST['type'],
'title' => $_POST['title'],
'content' => $_POST['content']
);
// 問い合わせ種類(common.phpに入れた方がいいかも?)
$types = array(
'request' => '意見、要望',
'question' => '質問、問い合わせ',
'other' => 'その他'
);
// データのバリデーションを行う
$errors = validate();
// バリデーションに失敗したらフォームを再度表示
if( ! empty( $errors ) ){
$smarty->assign( 'content_tpl', 'form.tpl' );
// エラー箇所
$params['errors'] = $errors;
// 問い合わせ種類の配列を再度渡す
$params['types'] = $types;
}
// バリデーションに成功
else{
// POSTされた問い合わせ内容を登録する。メールを送ったり、DBに登録したり…
// (ここでは省略)
// 受理した内容を表示
$smarty->assign( 'content_tpl', 'post.tpl' );
// 問い合わせ種類の表記
$params['type_str'] = $types[ $_POST['type'] ];
}
// パラメータをSmartyオブジェクトに渡して画面表示
$smarty->assign( 'params', $params );
$smarty->display( 'template.tpl' );
/**
* POSTされた内容のバリデーションを行う
*
* @return エラー情報配列。項目がキー
*/
function validate()
{
// エラー情報配列
$errors = array();
// 名前が書かれているか
if( empty( $_POST['name'] ) ){
$errors['name'] = true;
}
// 正しいメールアドレスが書かれているか
// メールアドレスチェックを厳密にやるのは難しいのでここではとりあえずの正規表現で
// PEARが使えるのであれば、PEAR::Mail_RFC822を使ってもいいかも
$regex = '/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i';
if( ! preg_match( $regex, $_POST['address'] ) ){
$errors['address'] = true;
}
// お問い合わせ種類の値は正しいか?
global $types;
if( array_search( $_POST['type'], array_keys( $types ) ) === FALSE ){
$errors['type'] = true;
}
// お問い合わせ件名が書かれているか
if( empty( $_POST['title'] ) ){
$errors['title'] = true;
}
// お問い合わせ内容が書かれているか
if( empty( $_POST['content'] ) ){
$errors['content'] = true;
}
return $errors;
}
?>
ちょっと長いコードになりましたが、順に説明します。

まず、POSTされたデータのバリデーションを行います。バリデーションとは「検証」という意味で、有効な値かどうかのチェックを行います。ソースの後半でバリデーションを行う関数validate()を作成しています。この関数では値が正しく入力されているか、メールアドレスとして有効な値か、などをチェックしています。もしチェックに引っ掛かった値があった場合は、その項目の配列を返します。
バリデーションの結果から、再度フォームを表示するか、POSTされた内容を登録して結果を表示するか決定します。もしエラーがある場合は、そのエラー情報をSmartyテンプレートに渡します。(*3)
もしPOSTされた内容に問題がない場合は、登録処理をし、受理内容を表示します。登録処理はそれぞれ業務フローにあわせて、担当者にメールを送信したりDBに登録したりする処理を書いてみてください。受理内容は、post.tplというテンプレートファイルで表示します。
post.tpl
<p>以下の内容で受理しました。お問い合わせありがとうございました。</p>
<dl>
<dt>お名前</dt>
<dd>{$params.name|escape:'html':'UTF-8'}</dd>
<dt>メールアドレス</dt>
<dd>{$params.address|escape:'html':'UTF-8'}</dd>
<dt>お問い合わせ種類</dt>
<dd>{$params.type_str}</dd>
<dt>お問い合わせ件名</dt>
<dd>{$params.title|escape:'html':'UTF-8'}</dd>
<dt>お問い合わせ内容</dt>
<dd>{$params.content|escape:'html':'UTF-8'|nl2br}</dd>
</dl>
前回説明した修飾子escapeを用いて、POSTされた内容をそのまま表示せず、エスケープして表示しているところに注意してください。
-------
*3)今回は自作しましたが、SmartyValidateというプラグインも公開されているので、もし興味があれば試してみてください。(http://www.phpinsider.com/php/code/SmartyValidate/)





ページのトップへ


kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。