読者です 読者をやめる 読者になる 読者になる

HTML_QuickForm と Smarty のフォームで MYSQLに保存

なんだかタイトルが良く分からんですが HTML_QuickForm でフォーム作って Smartyレンダリングして MYSQL にデータをインサートするフォーム。PEARSmarty の連携ってあまり解説している所が少ないのよね…。で。あれやこれや試して簡単な入力フォームを作成。最初に DB のテーブルは作っておくこと。PEAR::DB も使用。

form.php

< ?php
//ライブラリとSmartyの読み込み
require_once("HTML/QuickForm.php");
require_once("HTML/QuickForm/Renderer/ArraySmarty.php");
require_once("Smarty.class.php");

//色々と文字処理(これは全角英数を半角英数に)
function constForm($values){return mb_convert_kana($values,"a");}

//DBに書き込み処理
function insertDB($values) {
  require_once("DB.php");
  $db=DB::connect("mysql://USER:PASSWORD@SERVER/DBNAME");
  $db->query("INSERT INTO TABLE(name,old,address,email) VALUES(?,?,?,?)",array($values[name],$values[old],$values[address],$values[email]));
  $db->disconnect();
}

//フォーム作成
$form=new HTML_QuickForm("myForm");
$form->addElement("header",NULL,"フォームサンプル");
$form->addElement("text","name","本名:",array("size"=>14,"maxlength"=>256));
$form->addElement("text","old","年齢:",array("size"=>3,"maxlength"=>10));
$form->addElement("text","address","住所:",array("size"=>14,"maxlength"=>256));
$form->addElement("text","email","e-mail:",array("size"=>14,"maxlength"=>256));
$form->addElement("submit","sbm","送信");

//検証ルールとエラー表示
$form->addRule("name","<font color='#FF0000'>名前は必須項目です</font>","required",NULL,"client");
$form->addRule("email","<font color='#FF0000'>アドレスが無効です</font>","email",NULL,"client");

//文字処理
$form->applyFilter("__ALL__","constForm");

//送信された内容が検証ルールを満たしている場合の処理
if($form->validate()) {
  //DBの書き込み処理の呼び出し
  $form->process("insertDB",FALSE);
} else {
  //Smarty設定
  $smarty = new Smarty;
  $smarty->template_dir = "./templates";
  $smarty->compile_dir = "./templates_c";
  $smarty->cache_dir = "./cache";

  //フォーム表示
  $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty);
  $form->accept($renderer);
  $smarty->assign('form',$renderer->toArray());
  $smarty->display("form.tpl");
}
?>

form.tpl

<html><body>
<form {{$form.attributes}}>
{{$form.errors.name}}
{{$form.errors.email}}
{{$form.name.label}}
{{$form.name.html}}
{{$form.old.label}}
{{$form.old.html}}
{{$form.address.label}}
{{$form.address.html}}
{{$form.email.label}}
{{$form.email.html}}
{{$form.sbm.html}}
</form>
</body></html>

すっごい簡単だけどこんな感じ。項目テキトー。このままだと投稿後は真っ白な画面なので $form->validate() の部分に「応募ありがとうございました」とか include。