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())として確認してください。