めも帖

「めも帖」代わりにダラダラと書いていったり、めもしたりしているだけです。

QuickFormでcheckboxを利用するとvalue=1になる時の対策方法

QuickFormでcheckboxを利用すると、value=1になるんです。どうやら調べていくと、チェックしたかどうか?の判別だけをしている様子。それだと困るので、どうしたらいいのか調べていた結果、独自のelementを登録すればいいらしい。一から作ると変なので、継承して作ります。作った結果がこれ。

拡張したチェックボックス(FormActionCheckBox)

<?php
/**
 * FormActionCheckBox
 */
require_once('HTML/QuickForm/checkbox.php');
class FormActionCheckBox extends HTML_QuickForm_checkbox
{
    function FormActionCheckBox($elementName=null, $elementLabel=null, $text='', $value=null, $attributes=null)
    {
        HTML_QuickForm_input::HTML_QuickForm_input($elementName, $elementLabel, $attributes);
        $this->_persistantFreeze = true;
        $this->_text = $text;
        $this->setType('checkbox');
        $this->updateAttributes(array('value'=>$value));
        $this->_generateId();
    }


    function getValue()
    {
        return $this->getAttribute('value');
    }

}
?>

拡張した独自elementを登録します。

$qf = new HTML_QuickForm('input_form', 'post');
// checkboxの拡張
$qf->registerElementType('FormActionCheckBox', 'FormActionCheckBox.php', 'FormActionCheckBox');
  • 第一引数は、エレメント名?
  • FormActionCheckBox.phpはファイルパス
    • これが結構曲者で、QucikFormがある場所を起点にして読み込みます
    • なので、フルパスを渡す必要がありました。
  • 第三引数は、クラス名?

Smartyと連携していると

getValue()をオーバーライド(でいいんだっけ)したのは、確認画面を出すとvalue=1になっているんです。そこで、このfunctionを書き換える必要がありました。
あと、独自のエレメントを使ってSmartyをレンダーにして書きだすとtoArrayがちょっと挙動が違うような...でも値は渡ってくるので、Smartyでゴニョゴニョしてみました。

Smartyテンプレート

{foreach from=$qf.独自拡張elementのname.value key=key item=item}{$qf.独自拡張elementのname.$key.value}{/foreach}

と書いて対応しました。

今後のQuickForm

PHP5の時代になり、どうなっていくのかなあ、と思います。cakePHPとかでお問い合せフォームを量産する方法もありそうです。ちょっとオーバースペックな気もします。ここらへんは、バランスを取りながら利用していくのがいいのかもしれませんね。