2012年7月26日木曜日

チェックボックスのバリデーションや値の受け渡しで悩む(FuelPHP)

FuelPHPのFormクラスを使ってチェックボックスを使う際にちょっとハマったことを。

まず、バリデーションについてですが自前で実装しました。自前といってもいいサンプルがあったんでそれを真似してます。

FuelPHPでcheckboxのバリデーション
http://btt.hatenablog.com/entry/2012/06/14/143043


次に値の受け渡しです。

普通の input とかの場合だと
<?php echo Form::input('name', Input::post('name', isset($user) ? $user->name : '')); ?>

バリデーションでエラーを戻した場合は Input::post で入力された値を取得、post されていない場合はモデルから取得した値、何もなかったら空白。

チェックボックスの場合、リストを配列から回しながら表示していくと思います。
for ($groups as $group) {
    echo Form::checkbox('groups[]', $group->id, array('id' => 'group_'.$group->id));
    echo Form::label($group->name, 'group_'.$group->id);
}

ただ表示するだけだとこんなかんじになるのかなと・・・

これに input と同じような仕組みを付け加えると
for ($groups as $group) {
    echo Form::checkbox('groups[]', $group->id,
                            in_array($group->id, Input::post('groups', array())) ?
                            array('id' => 'group_'.$group->id, 'checked' => 'checked') :
                            array_key_exists($group->id, isset($user) ? $user->groups : array()) ?
                            array('id' => 'group_'.$group->id, 'checked' => 'checked') :
                            array('id' => 'group_'.$group->id)
                        );
    echo Form::label($group->name, 'group_'.$group->id);
}

なんか大変なことになってしまった・・・

checkbox を Input::post で受け渡しすると checkbox の value が配列の値として入ってくるけどモデルから取得した値は、キーになってる。
(中身を展開すればもちろん値としてもあるわけですが・・・)

考えてると結果こうなってしまいました。
もっとスマートな方法はないものかと・・・



0 件のコメント:

コメントを投稿