開発メモ,主に補足by子連れ親父プログラマー

2011-09-16

CakePHP1.3で作る会員管理システム(14) checkbox の validate

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 テーブル にもデータが保存されています。

ブログ アーカイブ

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー