
前回、ログイン用パスワードの変更の
実装を試したのですが、
うまくできなかったため
結局、パスワード変更画面を別にして
実装することにしました。
パスワード変更画面用のビューを用意
まず、パスワードのみの変更用の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文の後のメッセージも一緒に出てくるためです。
これでパスワードの変更ができました。
バリデーションルールとか色々今回は手こずりました。
