checkbox の validate

動作がおかしい「好きな物」のチェックボックスを直していきます。

「好きな物」は Favorite モデルですが、あくまでここでは Member を登録している訳ですから Member モデルとして処理します。
今 add.ctp でこうなってる部分を、

        echo $this->Form->input('Favorite', array('multiple'=>'checkbox', 'label' => '好きな物'));
こうします。

        echo $this->Form->input('favorites', array('multiple'=>'checkbox', 'label' => '好きな物'));

するとなんと!

<input type="checkbox" id="MemberFavorites1" value="1" name="data[Member][favorites][]">

こういうソースが生成されます。
これはモデル Member です。

ということで Member モデルの方にルールを書きます。
/app/models/member.php の $validate が書かれている部分の 'birthday' の下に以下を追加します。

        'favorites'=>array(
            'custom' => array(
                'rule'=>array('multiple', array('min' => 1, 'max' => 3)),
                'message' => '好きな物は一つ以上選択してください'
            ),
        ),

次にコントローラに移動して、確認画面の時に validate するように members_controller.php を書き換えます。

if (!empty($this->data)) {
から始まる if 文の最初に、
$this->data['Favorite']['Favorite'] = $this->data['Member']['favorites'];
を入れます。

これで favorites を本来の Favorite に入れ直しています。 で、

if ($this->data['Member']['mode'] == 'confirm') {
から始まる mode="confirm" の部分の if 文を以下のように変えます。

if ($this->data['Member']['mode'] == 'confirm') {
    $this->Member->set($this->data);
    if ($this->Member->validates($this->data)) {
        $this->set('member', $this->data);
        $this->render('confirm');
    } else {
        $this->Session->setFlash(__('エラーがあります', true));
    }
} elseif ($this->data['Member']['mode'] == 'back') {//

これで正しくエラーチェックが動くようになりました。

あとまだ、好きな物チェックボックスの確認画面がおかしいので、
今 confirm.ctp の

    echo $this->Form->input('Favorite', array('type'=>'hidden'));
こうなっているところを、
    foreach ($member['Member']['favorites'] as $k => $v){
        echo $this->Form->input("Member.favorites.$k", array('type'=>'hidden'));
    }
このようにします。

これで生成されるHTMLの hidden の部分が、

<input id="MemberFavorites0" type="hidden" value="1" name="data[Member][favorites][0]">
<input id="MemberFavorites1" type="hidden" value="3" name="data[Member][favorites][1]">
のように出力されるようになります。

戻るボタンクリックでも値が保持されています。
今まで保存されていなかった members_favorites テーブル にもデータが保存されています。