Yii Сменить пароль администратора


Я создал функцию смены пароля, чтобы изменить пароль администратора.Я использовал это для описания.
Теперь я столкнулся с проблемой в $model->проверить().
Кто-нибудь может мне помочь??

Контроллер

    public function actionIndex()
    {
        $id = 1;
        $model = User::model()->findByAttributes(array('usertype' => $id));
        $model->setScenario('changePwd');

        if (isset($_POST['User'])) {
            $model->attributes = $_POST['User'];
            if ($model->validate()) {
                $model->password = md5($model->new_password);
                if ($model->save()) {
                    Yii::app()->user->setFlash('success', "Password Changed Successfully!");
                }

             } else {
                 Yii::app()->user->setFlash('error', "Change Password failed!");
             }
         }

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

Модель

    class User extends CActiveRecord
{
    public $old_password;
    public $new_password;
    public $repeat_password;
    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return '{{user}}';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('usertype, firstname, lastname, email, password, mobile, gender, dob, country, area, city, address, street, housenumber, extradirection, createdon', 'required'),
            array('usertype, country, area', 'numerical', 'integerOnly'=>true),
            array('firstname, lastname, email, mobile, dob, city, street, housenumber', 'length', 'max'=>155),
            array('password', 'length', 'max'=>225),
            array('gender', 'length', 'max'=>6),
            array('status', 'length', 'max'=>1),
            array('updatedon', 'safe'),
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            array('id, usertype, firstname, lastname, email, password, mobile, gender, dob, country, area, city, address, street, housenumber, extradirection, createdon, updatedon, status', 'safe', 'on'=>'search'),
            array('old_password, new_password, repeat_password', 'required', 'on' => 'changePwd'),
            array('old_password', 'findPasswords', 'on' => 'changePwd'),
            array('repeat_password', 'compare', 'compareAttribute'=>'new_password', 'on'=>'changePwd'),
        );
    }

public function findPasswords($attribute, $params)
    {
        $user = User::model()->findByPk(Yii::app()->user->id);
        //echo '<pre>';print_r($user);echo '</pre>';
        if ($user->password != md5($this->old_password))
            $this->addError($attribute, 'Old password is incorrect.');
    }

Форма

    <div class="login_con_new"> 
    <div class="form">                  
        <?php    
        $form=$this->beginWidget('CActiveForm', array(
        'id'=>'change-password-form',   
        //'action' => Yii::app()->createUrl('login/authenticate'), 
        // 'enableAjaxValidation' => FALSE,
        'enableClientValidation' => true,
        'clientOptions' => array('validateOnSubmit' => true,),
        'htmlOptions' => array(
        'class' => 'form',
        )
        ));  
        ?>  
        <div class="col-sm-6">
            <h2 class="title">Change Password</h2> 
            <?php
    foreach(Yii::app()->user->getFlashes() as $key => $message) {
        echo '<div class="flash-' . $key . '">' . $message . "</div>\n";
    }
?>
            <div class="form-group">             
            <?php echo $form->labelEx($model,'Current_password'); ?>
            <?php echo $form->passwordField($model,'old_password',array('class'=>'form-control login-field','size'=>60,'maxlength'=>222)); ?>
            <?php echo $form->error($model,'old_password'); ?>  
            </div>
            <div class="form-group"> 
            <?php echo $form->labelEx($model,'new_password'); ?>
            <?php echo $form->passwordField($model,'new_password',array('class'=>'form-control login-field','size'=>60,'maxlength'=>222)); ?>
            <?php echo $form->error($model,'new_password'); ?> 
            </div> 
            <div class="form-group"> 
            <?php echo $form->labelEx($model,'repeat_password'); ?>
            <?php echo $form->passwordField($model,'repeat_password',array('class'=>'form-control login-field','size'=>60,'maxlength'=>222)); ?>
            <?php echo $form->error($model,'repeat_password'); ?> 
            </div>          
            <div class="form-group">
            <div class="col-lg-4" style="padding-left: 0px;">
            <?php echo CHtml::submitButton('Change',array('class' => 'btn btn-success','style'=>'color:white')); ?></div>  
        </div>      
    </div>
    <?php  $this->endWidget(); ?>
</div>      </div> 

$valid возвращает мне значение false и вводит часть else.

Author: Danila Ganchar, 2015-09-30

4 answers

Я думаю, что в этой строке $model = User::model()->findByAttributes(array('usertype' => $id)); вы допустили ошибку для типа пользователя. Это идентификатор пользователя.

 1
Author: senthil, 2015-09-30 15:33:03

Лучший способ отладить такого рода ошибки - это на самом деле проверить , почему проверка возвращает false.

Это можно сделать, проверив ошибки на модели. Вы можете либо вывести все ошибки во флэш-сообщении, чтобы пользователь знал, что нужно исправить, либо просто поместить его в var_dump, чтобы помочь вам отладить.

Измените свою часть контроллера, чтобы она была такой:

if($valid)
{
    $model->password = md5($model->new_password);
    if($model->save())
    {    
        Yii::app()->user->setFlash('success', "Password Changed Successfully!");
        // $this->redirect(array('dashboard/index', 'id' => 1));
    } 
    else
    {
        Yii::app()->user->setFlash('error', "Change Password failed!");
    }
}
else
{
    var_dump($model->errors);
    die();
}

Он покажет вам ошибку проверки в массиве. Отображение какого атрибута имеет какую ошибку проверки.

Если вы хотите только проверить и сохранить поля пароля. Вы можете передать их в методе проверки и сохранения.

$model->validate(array('password')) and $model->save(TRUE, array('password'))
 1
Author: ThomasVdBerge, 2015-10-01 14:37:32

Вы можете использовать senario для обновления. Нравится: http://www.yiiframework.com/forum/index.php/topic/31357-priority-to-rules-with-a-scenario/

 0
Author: Ishan Shah, 2015-10-01 07:07:10

Я нашел метод, я не знаю, правильный ли ответ в методе или нет.
Я обнаружил, что проблема возникает во время проверки.поэтому создал другую модель под названием пароль изменения для этой операции, проверяйте только три атрибута, которые я указал в правилах.
И это прекрасно сработало.

   <?php 
class Changepassword extends CActiveRecord
{
    public $old_password;
    public $new_password;
    public $repeat_password;
    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return '{{user}}';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            // array('usertype, firstname, lastname, email, password, mobile, gender, dob, country, area, city, address, street, housenumber, extradirection, createdon', 'required'),
            // array('usertype, country, area', 'numerical', 'integerOnly'=>true),
            // array('firstname, lastname, email, mobile, dob, city, street, housenumber', 'length', 'max'=>155),
            // array('password', 'length', 'max'=>225),
            // array('gender', 'length', 'max'=>6),
            // array('status', 'length', 'max'=>1),
            // array('updatedon', 'safe'),
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            array('id, usertype, firstname, lastname, email, password, mobile, gender, dob, country, area, city, address, street, housenumber, extradirection, createdon, updatedon, status', 'safe', 'on'=>'search'),
            array('old_password, new_password, repeat_password', 'required', 'on' => 'changePwd'),
            array('old_password, new_password, repeat_password','length','max'=>225),
            array('old_password', 'findPasswords', 'on' => 'changePwd'),
            array('repeat_password', 'compare', 'compareAttribute'=>'new_password', 'on'=>'changePwd'),
        );
    }

public function findPasswords($attribute, $params)
    {
        $user = User::model()->findByPk(Yii::app()->user->id);
        if ($user->password != md5($this->old_password))
            $this->addError($attribute, 'Old password is incorrect.');
    }
    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'events' => array(self::HAS_MANY, 'Events', 'createdby'),
            'eventsJoinees' => array(self::HAS_MANY, 'EventsJoinee', 'userid'),
            'eventsRatings' => array(self::HAS_MANY, 'EventsRating', 'userid'),
            'usertype0' => array(self::BELONGS_TO, 'UserroleMaster', 'usertype'),
            'area0' => array(self::BELONGS_TO, 'AreaMaster', 'area'),
            'country0' => array(self::BELONGS_TO, 'CountryMaster', 'country'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'old_password'=>'Current Password',
            'new_password'=> 'New Password',
            'repeat_password'=>'Confirm Password',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * Typical usecase:
     * - Initialize the model fields with values from filter form.
     * - Execute this method to get CActiveDataProvider instance which will filter
     * models according to data in model fields.
     * - Pass data provider to CGridView, CListView or any similar widget.
     *
     * @return CActiveDataProvider the data provider that can return the models
     * based on the search/filter conditions.
     */
    public function search()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id',$this->id);
        $criteria->compare('usertype',$this->usertype);
        $criteria->compare('firstname',$this->firstname,true);
        $criteria->compare('lastname',$this->lastname,true);
        $criteria->compare('email',$this->email,true);
        $criteria->compare('password',$this->password,true);
        $criteria->compare('mobile',$this->mobile,true);
        $criteria->compare('gender',$this->gender,true);
        $criteria->compare('dob',$this->dob,true);
        $criteria->compare('country',$this->country);
        $criteria->compare('area',$this->area);
        $criteria->compare('city',$this->city,true);
        $criteria->compare('address',$this->address,true);
        $criteria->compare('street',$this->street,true);
        $criteria->compare('housenumber',$this->housenumber,true);
        $criteria->compare('extradirection',$this->extradirection,true);
        $criteria->compare('createdon',$this->createdon,true);
        $criteria->compare('updatedon',$this->updatedon,true);
        $criteria->compare('status',$this->status,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }

    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     * @param string $className active record class name.
     * @return User the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
}

?>

Друзья, если у кого-нибудь есть правильный метод, пожалуйста, опубликуйте его.

 -1
Author: Mohammed Iqbal Khan, 2015-10-01 15:37:02