Правила проверки не работают для смены пароля в Yii php?

Я создаю функцию смены пароля, все работает нормально, кроме правила проверки старого пароля. Вот мой код

public function rules()
{
    return array(
        array('is_active', 'numerical', 'integerOnly'=>true),
        array('first_name, joining_date,last_name, employee_code, username, password, role', 'required','on'=>array('create')),     
        array('employee_code', 'numerical', 'integerOnly'=>true),
        array('username','email'),      
        array('username','valid_username','on'=>array('create')),

        //array('username', 'contraints', 'readOnly'=>true, 'on'=>'update'),

        array('currentPassword, newPassword, newPasswordRepeat', 'required','on'=>array('change')),
        //array('newPassword', 'length', 'min' => 6, 'max'=>20, 'message'=>Yii::t("translation", "{attribute} is too short.")),
        //array('newPassword','ext.SPasswordValidator.SPasswordValidator', 'preset' => 'strong', 'max' => 41),
        array('newPassword', 'compare', 'compareAttribute'=>'newPasswordRepeat','on'=>array('change')),

        array('currentPassword', 'equalPasswords','on'=>array('change')),

        array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>array('forgotPassword')),
        array('joining_date', 'safe'),
        array('user_id, first_name, last_name, employee_code, username, password, role, joining_date, pending_regular_leave, pending_medical_leave, allocated_regular_leave, allocated_medical_leave, is_active', 'safe', 'on'=>'search'),
    );
}

Моя функция смены пароля

public function equalPasswords($attribute, $params)
{
    $user = Users::model()->findByPk(Yii::app()->user->id); 
    if ($user->password != md5($attribute))
    {
       $this->addError($attribute, 'Old password is incorrect.');
    }   
}

Метод обновления

:

public function actionChange()
{
        $model=new Users;
        $model->setScenario('change');

    if (isset($_POST['Users'])) {
        $model->setAttributes($_POST['Users']);                     
        if($model->validate())
            {       
                $pass = md5($_POST['Users']['newPassword']);            
                $userModel = Users::model()->findByPk(Yii::app()->user->id);
                $userModel->password = $pass; 
                $data = $userModel->update();
                Yii::app()->user->setFlash('success',"Password changed successfully!");
            }
        }

$this->render('change_password', array('model'=>$model,true));
}

когда я пытаюсь изменить пароль со всеми правильными параметрами (исправить старый пароль, новый пароль, повторить пароль), он обновляет пароль, но также показывает мне ошибку, что ваш старый пароль не верен. пожалуйста, помогите мне решить это, поскольку я новичок в Yii. Заранее спасибо.


person Amit Singla    schedule 25.07.2013    source источник


Ответы (2)


Я не уверен, но вы можете попробовать один раз.

$user = Users::model()->findByPk(Yii::app()->user->id); 
if ($user->password != md5($this->attributes['currentPassword']))
{
     $this->addError($attribute, 'Old password is incorrect.');
} 

изменить md5($attribute) на md5($this->attributes['currentPassword']

И добавь это в свои правила

public function rules()
{
    public $currentPassword; 
    // your rules here
}
person som    schedule 25.07.2013

В валидаторе вы получаете имя атрибута, а не значение в $attribute. Чтобы получить значение, вам нужно:

$value = $this->$attribute;
person Michael Härtl    schedule 25.07.2013
comment
Что ж, тогда займитесь отладкой: добавьте echo $user->password; echo $this->$attribute;exit; в свой метод equalPasswords(). Это должно помочь вам отследить проблему. - person Michael Härtl; 25.07.2013
comment
теперь проверка работает нормально, когда я прокомментировал метод обновления, он работает, но когда я раскомментирую метод $data = $userModel->update();, он выдает ту же ошибку, что и я, я обновил свой вопрос с помощью функции обновления. - person Amit Singla; 25.07.2013
comment
Хорошо, но это уже другой вопрос. Ваша первоначальная проблема с неудачной проверкой решена. Код, который у вас есть в вашем контроллере, на самом деле не так уж хорош. Вы должны сначала загрузить пользовательскую модель, а затем назначить атрибуты там. - person Michael Härtl; 25.07.2013