6月 05

15.Validate続き

go @ 5:02 AM

ということで 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 にもデータが保存されています。

>>次のページ「メール送信」へ

One Response to “15.Validate続き”

  1. 通りすがり says:

    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…
    と出力されてしまいました。

here comes