2015-09-30 38 views
6

Ho creato una funzionalità di modifica della password per modificare la password di amministrazione. Ho usato toutorial this.
Ora ho riscontrato un problema in $ model-> validate().
Qualcuno può aiutarmi ??Yii Cambia password per admin

controller

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

Modello

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.'); 
    } 

Modulo

<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> 

Il $ valido mi restituisce false e inserisco la parte else.

+0

visualizza anche il modulo. –

risposta

-1

Ho trovato un metodo che non so se la risposta è nel metodo corretto oppure no.
Ho scoperto che il problema si verifica durante la validation.so creato un altro modello chiamato changepassword per questa operazione, solo per convalidare i tre attributi che ho dato nelle regole.
E ha funzionato bene.

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

?> 

Amici se qualcuno ottiene il metodo corretto si prega di postarlo.

1

Penso che in questa riga $model = User::model()->findByAttributes(array('usertype' => $id)); hai fatto l'errore per tipo utente. Questo è l'ID utente.

+0

@Danila Ganchar: ho assegnato manualmente $ id = 1, perché id 1 è admin.Io ho fatto questo per modificare la password dell'amministratore. Il problema si verifica nel controller non ha sovrascritto la convalida. –

+0

@MohammedIqbal puoi mostrare i tuoi dati POST? E mostra i tuoi errori nel modello dopo ** validate() **?'var_dump ($ model-> getErrors());' –

+0

@MohammedIqbal e cambia '' modello = nuovo utente; $ model = User :: model() -> findByAttributes (array ('usertype' => $ id)); 'a' $ model = User :: model() -> findByPk ($ id); ' –

1

Il modo migliore per eseguire il debug di questo tipo di errori è in realtà controllare perché la convalida restituisce false.

Questo può essere fatto controllando il errors su un modello. È possibile emettere tutti gli errori nel messaggio flash, in modo che l'utente sappia cosa correggere, o semplicemente inseriscilo in un var_dump per facilitare il debug.

Modificare la parte del controller di avere questo:

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

che vi mostrerà l'errore di convalida in un array. Visualizzazione di quale attributo ha quale errore di convalida.

Se si desidera solo convalidare e salvare i campi della password. Puoi passarli nel metodo di convalida e salvataggio.

$model->validate(array('password')) and $model->save(TRUE, array('password')) 
+0

VdBerge: Con questo metodo sono venuto a sapere che questo è un errore di convalida .. Non convalidare quelli archiviati su Cambia password.Io bisogno di superare quel problema –

+0

Modificato il mio post per aggiungere una risposta per quello – ThomasVdBerge