2017-06-10 7 views
0

In Benutzer Modell I Regel folgende habenyii2 auf Update-Aktion für einzigartiges Attribut

[['username', 'email'], 'unique'], 

Was ich tun möchte, ist, um diese Regel bei neuen Benutzererstellung, auf Update zur Verfügung zu stellen (wenn der Benutzer einen anderen Benutzernamen eingegeben oder email um zu überprüfen, ob es einzigartig ist oder nicht). Aber wenn ich den Benutzernamen im aktuellen Benutzermodell nicht ändere (in der Aktualisierungsaktion) gibt es den Fehler "Benutzername ist nicht eindeutig", auch wenn der Benutzer den aktuellen Benutzernamen und die E-Mail nicht bearbeitet und nur das ausgefüllte Formular (mit den aktuellen Werten) speichert.

Zum Beispiel ist Ihr Benutzername: user1. Sie haben die Aktualisierungsaktion geöffnet und nur Ihr Passwort geändert. In dieser Situation gibt meine Konfiguration user1 ist keine eindeutige Nachricht. Eine andere Situation ist, können Sie Benutzernamen zu ändern: user2 und es ist richtig funktioniert

Hier Aktionen Code:

public function actionMe() 
{ 
    $data["model"] = $model = $this->findModel(Yii::$app->user->id); 

    if ($model->load(Yii::$app->request->post())) { 
     if (trim($model->password) != "") 
      $model->setPassword($model->password); 
     if ($model->validate() && $model->save()) 
      return $this->redirect(['site/index']); 
    } 
    return $this->render('me', $data); 
} 

Wie kann ich dieses Verhalten zu verhindern?

+0

Ich versuchte Ihren Fall, aber nicht das gleiche Ergebnis. Zusätzlich ist meine yii2 Version '2.0.11.2'. Welche Version von yii2 verwendest du? – paul

+0

Ich denke es geht nicht um die Version, wir haben die gleiche Version –

+0

Es macht keinen Sinn. Können Sie die Regeln Ihres Modells auflisten? – paul

Antwort

3

Sie können es auf zwei Arten tun, erstens ist mehr aus Yii2 Starter Kit übernommen. Hier fügst du diese zu deinen Regeln hinzu. Und fügen Sie diese Funktion am Ende Ihrer UserForm hinzu.

[ 'username', 'unique', 'targetClass' => User::className(), 'filter' => function ($query) { 
       if (!$this->getModel()->isNewRecord) { 
        $query->andWhere(['not', ['id'=>$this->getModel()->id]]); 
       } 
      }], 



/** 
    * @return app/models/User 
    */ 
    public function getModel() 
    { 
     if (!$this->model) { 
      $this->model = new User(); 
     } 
     return $this->model; 
    } 

Zweiter Weg ist nur erstellen Sie Ihre eigenen Validator und verwenden Sie es auf Update-Szenario. Zum Beispiel:

[['username', 'email'], 'myUniqueValidator','on'=>'update'], 

public function myUniqueValidator($attribute,$params){ 
     if(!$this->hasErrors()){ 
      if(User::find()->where([$attribute=>$this->$attribute])->andWhere(['<>','id',Yii::$app->user->id])){ 

      } 

     } 
    } 

dann sollten Sie ein Szenario zu Ihrer Aktion hinzuzufügen.

public function actionMe() 
{ 
    $data["model"] = $model = $this->findModel(Yii::$app->user->id); 

    if ($model->load(Yii::$app->request->post())) { 
     $model->setScenario('update'); 
     if (trim($model->password) != "") 
      $model->setPassword($model->password); 
     if ($model->validate() && $model->save()) 
      return $this->redirect(['site/index']); 
    } 
    return $this->render('me', $data); 
} 
Verwandte Themen