CakePHP 3 formularz zmiany hasła
Pokażę jak w CakePHP 3 zrobić formularz zmiany hasła. Najpierw w pliku UsersTable.php (zakładam, że za użytkowników i ich logowanie odpowiada model Users w metodzie validationDefault dodajemy następującą regułę walidacji dla pola password. Sprawdzamy czy pole password i password1 (tzn. powtórz hasło) są takie same oraz czy stare hasło zgdza się z tym przechowywanym w bazie.
$validator ->scalar('password') ->maxLength('password', 255) ->requirePresence('password', 'create') ->notEmpty('password') ->sameAs('password','password2',__('Passwords not equal.')) ->add('old_password','custom',[ 'rule'=> function($value, $context){ $user = $this->get($context['data']['id']); if ($user) { if ((new DefaultPasswordHasher)->check($value, $user->password)) { return true; } } return false; }, 'message' => __('The old password does not match the current password!'), ]);oraz na górze pliku należy dodać:
use Cake\Auth\DefaultPasswordHasher; use Cake\Validation\Validator;W pliku changepassword.ctp dodajemy formularz.
<?= $this->Form->create($user) ?> <fieldset> <legend><?= __('Change Password') ?></legend> <?php echo $this->Form->control('old_password', ['type'=>'password']); echo $this->Form->control('password', ['type'=>'password', 'value' => '']); echo $this->Form->control('password2', ['type'=>'password']); ?> </fieldset> <?= $this->Form->button(__('Submit')) ?> <?= $this->Form->end() ?>W kontrolerze natomiast obsłużymy zmianę hasła.
public function changepassword() { $user =$this->Users->get($this->Auth->user('id')); if (!empty($this->request->data)) { $user = $this->Users->patchEntity($user, [ 'old_password' => $this->request->data['old_password'], 'password' => $this->request->data['password1'], 'password2' => $this->request->data['password2'] ] ); if ($this->Users->save($user)) { $this->Flash->success('The password is successfully changed'); $this->redirect('/index'); } else { $this->Flash->error('There was an error during the save!'); } } $this->set('user',$user); }