読者です 読者をやめる 読者になる 読者になる

m6uとFuelPHPとPostgreSQLとAndroid

FuelPHPまわりのメモ、初心者に産毛程度を生やす。

FuelPHP:Fieldsetでチェックボックスを扱う時の話

 ハマったのでメモ。
 9ensan作ViewFormパッケージを使っていて、はじめてadd_checkbox()を使ったら、これで半日ハマってしまった。 また同じことを繰り返しそうな気がするのでまとめます。

チェックボックスを複数個使うフォームに改造したのです→validationが通らなくなり
$fieldset = ViewForm\Fieldset::forge();
...
$this->arr_nooutput_r = array();
for ($i = 5; $i >= 1; $i--) {
    $this->arr_nooutput_r += array('r_'.$i => 'Rランク'.$i);
}
$fieldset->add_checkbox('no_output_r', 'Rランク出力抑止', $this->arr_nooutput_r);

…なんてコードを書いてました。 そしたら、「allow_empty_in_array」のルールに引っかかってバリデーションが通らなくなってしまったのです。

add_rule()してみても無駄でした
$fieldset = ViewForm\Fieldset::forge();
...
$this->arr_nooutput_r = array();
for ($i = 5; $i >= 1; $i--) {
    $this->arr_nooutput_r += array('r_'.$i => 'Rランク'.$i);
}
$fieldset->add_checkbox('no_output_r', 'Rランク出力抑止', $this->arr_nooutput_r)->add_rule('allow_empty_in_array', array_keys($this->arr_nooutput_r));

…としても同じです。 バリデーションが通らない。

もしかして連想配列で渡さず、配列で渡すものなのかな?→正解
$fieldset = ViewForm\Fieldset::forge();
...
$this->arr_nooutput_r = array();
for ($i = 5; $i >= 1; $i--) {
    array_push($this->arr_nooutput_r, 'Rランク'.$i);
}
$fieldset->add_checkbox('no_output_r', 'Rランク出力抑止', $this->arr_nooutput_r);

…としたところ、ウソだったみたいにバリデーションが通るようになりました。

生成されるinput要素を見ると、value属性はゼロ始まりの数字で、name属性は配列表記になってました

例えば

<input type="checkbox" value="0" id="form_no_output_r_0" name="no_output_r[0]" checked="checked" /><label for="form_no_output_r_0">Rランク5</label>

 こんな感じのhtml出力で、value属性を任意のものにしたいがために当初連想配列で渡したところ、おかしくなってしまったようです。
 これって、ViewFormパッケージ固有の話じゃなくて、ふつうにFieldsetクラスでadd()するときでも同じことなんじゃないかと。
 配列で渡そう。