2013-07-24 3 views
1

Je suis nouveau dans le cadre YII. Je suis en train d'écrire une méthode simple pour changer le mot de passe, je veux valider les contrôles comme si vide puis montrer le message d'erreur ou si le mot de passe et re-saisir le mot de passe ne correspond pas alors montrer l'erreur. Je l'ai utilisé le code ci-dessous pour ce faire:

public function actionChange() 
{ 
    $model=new Users; 
    $model->scenario='change'; 
    if (isset($_POST['Users'])) { 
     $model->setAttributes($_POST['Users']);      

     if($model->validate()) 
      { 
       print "true"; 
      } 
     else{ 

       print "false"; 
      } 

     if($model->validate()) 
      {  
       $pass = md5($_POST['Users']['newPassword']);    
       $userModel = Users::model()->findByPk(Yii::app()->user->id); 
       $userModel->password = $pass; 
       $data = $userModel->update(); 
      } 

      if(isset($data)) 
      { 
       Yii::app()->user->setFlash('success',"Password changed successfully!"); 
       $this->redirect(array('Users/change'), true); 
      } 
     } 


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

Mais **$model->validate()** retourne toujours faux me soit i remplir les champs ou non.

mise à jour:

est fonction de règle ici:

public function rules() 
{ 
    return array(
     array('is_active', 'numerical', 'integerOnly'=>true), 
     array('first_name, joining_date,last_name, employee_code, username, password, role', 'required'),  
     array('employee_code', 'numerical', 'integerOnly'=>true), 
     array('username','email'),  
     array('username','valid_username','on'=>array('create')), 

     //array('username', 'contraints', 'readOnly'=>true, 'on'=>'update'), 

     array('currentPassword, newPassword, newPasswordRepeat', 'required','on'=>array('change')), 
     //array('newPassword', 'length', 'min' => 6, 'max'=>20, 'message'=>Yii::t("translation", "{attribute} is too short.")), 
     //array('newPassword','ext.SPasswordValidator.SPasswordValidator', 'preset' => 'strong', 'max' => 41), 
     array('newPassword', 'compare', 'compareAttribute'=>'newPasswordRepeat','on'=>array('change')), 
     array('currentPassword', 'equalPasswords','on'=>array('change')), 
     array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>array('forgotPassword')), 
     array('joining_date', 'safe'), 
     array('user_id, first_name, last_name, employee_code, username, password, role, joining_date, pending_regular_leave, pending_medical_leave, allocated_regular_leave, allocated_medical_leave, is_active', 'safe', 'on'=>'search'), 
    ); 
} 


public function equalPasswords($attribute, $params) 
{ 
    $user = Users::findByPk(Yii::app()->user->id); 
    if ($user->password != md5($this->currentPassword)) 
     $this->addError($attribute, 'Old password is incorrect.'); 
} 

s'il vous plaît aidez-moi.

+1

Montrez votre fonction validate (comme Jon indiqué ci-dessous - il n'est pas valide, mais les règles fonctionnent) à partir du modèle. Il devrait contenir des règles de validation qui échouent probablement. – renathy

+2

Pas la fonction de validation - montre la fonction 'rules()' où vos règles de validation sont définies. Vous pouvez aussi 'print_r ($ model-> getErrors())' pour voir exactement ce qui ne valide pas et pourquoi. – Jon

+0

Peut-être que vous avez plus de règles que obligatoire, comme le type entier ... Afficher les règles plz – Pouki

Répondre

2

Essayez d'utiliser la bonne méthode pour définir le scénario que vous avez deux options:

$model=new Users('change'); 

ou

$model=new Users; 
$model->setScenario('change'); 

également une autre question que vous ne chargez pas est un modèle de la DB, à moins que vous laissez-les entrer leur user_id ou quel que soit votre clé primaire sur le formulaire. Très probablement, vous devez ajouter ceci:

$model = Users::model()->findByPk(Yii::app()->user->id); 
//$model=new Users; //Should be removed 

Sinon, il ne sait même pas quel enregistrement il est supposé mettre à jour dans la base de données ainsi que tous vos autres champs seront complètement vide.

Aussi, si vous utilisez un widget de formulaire comme CActiveForm vous pouvez également ajouter à votre point de vue et il vous montrera les messages de validation a échoué:

echo $form->errorSummary($model); 
4

Pour une raison quelconque, votre validation échoue. Essayez d'afficher l'erreur de validation dans le bloc else (lorsque la validation échoue).

if($model->validate()) { 
.... 
} 
else { 
     $errors = $model->getErrors(); 
     var_dump($errors); //or print_r($errors) 
     exit; 
} 

Une autre chose si elle ne fonctionne pas, vous pouvez essayer de commenter certaines règles de validation de vos règles et de voir quelle règle failes.

+0

J'ai utilisé votre suggestion, Comment puis-je remplacer la validation ??? aidez-moi s'il vous plaît –

Questions connexes