|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Bonjour,
J'ai un tout petit soucis avec symfony. J'aimerais connaître la méthode pour pouvoir faire plusieurs enregistrement d'un coup avec un seul formulaire qui ne dépend que d'une seule table. J'ai une table équipement. Donc dans mon formulaire New, j'ai bien tous les champs lié à l'ajout d'un seul equipement. J'affiche tous les champs inputs dans une table sur une seule ligne, et à terme, je voudrais créer un bouton "ajout ligne" pour pouvoir rajouter une nouvelle ligne pour ajouter un nouvel équipement en plus et en même temps Mais avant de créer tous ca dynamiquement, je voudrais simplement que lorsque que je clique sur le lien nouvel équipement, je tombe sur la fiche new, mais avec la possibilité d'ajouter deux équipements d'un coup. Déjà est ce possible ? Et si oui, dans quel fichier doit porter mes recherches (comment afficher deux lignes d'un coup ? Faire plusieurs sauvegarde dans la BDD en fonction du nombre de ligne ?) Merci d'avance pour votre aide
|
|
|
00
|
|
|
#2 |
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
J'aurai tendance à penser que les embed forms sont la solution à ce que tu désires.
Corrige moi si je me trompe, tu veux en réalité pouvoir afficher plusieurs fois le même formulaire pour créer autant d'équipement qu'il y aura de formulaires affichés c'est bien ça ? Tu as soit la possibilité d'embarquer autant de formulaires de type equipement que tu le souhaites avec l'aide de la méthode embed, et dans ce cas lorsque tu affiches ton form celui-ci t'affichera tous ceux qui sont embarqués. Au moment de lier tes formulaires, tu n'as qu'à bind le formulaire parent pour que tous les suivants le soient également, et par la même occasion la sauvegarde en BDD. Ou alors la solution du goret feignant (ouais j'la vends bien) qui consiste à afficher autant de form que tu as besoin. L’inconvénient c'est que comme son nom l'indique c'est un peu cochon de faire une boucle pour afficher les forms, et une boucle pour les bind ensuite. Mais c'est un chouhia moins prise de tête que les embed lorsqu'on n'a pas l'habitude. Cela dit je ne peux que préconiser la première solution qui s'adaptera très bien et qui te servira plus d'une fois car les embed sont assez puissants. Donc dans un premier temps en statique tu embarques deux formulaires en dur pour vérifier que ça fonctionne, ensuite tu feras peut-être quelque chose en AJAX pour créer dynamiquement une succession de formulaires embarqués je présume. |
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
C'est exactement ce que je veux faire.
J'ai rajouter un "$this->embedForm('equipement', $this);" dans mon formulaire d'équipement. Comment est ce que je peux lui dire ensuite, de m'afficher deux lignes d'équipement ? Je dois avouer que pour le moment, je voudrais comprendre comment fonctionne l'envoie de formulaire multiple avec symfony. Donc même la méthode "cochon", ca me va |
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Baptiste NaudinatDéveloppeur Web Inscription : mai 2011 Messages : 70 ![]() |
Pour afficher plusieurs fois le même formulaire, je suis pas sur que l'embed form soit la bonne solution.
Surtout si ensuite doit s'ajouter une couche AJAX, il vaut mieux que le nombre de formulaire soit géré dans l'action que dans le modèle (après tout il n'y a aucune logique métier en plus, enfin ça me semble plus du ressort du contrôleur). L'embedForm je ne l'utilise que dans le cas de formulaires dont les modèles ont une relation Doctrine, pour le reste c'est souvent trop spécifique et autant repenser le processus en entier. Sinon, oui, mon côté goret fainéant, je l'assume bien au quotidien |
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
Je ne suis pas convaincu par ton
Code :
$this->embedForm('equipement', $this); Pour l'embarquement de formulaires je ne peux que te conseiller l'excellente (et foisonnante sur la toile) documentation de symfony concernant les formulaires avancés. Si tu veux un exemple je peux te rediriger vers un topic que j'avais ouvert il y a quelques semaines ou je débutais moi même avec les formulaires embarqués, c'est un cas sensiblement similaire ... il te suffira juste de l'adapter avec ton propre modèle. Il y a le code qui fonctionnait à la fin et sur lequel tu peux te baser. EDIT: @Maerlyn J'approuve sur le fait que l'embarquement doit se faire dans l'action et non dans le modèle. Par contre, ça ne me dérange pas particulièrement d'avoir plusieurs fois le même formulaire embarqué. C'est même plutôt pratique surtout au moment du bind() qui se fait en cascade. J'étais assez perplexe également sur cette manière de faire ... jusqu'à ce que je l'essaye et qu'elle fonctionne parfaitement bien |
|
|
00
|
|
|
#6 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Je ne me trompe en disant que pour afficher deux fois mon formulaire, je le fais dans l'action "new" d'équipement ?
Et dans mon template, je devrais faire un foreach ? Ou j'ai définitivement rien compris ? |
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
Tu as à 50% compris ! ^^
A priori c'est bien pour une action new que tu veux afficher tes n formulaires donc c'est bien dans cette action que tu vas construire ton form. La ou tu te trompes c'est justement que grâces aux embed, tu n'auras pas besoin de faire un foreach pour tes form. Tu as besoin d'un foreach si tu fais un form1, form2, form3, etc. que tu regroupes dans un tableau de form. Si tu utilise l'embarquement de formulaires, tu n'as qu'à faire un ou $form est le formulaire parent qui regroupe les n sous-formulaires. |
|
|
00
|
|
|
#8 | ||||||
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Voici mon formulaire Equipement
Code :
Code :
Code :
Je doute que le soucis vienne de Symfony, mais plutôt de moi |
||||||
|
|
00
|
|
|
#9 | ||
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
Le contenu de ton action est mauvais, tu crées trois fois un formulaire sur la même variable sans rien embarquer.
Quelque chose dans ce goût là me semble d'avantage se rapprocher de ce que tu veux. Code :
Code :
$this->embedForm('equipement', $this); Pour terminer, en ce qui concerne l'affichage rendu, je te conseille de jeter un oeil au résultat d'un echo $form, histoire vérifier que tu as bien les trois, et ensuite si tu as envie de t'amuser à parcourir tout le formulaire pour afficher tes champs ici ou là libre à toi.. |
||
|
|
10
|
|
|
#10 |
|
Membre habitué
![]() Baptiste NaudinatDéveloppeur Web Inscription : mai 2011 Messages : 70 ![]() |
Petit détail, qui ne fais pas trop avancer le débat sur l'organisation du code, mais qui peut simplifier la vie. J'étais sur la page de l'API de sfForm pour un autre truc, et je suis tombé là dessus :
http://www.symfony-project.org/api/1...bedformforeach Ca peut peut-être t'aider un peu |
|
|
00
|
|
|
#11 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Merci beaucoup pour votre aide.
J'ai bien les 3 $form['equipementform'] dans mon echo $form. Mais du coup, je devrais bien faire un foreach dans mon template pour afficher mes 3 formulaires non ? En faite, avant tous ca, j'avais déjà fait un petit bouton qui appel une fonction jquery qui me recopie la ligne_équipement (avec tous mes champs) et ajoute a l'identifiant un chiffre auto-incrémenté. Pas de soucis avec ca, il me rajoute bien ma ligne, et me change bien l'identifiant du champ input de ma ligne. Mais je suppose que ce n'est pas une bonne idée, puisque pour enregistrer les données, symfony a besoin d'avoir le vrai nom de l'identifiant du champ input ? |
|
|
00
|
|
|
#12 | |
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
Citation:
Justement, en partant du principe que comme je te l'ai écrit ton $form correspond au formulaire parent qui accueille les n sous-form, tu verras apparaitre tous tes forms juste en faisant UN echo $form dans ta template, chaque formulaire embarqué sera affiché. Par contre je n'ai vraiment pas compris ce que tu veux dans la deuxième partie de ton message. |
|
|
|
00
|
|
|
#13 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Si je veux avoir mes lignes de mon tableau, je vais être obligé de faire un foreach.
En faisant un echo $form en dehors de mon tableau mais dans le $form, j'ai bien mes quatres formulaires. En remplissant tous, il me met, quand je valide mon form, * Unexpected extra form field named "equipementform0". * Unexpected extra form field named "equipementform1". * Unexpected extra form field named "equipementform2". C'est un soucis de validator ou je délire une nouvelle fois ? |
|
|
00
|
|
|
#14 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je n'ai que parcouru rapidement les conseils données.
Une chose me surprend, c'est le joyeux mélange entre php et javascript... Soit tu traites en php, soit tu le fais en javascript, évite de mélanger les deux. L'idéal serait d'avoir un écran qui fonctionne pour ajouter une ligne à la fois, le tout en php. Ensuite, rajoute du js pour pouvoir en créer plusieurs. Accessoirement, si tu utilise du js pour le rajout de plusieurs lignes, je ne vois plus trop l'intérêt d'en avoir plusieurs à gérer à l'écran... vu que l'ajout sera presque instantané, une action json pour ajouter l'enregistrement et nettoyer la zone d'ajout et une action pour récupérer juste le tableau des lignes à afficher...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#15 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Le faire en php, puis en js c'est ce que je veux faire, et c'est pratiquement ce que j'ai déjà fait.
En faite, j'ai déjà créer ma page php qui ajoute un équipement à la fois. Ceci, aucun soucis. Et qui enregistre bien mes infos quand je valide mon formulaire. Puis j'ai bien rajouter mon petit bouton "ajout de ligne", qui appel une fonction JS, qui me permet de rajouter une ligne. (C'est la méthode dont je ne suis pas sur). J'ai mon <form> puis ma <table> puis ma <tr> avec toute mes <td> et dans chaques <td> j'ai mes champs inputs de mon formulaire. En JS, ce que je faisais, c'était de copier la ligne <tr> et la remettre en dessous. Pas de soucis de ce coté là non plus. Je changeait bien le nom de mes champs inputs. Pour chaque ligne je mettais un numéro autoincrémenté a la fin du nom et de l'id. Vu comme je ne savais pas utiliser les embedForm, je ne sais pas si c'est une "solution" pour rajouter plusieurs équipements d'un coup, et si ca fonctionne bien... D'où le fait que je me soit tourné vers l'ajout de plusieurs équipements d'un coup avec deux lignes dés le départ, mais ca aussi, je coince Ma solution pour ajouter une ligne en jquery vous sembles t'elle la bonne ? |
|
|
00
|
|
|
#16 |
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Désolé pour le double post, mais là je bloque ^^
J'ai un soucis avec les validators (enfin je pense que c'est ca). J'ai ce message là : * Unexpected extra form field named "equipementform0". * Unexpected extra form field named "equipementform1". * Unexpected extra form field named "equipementform2". Quelqu'un saurait-il pourquoi ? Merci d'avance |
|
|
00
|
|
|
#17 |
|
Membre actif
![]() Fabrice AgnelloDéveloppeur informatique Inscription : octobre 2010 Messages : 76 ![]() |
Bonjour,
pour le soucis avec les validators et faire taire l'avertissement, il faut ajouter dans votre configure() la ligne suivante : Code :
$this->validatorSchema->setOption( 'allow_extra_fields', true ); Je n'ai fait que survoler le reste de votre problème, mais pour avoir été confronté au même besoin, je me suis tourné vers une solution s'approchant de ce que vous propose Michel Rotta. Je vous suggère aussi d'aller visiter ce lien qui est un bon tutoriel à propos de ce que vous essayez de faire => http://tech.cibul.net/fr/formulaires...1-4-et-jquery/ HTH. |
|
|
00
|
|
|
#18 | ||||||||
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
Désolé pour l'absence prolongée, d'autant plus que c'est moi qui t'ai plongé dans cette galère que sont les formulaires embarqués. En fait dans mon deuxième post, je t'ai suggéré de jeter un oeil à mon topic et ce n'est pas pour rien.
La solution à ton problème d'extra-form-field se trouve dedans. Et plus précisément à cette ligne là : Code :
Code :
$this->validatorSchema->setOption( 'allow_extra_fields', true ); L'idée, et là j'insiste sur le fait que tu devrais te baser sur ce que j'ai fait puisqu'il s'agit d'un cas similaire, est la suivante : -1- Je crée mon formulaire parent que je pourrais binder (et donc le bind se fera en cascade par la suite) de type equipementForm et je n'utilise aucun de ses champs Code :
-2- Je crée un formulaire vierge (equipementCollectionForm) qui embarquera tous les sous formulaires qui seront de type A également Code :
$equipementCollectionForm = new sfForm(); Code :
Code :
$equipementForm->embedForm('equipements', $equipementCollectionForm); Code :
Maintenant pour ce qui est de la partie javascript je suis moins apte à t'éclairer |
||||||||
|
|
00
|
|
|
#19 | ||||
|
Membre à l'essai
![]() Développeur Web Inscription : avril 2011 Messages : 40 ![]() |
Pardon pour l'absence, j'étais occupé par la finalisation de mon dossier de stage ^^
Donc je suis rendu là : Dans mon action class New : Code :
Code :
Il me dit "csrf token: Required." D'où vient mon problème ? PS : Ton foreach, je ne vois pas à quoi il correspond. Code :
foreach ($equipements as $i => $equipement) |
||||
|
|
00
|
|
|
#20 | ||
|
Membre habitué
![]() Nicolas Développeur Web Inscription : avril 2011 Messages : 95 ![]() |
Qu'est-ce que c'est que ces lignes 13 et 14 là ?
Code :
Remplace ces deux lignes par ce que je t'ai écrit en point 4, et tu conclus avec un Et pour le foreach désolé effectivement mon exemple était légèrement différent dans la mesure ou la liaison entre les deux tables était déjà définie. Le for que tu as mis fera l'affaire. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com