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