Yii2 plusieurs modèles dans un formulaire
La façon d'utiliser plusieurs modèles dans une forme en Yii2?
Mon cas:
Dans mon action de création, je peux enregistrer dans agenda_fiscalizacao table, mais dans la mise à jour je reçois ce message d'erreur lorsque j'essaie de charger le formulaire:
Call to a member function formName() on array
Mon Action De Mise À Jour:
public function actionUpdate($id)
{
$model = $this->findModel($id);
$modelAgenda = AgendaFiscalizacao::findAll(['fiscalizacao_id' => $id]);
if ($model->load(Yii::$app->request->post()) && Model::loadMultiple($modelAgenda, Yii::$app->request->post())) {
$valid = $model->validate();
$valid = $modelAgenda->validade() && $valid;
if ($valid) {
$model->save(false);
$modelAgenda->save(false);
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('update', [
'model' => $model,
'modelAgenda' => $modelAgenda
]);
}
Mon formulaire en vue de
<?= $form->field($modelAgenda, 'agenda_id')->checkboxList(Agenda::combo(), ['class' => 'checkbox']) ?>
<?= $form->field($model, 'bioma_id')->dropDownList(Bioma::combo(), ['prompt' => $prompt]) ?>
<?= $form->field($model, 'nome')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'tipo_doc')->radioList(['CPF'=>'CPF', 'CNPJ'=>'CNPJ'], ['class' => 'radio']) ?>
<?= $form->field($model, 'n_doc')->widget(MaskedInput::className(), ['mask' => ['999.999.999-99', '99.999.999/9999-99']]) ?>
<?= $form->field($model, 'observacao')->textarea(['rows' => 7]) ?>
Ce qui pourrait être mauvais?
MODIFIER (message d'erreur):
OriginalL'auteur jflizandro | 2016-01-26
Vous devez vous connecter pour publier un commentaire.
1) Si tu veux travailler avec plusieurs modèles du même type, l'erreur est dans cette ligne:
Tout d'abord, il convient de
$modelAgenda->validate()
, deuxième$modelAgenda
contient éventail de modèles,validate()
méthode ne peut être appelée que sur un seul modèle.Pour la validation de plusieurs modèles Yii2 suggère à l'aide intégrée dans la méthode
validateMultiple()
:De travailler avec de multiples modèles est bien couverts dans les docs officielles (La Collecte Des Tableaux D'Entrée).
Remarque qu'ils recommandent à l'indice de modèles de tableau par
id
avant comme ceci:2) Si vous avez juste besoin de deux modèles de type différent, ne pas utiliser de
findAll()
parce que c'est pour trouver de multiples modèles et renvoie toujours array (même à vide). Utilisationnew
pourcreate
action etfindOne()
pourupdate
d'action pour initialiser les modèles. Disons que vous avez initialisé deux modèles,$firstModel
et$secondModel
, alors vous pouvez charger et de les enregistrer comme ceci:Transaction est ajouté dans le cas de sauvegardes de second modèle sera un échec (donc le premier modèle ne seront pas enregistrées).
Alternativement, vous pouvez déclarer les transactions à l'intérieur de votre modèle, par exemple:
Alors utilisez simplement:
Pour plus des deux modèles, il est préférable d'utiliser des boucles.
P. S. je vous recommande de sauvegarde distinctes pour les différents contrôleurs /actions et de l'appeler via AJAX, il sera de plus en plus conviviale.
Pour l'enregistrement des relations de lecture Économie Des Relations.
J'ai mis à jour la réponse avec des explications plus détaillées.
Je pense que le problème est en vue, parce que quand je commente la ligne qui crée la checkboxList, l'erreur disparaît et que le formulaire est correctement chargé.
Le checkboxList doivent recevoir le même modèle que les autres champs ($form-> ($model, 'agenda_id')->checkboxList...).
OriginalL'auteur arogachev
Vous pouvez consulter en suivant le lien pour exemple : http://blog.dedikisme.com/blog/2014/10/13/yii2-building-a-single-form-with-multiple-models
OriginalL'auteur Dedy Kurniawan
Vous n'êtes pas rendu $modelAgenda de view/update.php pour view/_form.php fichier lors de l'utilisation de rendu dans le fichier de mise à jour.
OriginalL'auteur Lakhan Singh