Проверка не работает при обновлении

#php #yii

#php #yii

Вопрос:

При обновлении проверки модели не выполняются. $model->validate() всегда возвращает true. Таким образом, сохранение происходит, даже если неверные данные

Ниже приведена функциональность смены пароля

Вид

 <?php echo $form->passwordField($model, 'currentpassword', array('class'=>'form-control','required'=>'required', 'value'=>'', 'maxlength'=>'40', 'pattern'=>'[a-zA-Z0-9-]{6,40}', 'title'=>'Password should be 6-40 characters containing a-z and 0-9')); ?>
<?php echo $form->error($model, 'currentpassword'); ?>


<?php echo $form->passwordField($model, 'password', array('class'=>'form-control','required'=>'required', 'value'=>'', 'maxlength'=>'40', 'pattern'=>'[a-zA-Z0-9-]{6,40}', 'title'=>'Password should be 6-40 characters containing a-z and 0-9')); ?>
<?php echo $form->error($model, 'password'); ?>


<?php echo $form->passwordField($model, 'confirmpassword', array('class'=>'form-control','required'=>'required', 'value'=>'', 'maxlength'=>'40',        'pattern'=>'[a-zA-Z0-9-]{6,40}', 'title'=>'Password should be 6-40 characters containing a-z and 0-9')); ?>
<?php echo $form->error($model, 'confirmpassword'); ?>
  

Контроллер

 public function actionChangepassword()
{
        $this->layout = (Yii::app()->request->isAjaxRequest) ? '//layouts/ajax' :  '//layouts/precolumn2';


        $model = new User('changepassword');
        $data  = array();

        if (isset($_POST['User'])) {

                $model = User::model()->findByPk(Yii::app()->User->getId());
                $model->attributes=$_POST['User'];
                if ($model->save()) {
                        $message = array(
                                        'type'          =>'success',
                                        'message'       =>'Password Changed.');
                        $data['message'] = $message;
                } 
        }

        $data['model'] = $model;
        $this->render('changepassword',$data);


        }
  

Модель

 public function rules()
{
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
                array('name, user_type_id', 'required','on'=>'signup'),
                array('name, email', 'length', 'max'=>255),
                array('email', 'required','on'=>array('recover','signup')),
                array('email', 'exists','on'=> 'recover'),
                array('email', 'unique'),
                array('email', 'email'),
                array('user_login_count, user_like_count, user_share_count, user_view_count, user_comment_count, user_rating_count', 'numerical', 'integerOnly'=>true),

                array('password', 'length', 'max'=>100),
                array('password, confirmpassword', 'required','on'=>array('signup','resetpassword','changepassword')),
                array('confirmpassword', 'compare', 'compareAttribute'=>'password','on'=>array('signup','resetpassword','changepassword'),'message'=>'Passwords dont match'),
                array('currentpassword', 'compareCurrentPassword','on'=>array('changepassword')),

        );
}
  

Комментарии:

1. Какая проверка не выполняется? Модель сохраняется, когда она не должна?

2. никаких проверок не происходит. Ошибок не обнаружено. Ys это не должно сохраняться.

Ответ №1:

Проверьте свою строку $model = User::model()->findByPk(Yii::app()->User->getId()); Похоже, вам нужно установить сценарий там, поскольку вы создаете нового пользователя без сценария ‘changepassword’.

Например:

$model = User::model('changepassword')->findByPk(Yii::app()->User->getId());

Комментарии:

1. как передать сценарий здесь