Yii 修改管理员密码

Yii Change Password for admin

我创建了更改密码功能来更改管理员 password.I 使用 this 教程。
现在我在 $model->validate().
中遇到问题 谁能帮帮我??

控制器

    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 returns me false 并进入 else 部分。

我认为在这一行中 $model = User::model()->findByAttributes(array('usertype' => $id)); 你在用户类型上犯了错误。这是用户id。

调试此类错误的最佳方法是实际检查验证返回 false 的原因。

这可以通过检查模型上的 errors 来完成。您可以在 flash 消息中输出所有错误,以便用户知道要更正什么,或者只是将其放在 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'))

您可以使用场景进行更新。像: http://www.yiiframework.com/forum/index.php/topic/31357-priority-to-rules-with-a-scenario/

我找到了一个方法我不知道答案是否正确
我发现问题发生在 validation.so 为此操作创建了另一个名为 changepassword 的模型时,仅验证我在规则中给出的三个属性。
而且效果很好。

   <?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);
    }
}

?>

朋友们如果有人得到正确的方法请post吧。