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とかでお問い合せフォームを量産する方法もありそうです。ちょっとオーバースペックな気もします。ここらへんは、バランスを取りながら利用していくのがいいのかもしれませんね。