6月 05
15.Validate続き
ということで validate の検討も終わったので、実装します。
/app/models/member.php の、今こうなっているところの
class Member extends AppModel {
var $name = 'Member';
直下に、以下を追加して
var $validate = array( );
この () の中にルールを書いていきます。
まずはメールアドレス。
'email' => array( "rule1" => array( "rule" => 'isUnique', "message" => "このメールアドレスは既に登録されています", ), "rule2" => array( "rule" => 'email', "message" => "メールアドレスを正しく入力してください", ), "rule3" => array( "rule" => 'notEmpty', "message" => "メールアドレスを入力してください", ), ),
パスワードはこんな感じで。
'password' => array(
"rule1" => array(
"rule" => array("custom", '/^[a-zA-Z0-9\_\-]{6,10}$/i'),
"message" => "パスワードは6文字以上10文字以内で入力してください",
),
"rule2" => array(
"rule" => 'notEmpty',
"message" => "パスワードを入力してください",
),
),
type_id と birthday も念のため入れておきます。
'type_id' => array('numeric'),
'birthday' => array('date'),
最後「好きな物」の複数チェックは以下で。
'favorites'=>array(
'rule'=>array('multiple', array('min' => 1, 'max' => 3)),
'message' => '好きな物は一つ以上選択してください'
),
ここで、うっかりShift-JISとかで member.php を保存してしまうと、Controller dump: が出なくなったりしますのでご注意!
もちろん日本語エラーメッセージも出ません。
動いてるようにみえるので一瞬訳が分からなくなります。
続いてビューに移動して、前述の通り、 add.ctp の今こうなっている部分を
echo $form->input('Favorite', array('multiple'=>'checkbox', 'label' => '好きな物'));
以下のように変更します。
echo $form->input('favorites', array('multiple'=>'checkbox', 'label' => '好きな物'));
次にコントローラに移動して、確認画面の時に validate するように members_controller.php を書き換えます。
if (!empty($this->data)) {
から始まるif文の最初に、
$this->data['Favorite']['Favorite'] = $this->data['Member']['favorites'];
を入れます。これで favorites を本来の Favorite に入れ直しています。
で、mode=”confirm” の部分のif文
if ($this->data['Member']['mode'] == 'confirm') {
$this->Member->set($this->data);
$this->set('member', $this->data);
$this->render('confirm');
}elseif ($this->data['Member']['mode'] == 'back') {
を以下のように変えます。
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 $form->input('Favorite', array('type'=>'hidden'));
こうなっているところを、
foreach ($member['Member']['favorites'] as $k => $v){
echo $form->input("favorites.$k", array('type'=>'hidden'));
}
こうにします。
これで “hidden” のところが、
<input type="hidden" name="data[Member][favorites][0]" value="1" id="MemberFavorites0" /> <input type="hidden" name="data[Member][favorites][1]" value="3" id="MemberFavorites1" />
のように出力されるようになります。
戻るボタンクリックでも値が保持されています。
今まで保存されていなかった MembersFavorite にもデータが保存されています。

6月 29th, 2009 at 3:43 AM
foreach ($member['Member']['favorites'] as $k => $v){
echo $form->input(“favorites.$k”, array(‘type’=>’hidden’));
}
の部分なんですが、
echo $form->input(“Member.favorites.$k”, array(‘type’=>’hidden’));
としないと、
<input type=”hidden” name=”data[favorites][0]” value=”1″ id=”Mem…
と出力されてしまいました。