2017-10-13 7 views
-1

Mon modèle contient le champ "authorname" qui doit être remplacé par le login de l'utilisateur actuel avant la validation du formulaire lors de la création des enregistrements.Yii2 calculer les données de champ avant la validation

Ok, je l'ai écrit dans le contrôleur approprié:

public function beforeValidate() { 
    if($this->isNewRecord) { 
     $this->authorname = Yii::$app->user->identity->username; 
    } 
    return parent::beforeValidate(); 
} 

Il fonctionne - pas besoin de montrer champ calculé sous forme, substituion fonctionne bien. SAUF une chose désagréable - la chaîne de recherche au-dessus de la grille de données a aussi $ this-> isNewRecord = true et filtre l'ensemble de données par nom d'utilisateur. Comment appliquer Yii2 ne pas évaluer l'enregistrement de recherche comme le nouvel enregistrement? Ou comment écrire la fonction beforeValidate() pour obtenir la différence entre les données réellement insérées et la ligne de recherche virtuellement insérée?

+0

Pourquoi ne pas définir la valeur par défaut pour 'authorname' pour nom d'utilisateur dans les règles? Plus facile que 'beforeValidate()'. Je ne connais pas votre cas mais plus simple je suppose. –

+0

Vous devez utiliser beforeSave au lieu de beforeValidate. – nicolascolman

+0

@nicolascolman C'est faux - le champ vide bloque la validation avant la sauvegarde. Ainsi, réécrivez beforeSave - trop tard. –

Répondre

-1

Retirez la ligne du SearchModel:

andFilterWhere(['like', 'authorname', $this-> authorname]) 

ou

'authorname' => $this->authorname, 
+0

Pas 100% mais assez dans mon cas –