yii2

2017-06-10 23 views
0

在用戶模式我有以下規則yii2

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

我想要做的是,使這種統治期間新用戶創建可用,在更新(當用戶輸入其他用戶名或電子郵件來檢查它是否唯一)。但是如果我不更改當前用戶模型中的用戶名(在更新操作中),即使用戶不編輯當前用戶名和電子郵件並僅保存填充表單(使用當前值),也會給出錯誤「用戶名不是唯一的」。

例如,您的用戶名是:user1。您只打開了更新操作並更改了密碼。在這種情況下,我的配置給user1不是唯一的消息。另一種情況是,您可以更改用戶名:用戶2,它的正常工作

下面是操作的代碼:

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); 
} 

如何防止這種行爲?

+0

我試過你的情況,但沒有得到相同的結果。另外我的yii2版本是'2.0.11.2'。您使用的是哪個版本的yii2? – paul

+0

我認爲這不是版本,我們有相同的版本 –

+0

它沒有任何意義。你能列出你的模型的規則嗎? – paul

回答

3

您可以通過兩種方式做到這一點,首先從Yii2入門套件獲取更多信息。在這裏你將這些添加到你的規則。並將下面的這個函數添加到UserForm的末尾。

[ '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; 
    } 

第二種方法是創建自己的驗證器並在Update場景中使用它。 例如:

[['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])){ 

      } 

     } 
    } 

然後您應該爲您的操作添加一個場景。

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); 
}