cakephp(2.7.8)
PHP 5.6
MySQL 5.6
CekePHPにて以下のようなシンプルな会員登録ページを作りました。
1.メールアドレスを入力すると、仮登録され、メールアドレスにリンク先が送られる
2.リンク先を開き、名前とパスワードを入力すると本登録が完了する
2で、パスワードのバリデーションが一切通りません。
必須入力、半角英数字、8文字以内と設定しているのですが、空白や全角でも通ってしまいます。
単純な記述ミスと思うのですが分かりません。
どこがおかしいのでしょうか?
宜しくお願い致します。
SignupController.php
PHP
1<?php 2//サインアップコントローラ 3App::uses('AppController', 'Controller'); 4App::uses('CakeEmail', 'Network/Email'); 5App::uses('SimplePasswordHasher', 'Controller/Component/Auth'); 6 7class SignupController extends AppController { 8 9 public $name = 'Signup'; 10 public $uses = array('User'); 11 public $components = array('Auth','Session');//ユーザー登録完了後にログイン状態にするためAuthコンポーネントを使用する 12 13 14 15 16 public function beforeFilter(){ 17 18 parent::beforeFilter(); 19 20 $this->Auth->allow(); //このコントローラでは、全てのアクションが非ログイン状態で実行される 21 22 $this->set('title', '会員登録'); 23 } 24 25 26 27 28 public function index(){ 29 30 //POSTされていない場合はメールアドレス入力画面を表示 31 if(! $this->request->data){ 32 $this->render(); 33 return; 34 } 35 36 //$this->set('title', '会員登録'); 37 38 $this->User->validate = array( 39 'email' => array( 40 array( 41 //'rule' => 'notEmpty', 42 'rule' => 'notBlank', 43 'message' => 'メールアドレスを入力してください' 44 ), 45 array( 46 'rule' => array('custom', '/^.+@.+$/'), 47 'message' => 'メールアドレスの形式が正しくありません' 48 ), 49 array( 50 'rule' => 'confirm', 51 'message' => 'メールアドレスが一致していません' 52 ), 53 array( 54 'rule' => 'isUniqueAndActive', 55 'message' => 'すでに使用されています' 56 ) 57 ) 58 ); 59 60 61 62 $this->User->set($this->request->data); 63 64 //仮登録中のユーザーがあれば、そのレコードを利用する 65 if(! $this->User->invalidFields()){ 66 67 $email = $this->request->data['User']['email']; 68 $activation_code = md5($email.time()); 69 70 $user = $this->User->find('first',array( 71 'conditions' => array('email' => $email,'is_active' => false) 72 )); 73 74 75 if(! $user){ 76 $this->User->create(); 77 $user = array('User' => $this->request->data['User']); 78 } 79 80 $user['User']['is_active'] = false; 81 $user['User']['activation_code'] = $activation_code; 82 $this->User->save($user); 83 84 85 86 87 $cakemail = new CakeEmail('activation'); 88 $cakemail->to($email); 89 $cakemail->subject('仮登録のお知らせ'); 90 $cakemail->send(sprintf('https://kakomon.work/Signup/activate/%s',$activation_code)); 91 92 $this->render('email_sent'); 93 } 94 95 96 97 98 } 99 100 /* 101 *アクティベーションを行う 102 */ 103 public function activate($activation_code){ 104 105 //まだアクティベーションされていないユーザーを取得 106 $user = $this->User->find('first',array( 107 'conditions' => array( 108 'activation_code' => $activation_code, 109 'is_active' => false 110 ) 111 )); 112 113 //見つからなかった場合、処理を抜ける 114 if(! $user){ 115 $this->redirect('/Signup/index'); 116 } 117 118 119 120 //POSTされていない場合はメールアドレス入力画面を表示 121 if(! $this->request->data){ 122 $this->render(); 123 return; 124 } 125 126 127 //バリデーションの用意 128 $this->User->validate = array( 129 'password' => array( 130 array( 131 //'rule' => 'notEmpty', 132 'rule' => 'notBlank', 133 'message' => 'パスワードを入力してください' 134 ), 135 array( 136 'rule' => array('custom','/^[a-zA-Z0-9]+$/'), 137 'message' => '半角英数字で入力してください' 138 ), 139 array( 140 'rule' => 'confirm', 141 'message' => 'パスワードが一致していません' 142 ), 143 array( 144 'rule' => array('minLength',8), 145 'message' => '8文字以上入力して下さい' 146 ) 147 ) 148 ); 149 150 $this->User->validate = array( 151 'name' => array( 152 array( 153 //'rule' => 'notEmpty', 154 'rule' => 'notBlank', 155 'message' => 'お名前を入力してください' 156 ), 157 array( 158 'rule' => array('isUniqueName',-1), 159 'message' => 'こちらのお名前は、すでに使用されています' 160 ) 161 ) 162 ); 163 164 $this->User->set($this->request->data); 165 166 167 168 //パスワードが正しく入力されてたのでDBにパスワードを保存する 169 if(! $this->User->invalidFields()) 170 { 171 172 $user['User']['name'] = $this->request->data['User']['name']; 173 174 $passwordHasher = new SimplePasswordHasher(); 175 176 $user['User']['password'] = $passwordHasher->hash( 177 $this->request->data['User']['password'] 178 ); 179 180 unset($user['User']['password_confirm']); 181 $user['User']['is_active'] = true; 182 183 //セッションにidをセット 184 $this->Session->write('user_id', $user['User']['id']); 185 186 187 //パスワードが暗号化されており確認用パスワードと一致しなくなっているのでバリデーションを解除して登録 188 $this->User->validate = array(); 189 $this->User->save($user); 190 191 //ログイン状態にして完了URLへ飛ばす 192 $this->Auth->login($user); 193 194 195 //$this->redirect($this->Auth->redirectUrl()); 196 $this->redirect('/MyPages/index');//マイページへ 197 } 198 199 200 201 } 202 203} 204
activate.ctp
PHP
1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 2<script src="../js/bootstrap.min.js"></script> 3<?php echo $this->Html->css('kakomon'); ?> 4<?php echo $this->element('header'); ?> 5 6<div class="container"> 7 <div class="row"> 8 <div class="col col-md-12"> 9 <h2>会員登録</h2> 10 </div> 11 </div> 12 13 14 <div class="row"> 15 <div class="col-md-6"> 16 <div class="form-login"> 17 18 19 20 21 <?php echo ($this->Form->create()); ?> 22 <div style="display:none;"> 23 <input type="hidden" name="_method" value="POST"/> 24 </div> 25 26 <p>お名前(ニックネーム)を入力してください。</p> 27 28 <div class='name'> 29 <?php 30 echo($this->Form->text('User.name',array('class' => 'form-control input-sm chat-input', 'placeholder' => 'お名前(ニックネーム)'))); 31 echo($this->Form->error('User.name')); 32 ?> 33 </div> 34 35 <br> 36 37 <p>ログインに使用するパスワードを入力してください。</p> 38 39 <div class='password'> 40 <?php 41 42 echo($this->Form->text('User.password',array('class' => 'form-control input-sm chat-input', 'placeholder' => 'パスワード'))); 43 echo($this->Form->error('User.password')); 44 ?> 45 </div> 46 47 <div class='password-confirm'> 48 <?php 49 50 echo($this->Form->text('User.password_confirm',array('class' => 'form-control input-sm chat-input', 'placeholder' => 'パスワード(確認)'))); 51 ?> 52 </div> 53 54 <br> 55 56 <input type="submit" value="送信" class="btn btn-primary btn-md"/> 57 58 </form> 59 </div> <!-- form end --> 60 </div> <!-- col end --> 61 </div> <!-- row end --> 62 63 64 65 66 67</div><!-- container end --> 68 69 70<?php echo $this->element('footer'); ?> 71 72
お名前 のほうは問題なしですか?
失礼しました。はい。お名前の方は問題なしでした。
上書きっぽいなと思いつつ、もしかしたらCakePHPではそのような設定の仕方をするのかなと聞いてみました(お名前だけ問題無しなら上書き、お名前も問題ありなら設定の仕方自体)。上書きでしたね。
解決されたようで何よりです。
本題ではありませんが、「バリデーションが通らない」といった場合、この例とは正反対に「バリデーションで全てエラーになる」ということを意味します。
「バリデーションが効かない」としたほうがいいでしょう。
maisumakun様
なるほど。すみません。
「効かない」に変更させていただきました。
mts10806様
有難う御座いました。

回答1件
あなたの回答
tips
プレビュー