スポンサードリンク

前回、ログイン用パスワードの変更の
実装を試したのですが、
うまくできなかったため
結局、パスワード変更画面を別にして
実装することにしました。
スポンサードリンク
パスワード変更画面用のビューを用意
まず、パスワードのみの変更用のViewを用意します。
View/Users/password.ctp
<?php echo $this->Form->create('User'); ?> <?php echo $this->Form->input('id', array('type' => 'hidden'));?> <?php echo $this->Form->input('password', array('label' => 'パスワード', 'value' => '')); ?> <?php echo $this->Form->end('変更する'); ?>
パスワードのみのフォームでいいので上記の書き方で十分ですね。
あと、パスワードのvalueを空白で指定しておきます。
valueを指定してないと
Userテーブルからパスワードを入れておいてくれますが、
ハッシュ化されたものなので
自動で入った値のまま、変更ボタンを押すと
ご丁寧にハッシュ化されてしまって
パスワードがわからなくなってしまいます。
なので、パスワード変更画面の時は
自動で値が入らないようにします。
Userモデルのバリデーションを設定
Mofdel/User.php
class User extends AppModel{ public $name = 'User'; public $validate = array( 'password' => array( 'rule1'=> array( 'rule' => 'notEmpty', 'allowEmpty' => false, 'message' => '空白は無効です。', ), 'rule2' => array( 'rule' => array('alphaNumeric'), 'message' => '半角英数字で入力して下さい。' ), 'rule3' => array( 'rule' => array('minLength', 6), 'message' => '6文字以上で入力して下さい。' ) ) ); public function beforeSave($options = array()) { if (isset($this->data[$this->alias]['password'])) { $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']); } return true; } }
パスワードは半角英数字6文字以上で設定するということで
バリデーションを設定しました。
スポンサードリンク
Usersコントローラーの設定
次にコントローラーの設定です。
Controller/UsersController.php
//パスワードの変更 function password($id = null){ if (!$id) { throw new NotFoundException(__('エラー:【戻る】を押して下さい!')); } $user = $this->User->findById($id); if (!$user) { throw new NotFoundException(__('エラー:データがありません【戻る】を押して下さい!')); } // POST送信なら if($this->request->is('post') || $this->request->is('put')) { $this->User->set($this->data); //バリデーションをハッシュ化前にチェック if ($this->User->validates()) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->redirect(array('controller' => 'posts', 'action' => 'index')); } else { $this->Session->setFlash(__('パスワードを変更できませんでした。やり直して下さい')); } } } //指定プライマリーキーのデータをセット $this->request->data = $user; }
まず、パスワードの変更でパスワードをハッシュ化する前に
バリデーションかけるようにしています。
これは、saveメソッドでバリデーションさせると
saveできなかったということで
else文の後のメッセージも一緒に出てくるためです。
これでパスワードの変更ができました。
バリデーションルールとか色々今回は手こずりました。
スポンサードリンク