Problem mit Szenarien

Ich werde gerade echt sauer… Ich bekomme es nicht gebacken mit Szenarien zu arbeiten. Und zwar habe ich eine Benutzerverwaltung und die folgenden Regeln für das User-Model definiert:

public function rules()


{


	return array(


		array('username, password, password_repeat', 'required'),


        array('username', 'unique', 'caseSensitive' => 'false'),


		array('username', 'length', 'min'=>3, 'max'=>10),





		array('password', 'compare', 'compareAttribute'=>'password_repeat', 'on'=>'create'),


		array('password', 'length', 'min'=>5, 'max'=>32, 'on'=>'create'),


		array('password', 'checkUpdatedPassword', 'on'=>'update'),





		array('email', 'length', 'min'=>5, 'max'=>50),


	);


}





/**


 * Diese Methode dient  dem Vergleich des Passworts, wenn diese geändert


 * wird.


 **/


public function checkUpdatedPassword($attribute, $params)


{


	if(!$this->hasErrors())  // we only want to authenticate when no input errors


    {


        // Prüfen, ob das Passwort leer ist, denn dann muss keinerlei


        // Prüfung erfolgen, außer, dass eben die Confirm-Eingabe auch leer


        // ist


        if ($this->password == '') {


        	// Prüfen, ob das Confirm-Passwort auch leer ist


        	if ($this->password_repeat != $this) {


        		$this->addError('password', 'Both inputs for password have to be empty.');


        	}


        } else {


			// Prüfen, ob beide Passwörter identisch sind


			if ($this->password != $this->password_repeat) {


				$this->addError('', '');


			}


        }


    }


}








public function safeAttributes()


{


	return array('username', 'password', 'password_repeat', 'email');


}

Die Methoder checkUpdatedPassword wird aber nie ausgeführt. Das Problem ist wohl der “on”-Wert und ich denke, dass ich da einen Gedankenfehler drin habe.

wenn ich nun zB. die folgende URL habe, dann ist doch des nach dem Slash das Szenario, oder?

http://www.eine-url…p?r=user/create

d.h. ich hätte automatisch ein Update- und Create-Szenario? Oder stimmt das so nicht? oO Wenn nein, wie muss ich das dann machen?

Nicht sauer werden, bringt doch auch nix. ;)

Du musst das Szenario von Hand setzen, nachdem du das Model erstellt hast:

<?php


$model=new XyzRecord;


$model->scenario='login';


if(isset($_POST['XyzRecord']))


    $model->attributes=$_POST['XyzRecord'];

Alternativ gibt es zwei Szenarien, die automatisch verwendet werden: insert und update. Bei neuen Records werden automatisch alle Regeln des insert-Szenario verwendet, bei Updates automatisch die Regeln des update-Szenarios.

Ah, okay. Das ist schon mal nicht schlecht. D.h. dass ich beim Erstellen eines Users das über "on"=>"insert" regeln kann und beim updaten eben über "on"=>"update"?

Richtig - konnte das aber auch noch nicht ausprobieren. Evtl. kannst du's ja einfach mal testen und kurz über deine Ergebnisse berichten?

hat wunderbar funktioniert! hier mal mein angepasstest "regelwerk" und die benötigte methode dazu:

<?php


	/**


	 * @return array validation rules for model attributes.


	 */


	public function rules()


	{


		return array(


			array('username, password, password_repeat', 'required'),


			array('username', 'unique', 'caseSensitive' => 'false'),


			array('username', 'length', 'min'=>3, 'max'=>10),





			array('password', 'compare', 'compareAttribute'=>'password_repeat', 'on'=>'insert'),


			array('password', 'length', 'min'=>5, 'max'=>32, 'on'=>'insert'),


			array('password', 'checkUpdatedPassword', 'on'=>'update'),





			array('email', 'length', 'min'=>5, 'max'=>50),


		);


	}





	/**


	 * Diese Methode dient  dem Vergleich des Passworts, wenn diese geändert


	 * wird.


	 **/


 	public function checkUpdatedPassword($attribute, $params)


 	{


   		if(!$this->hasErrors())  // we only want to authenticate when no input errors


        {


            // Prüfen, ob das Passwort leer ist, denn dann muss keinerlei


            // Prüfung erfolgen, außer, dass eben die Confirm-Eingabe auch leer


            // ist


            if ($this->password == '') {


            	// Prüfen, ob das Confirm-Passwort auch leer ist


            	if ($this->password_repeat != $this) {


            		$this->addError('password', 'Both inputs for password have to be empty.');


            	}


            } else {


				// Prüfen, ob beide Passwörter identisch sind


				if ($this->password != $this->password_repeat) {


					$this->addError('password', 'Password must be repeated exactly.');


				}


            }


        }


 	}?>

Super, gut zu wissen.

ich muss doch noch einen nachtrag liefern: und zwar habe ich noch den UserController anpassen müssen, da sonst keinerlei Sternchen für die required-Felder erscheinen:

<?php


/**


	 * Updates a particular user.


	 * If update is successful, the browser will be redirected to the 'show' page.


	 */


	public function actionUpdate()


	{


		$user=$this->loadUser();


		$user->scenario = 'update'; // <<< Hier das Szenario hinzugefügt!


		if(isset($_POST['User']))


		{


			$user->attributes=$_POST['User'];


			if($user->save())


				$this->redirect(array('show', 'id'=>$user->id));


		}


		$this->render('update',array('user'=>$user));


	}


?>

Ich habe das Szenario hinzugefügt. Yii selbst beachtet trotzdem die Update-Regel, auch wenn ich das Szenario nicht angebe. Es ging hierbei nur um das Sternchen, welches ohne diese Angabe gefehlt hat.