У меня есть страница, где пользователь может изменить свой пароль. Форма содержит 3 поля: текущий пароль (old_pass), новый пароль (pass) и подтверждение нового пароля (pass_confirm). Проблема в том, что поля не проверены, и пустые поля разрешены, хотя это запрещено в определении модели. Я понятия не имею, почему, у меня есть похожая форма при регистрации, но она отлично работает и отображает ошибки проверки для этих полей.
Когда я отображаю $this->User->validationErrors
, массив пуст. Но проверка выполнена, у меня есть проверка имени пользователя, которая активна только при создании пользователя, и когда я активирую ее для всех форм User
(включая форму смены пароля), ошибка проверки отображается здесь в основном.
<?php echo $this->Form->create('User');?>
<fieldset>
<legend><?php __('Change password'); ?></legend>
<?php
echo $this->Form->input('User.old_pass', array('type' => 'password',
'label' => __('Current password', true)));
echo $this->Form->input('User.pass', array( 'type' => 'password',
'label' => __('New password', true)));
echo $this->Form->input('User.pass_confirm', array('type' => 'password',
'label' => __('Repeat password', true)));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit', true));?>
часть массива validate
, которая имеет отношение к этим входам, выглядит следующим образом:
'pass' => array(
'required' => array(
'rule' => array('custom','/^.*[0-9].*$/i'),
'message'=>'Password must contain numbers',
'allowEmpty' => false
),
'length' => array(
'rule' => array('minLength',8),
'message' => 'Password must be at least 8 characters long')
),
'pass_confirm' => array(
/*'required' => array(
'rule' => 'notempty',
'message' => 'You have to confirm the password',
'allowEmpty' => false
),*/
'validate' => array(
'rule' => 'validate_password',
'message'=>'Your passwords don\'t match!' )
),
'old_pass' => array(
'length' => array(
'rule' => array('minLength',8),
'message' => 'Password must be at least 8 characters long'),
'allowEmpty' => false
)
function validate_password(){
//return false;
$passed=false;
if(isset($this->data['User']['pass_confirm']) && $this->data['User']['pass_confirm']!=''){
if ($this->data['User']['pass'] != $this->data['User']['pass_confirm']){
$this->invalidate('pass');
} else {
$passed=true;
}
}
return $passed;
}
Кстати, когда я раскомментирую строку return false;
в функции validate_password
, ничего не происходит, поэтому метод вообще не вызывается.
Я сохраняю пользователя с помощью $this->User->save($data)
, переменная $data
содержит данные, которые я хочу сохранить в формате propper, и работает нормально. Единственная проблема в том, что поля не проверяются
EDIT:
function change_password() {
$usr = $this->User->find('first', array(
'conditions'=> array(
'User.id' => $this->Auth->user('id')),
'recursive' => 0
));
if ($this->data) {
if ($this->Auth->password($this->data['User']['old_pass'])== $usr['User']['password']) {
$data = array(
'id' => $usr['User']['id'],
'password' => $this->Auth->password($this->data['User']['pass'])
);
if ($this->User->save($data)) {
$this->Session->setFlash(__('Password has been changed.', true));
} else {
debug($this->User->validationErrors);
$this->Session->setFlash(__('Password could not be saved, please try again later.', true));
}
} else {
$this->Session->setFlash(__('The password you entered as your current is not your current password.', true));
}
}
}