2016-04-11 17 views
0

Ich habe ein Formular, in dem ich versuche, das Passwort zurückzusetzen. Ich habe 3 Felder Passwort, Changepassword und Re-Enterpassword.Passwort-Validierung in Yii2 zurücksetzen

Zuerst muss ich überprüfen, ob das Passwort-Feld mit Datenbank-Passwort übereinstimmt.

Während der Benutzeranmeldung habe ich die standardmäßige Yii2-Funktionalität verwendet, die ein zufälliges Passwort generiert und dieses Passwort in der Datenbank speichert. Ich habe auch die Standard-Login-Funktionalität während der Benutzeranmeldung verwendet.

Und jetzt, um das Passwort zu überprüfen, versuche ich die gleiche Standard-Yii2-Validierung, die bei der Anmeldung verwendet wird. Aber es funktioniert nicht gut. Es gibt immer die Validierung wahr, wenn ich den Controller mit $ user-> validate() gecheckt und eingecheckt habe, was Sie im folgenden Code finden.

Ich habe ein viewresetProfilePassword.php, in dem ich eine Form haben

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> 
    <?php 
    echo $form->field($resetpasswordmodel, 'password'); 
    echo $form->field($resetpasswordmodel, 'changepassword'); 
    echo $form->field($resetpasswordmodel, 'reenterpassword'); 
    ?> 
    <div class="form-group"> 
     <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?> 
    </div> 
    <?php ActiveForm::end(); ?> 

Ich habe ein modelresetProfilePasswordForm.php

<?php 
    namespace frontend\models; 
    use common\models\User; 
    use yii\base\Model; 

    class ResetProfilePasswordForm extends Model 
    { 
     public $password; 
     public $changepassword; 
     public $reenterpassword; 

     public function rules() 
     { 
     return [ 

     ['password', 'validatePassword'], 
     ['changepassword', 'required'], 
     ['reenterpassword', 'required'], 
     ['reenterpassword', 'compare', 'compareAttribute'=>'changepassword', 'message'=>"Passwords don't match" ] 
     ]; 
     } 

public function attributeLabels() 
{ 
    return [ 
     //'user_profile_id' => 'User Profile ID', 
     //'user_ref_id' => 'User Ref ID', 
     'password' => 'Password', 
     'changepassword' => 'Change Password', 
     'reenterpassword' => 'Re-enter Password', 
     ]; 
     } 

    public function validatePassword($attribute, $params) 
    { 
     if (!$this->hasErrors()) { 
     $user = $this->getUser(); 
     if (!$user || !$user->validatePassword($this->password)) { 
      $this->addError($attribute, 'Incorrect username or password.'); 
     } 
     } 
     } 

     protected function getUser() 
     { 
     if ($this->_user === null) { 
      $this->_user = User::findByUsername($this->username); 
     } 

     return $this->_user; 
     } 

    } 

Dies ist controllerProfileController.php

public function actionResetProfilePassword() 
    { 
    $resetpasswordmodel = new ResetProfilePasswordForm(); 
    if ($resetpasswordmodel->load(Yii::$app->request->post())) { 

     $user = User::find()->where(['id' => Yii::$app->user->identity->id])->one(); 
     if($user->validate()){ 
     $user->save(false); 
     } 
    } 
      return $this->render('ResetProfilePassword', [ 
      'resetpasswordmodel' => $resetpasswordmodel 
      ]); 
    } 

Bitte helfen Sie mir, wo ich mit dem Problem konfrontiert bin. Ist dies nicht der richtige Weg ist, bitte bei der Bereitstellung der besseren Art und Weise helfen Sie mir zu validieren Passwort zu validieren

+0

In 'resetProfilePasswordForm.php' in der Methode' getUser() 'haben Sie die Benutzer' $ this -> _ user 'und '$ this-> username', um das Benutzermodell zu erhalten. Aber ich kann nicht sehen, wo '$ this-> username' eingestellt ist. Warum verwenden Sie nicht die Standard-Yii-Methode 'Yii :: $ app-> user-> identity'? –

Antwort

1

resetpasswordmodel Validierung anwenden zu können - nur die validate() Methode ausführen und dann - update Benutzermodell wie folgt aus:

public function actionResetProfilePassword() 
{ 
    $resetpasswordmodel = new ResetProfilePasswordForm(); 
    if ($resetpasswordmodel->load(Yii::$app->request->post())) { 
     $user = User::find()->where(['id' => Yii::$app->user->identity->id])->one(); 
     # here we run our validation rules on the model 
     if ($resetpasswordmodel->validate()) { 
      # if it is ok - setting the password property of user 
      $user->password = $resetpasswordmodel->changepassword; 
      # and finally save it 
      $user->save(); 
    } 
    return $this->render('ResetProfilePassword', [ 
     'resetpasswordmodel' => $resetpasswordmodel 
    ]); 
}