スポンサードリンク

CakePHP
CakePHP

前回、ログイン用パスワードの変更の

実装を試したのですが、

うまくできなかったため

結局、パスワード変更画面を別にして

実装することにしました。

スポンサードリンク

パスワード変更画面用のビューを用意

まず、パスワードのみの変更用の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文の後のメッセージも一緒に出てくるためです。

これでパスワードの変更ができました。

バリデーションルールとか色々今回は手こずりました。

スポンサードリンク