Yii Framework Forum: Problem mit Szenarien - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Problem mit Szenarien Rate Topic: -----

#1 User is offline   g3ck0 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 03-June 09

Posted 07 June 2009 - 08:03 PM

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

#2 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 08 June 2009 - 12:47 AM

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

#3 User is offline   g3ck0 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 03-June 09

Posted 08 June 2009 - 05:26 AM

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"?
0

#4 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 08 June 2009 - 07:58 AM

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

#5 User is offline   g3ck0 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 03-June 09

Posted 08 June 2009 - 03:32 PM

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

0

#6 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 09 June 2009 - 12:43 AM

Super, gut zu wissen.
0

#7 User is offline   g3ck0 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 03-June 09

Posted 09 June 2009 - 09:55 AM

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users