QuickFormとSmartyの連携[Pear::QuickForm]
QuickForm のdisplay関数で出力したフォームはお世辞にもデザイン的に優れているとはいえません。
そこで、デザイン部分をSmartyに担当させQuickFormとSmartyを連携させたいと思います。
<html>
<head>
<title>QuickForm サンプル</title>
</head>
<body>
<?php
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/Renderer/ArraySmarty.php';
require_once 'Smarty.class.php';
$objQF = new HTML_QuickForm('frmQF', 'get');
$defaultValue = array('txtNAME'=>'bnote','rdoSEX'=>'男');
$objQF->addElement('text', 'txtNAME', 'お名前は?');
$objQF->addElement('radio', 'rdoSEX','', '男',0);
$objQF->addElement('radio', 'rdoSEX','', '女',1);
$objQF->addElement('reset', 'btnCLEAR', 'クリア');
$objQF->addElement('submit', 'btnSUBMIT', '送信');
//デフォルト値の設定
$objQF->setDefaults($defaultValue);
if ($objQF->validate()) { // フォームの検証
//フォームに入力された値を凍結する。
$objQF->freeze();
}
$smarty = new Smarty;
$smarty->template_dir = './templates';
$smarty->compile_dir = './templates_c';
$smarty->cache_dir = './cache';
// Render関連の設定
$objRenderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty);
$objQF->accept($objRenderer);
$smarty->assign('OBJFORM',$objRenderer->toArray());
// 表示
$smarty->display('index.tpl');
?>
</body>
</html>
フォームの要素をセットするまでは、なんら変わりません。
Smartyには、フォームの要素情報を連想配列として渡すようにします。 そのために HTML_QuickForm_Renderer_ArraySmarty オブジェクトを使用します。
accept 関数でRendererとQuickFormが関連付けられます。 RendererオブジェクトのtoArray関数によりQuickFormの各要素が連想配列としてSmartyに渡されます。
Smarty側(テンプレート)は、通常の連想配列を扱うように処理を記述します。
どのような形で渡されるかを知りたい場合、 var_dump($objRenderer->toArray()) として確認してください。