第5回 Smartyを使って実用的なページを作ってみる(その1) - Smarty講座

PHP基礎編

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

ちょっと長いコードになりましたが、順に説明します。

yossy先生

まず、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/)

  



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)