Zend_Form_Element_Checkboxでハマる
こんにちは、バズー株式会社、開発チームリーダーの清水です。
バズーでは、アプリケーションプラットフォームとして、PHP の Zend 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 = ""