Zend_Form_Element_Checkboxでハマる

こんにちは、バズー株式会社、開発チームリーダーの清水です。

バズーでは、アプリケーションプラットフォームとして、PHPZend Framework を全面的に採用しています。フォームオブジェクトして標準コンポーネントの Zend_Form を使っているのですが、Zend_Form_Element_Checkbox でハマりました。

よく「プライバシーポリシーに同意する」にチェックボックスが付いていて、必ずチェックしないと先に進めないようなページがありますよね。Zend_Form_Element_Checkbox を使えば、このような感じのコードになります。


$form = new Zend_Form();
$element = new Zend_Form_Element_Checkbox('privacy');
$element->setRequired(true);
$element->addElement($element);

setRequired(true) つまり入力必須にすると、「Zend_Validate_NotEmpty」バリデータが自動的に追加されます(ここ重要)。

ここで、未チェック状態なら $form->isValid($_POST) が失敗するはずなのですが、なぜかエラーになりません。未チェック状態だと $_POST['privacy'] = "0" が飛ぶのですが、ソースを追った結果、Zend_Validate_NotEmpty が "0" を空っぽと認識してくれないのが問題ののようです。そもそも PHP では POST した値は数値でもすべて文字列として処理されるようです(なんて最悪な仕様なんだと思いますが・・・)。

試行錯誤した結果、$element->setUncheckedValue('') と空文字を設定してやれば上手くいくことがわかりました。

OKなパターン(メソッドでゴリゴリ編)


$form = new Zend_Form();
$element = new Zend_Form_Element_Checkbox('privacy');
$element->setRequired(true);
$element->setUncheckedValue(''); // クイックハック!
$element->addElement($element);

OKなパターン(INIファイル編)


xxx.elements.privacy.type = "checkbox"
xxx.elements.privacy.options.required = true
xxx.elements.privacy.options.uncheckedValue = ""