|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité de passage
![]() Inscription : mai 2007 Messages : 9 ![]() |
Bonjour tout le monde,
J'ai un problème avec les embedRelations. En effet j'ai une table "client", liée à une table "simulation" elle même liée à une autre table "relevé". Elles sont en one-to-one. Jusque là pas de problème. Je souhaite tout crée en un formulaire. J'ai donc créé un ClientCustomForm dans lequel j'ai la simulation en embedRelation. Dans cette même simulation j'ai ausi un embedRelation sur le relevé. Lorsque je crée un enregistrement, doctrine crée deux enregistrements. Le premier foireux, le second est valide. Je me suis rendu compte que symfony faisait plusieurs Insert dans ses requêtes. J'ai en plus dans la table client un lien vers un conseiller. J'ai donc dans mon formulaire un select avec la liste des conseillers. La requête se permet de recréer un conseiller. Je ne comprends pas du tout ce qui se passe. Voici le log des requêtes : Code :
Les trois insert en rouge n'ont rien à foutre là. Mon formulaire client Code :
Code :
Code :
|
||||||||
|
|
00
|
|
|
#2 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
C'est un problème qui reviens épisodiquement et qui n'a pas de solution unique.
Essaye avec une relation à la fois, pour voir la quel "déconne" (en espérant qu'il n'y en ait qu'une). Dans ton schéma, fait attention aux enum qui sont source d'erreur dans l'évolution d'une application. Et certain sont sur des données qui sont susceptible d’évoluer dans le temps, une bonne vielle liaison sur une table de paramètre est parfois préférable (souvent même)(Oui, je sais, je n'aime pas les enum). La table advisor gagnerait à étendre, par héritage doctrine, la table sf_guard_user, une seul table, plus simple. De même, pourquoi deux table pour advisor et compagny qui sont, à priori, un tout (liaison 1-1). Tu as un plugin : ahDoctrineEasyEmbeddedRelationsPlugin qui pourrait t'aider pour la gestion des embed form (cf la page Les plugins les plus intéressants pour symfony 1.4.x et doctrine)
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2007 Messages : 9 ![]() |
Bonjour Michel,
Tout d'abord merci pour cette réponse rapide. Je vais tenter le plugin dont j'avais déja entendu parler. Pour le relation advisor -> company, ce n'est pas un one-to-one mais un one-to-many, c'est bien spécifié dans le schema. Une "company" peut être liée à plusieurs "advisor". Pour les enums, je suis d'accord avec toi, mais je les ai utilisés seulement dans le cas de valeurs dont je suis intimement persuadé qu'elles n'évolueront pas dans le futur. |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : mai 2007 Messages : 9 ![]() |
Bon j'me retrouve avec exactement le même problème via le plugin.
C'est la relation Simulation -> ConsumptionStatement qui fait tout planter. J'me sens complètement perdu. J'pense que j'vais essayer de revoir la structure de mon schéma pour ne pas avoir à imbriquer des relations de manière aussi complexe. |
|
|
00
|
|
|
#5 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Dans la notion de form embed, tu ne peux avoir, à un niveau que des form du niveau +1.
Soit pour un form client, que des tables liées directement. La table ConsumptionStatement n'a pas de liaison avec client...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : mai 2007 Messages : 9 ![]() |
Bon j'ai fini par à peu près résoudre mon problème.
En fait dans le formulaire de ConsumptionStatement je faisais un appel à $this->getObject()->getClient(). Et il semblerait que cet appel génère un INSERT de client au moment de la validation. Par contre je n'ai aucune idée de pourquoi. Mais maintenant je me retrouve embetté pour modifier l'upload path des fichiers de ConsumptionStatement, qui dépend du nom et prénom du client. Vu qu'on est dans un formulaire de création, l'objet client n'existe pas donc j'ai besoin d'effectuer ceci lors de la validation du formulaire. Ai-je une possibilité de changer le path des validateurs de fichiers au moment de la validation du formulaire ? |
|
|
00
|
|
|
#7 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Non.
Les embed sont sauvegardé avant le form principal. Sauf à réécrire une bonne partie de sfFormSymfony... Le système est conçu pour gérer des enregistrements existants, pas pour la création. Le mieux est de travailler en deux étape, création du client seul. Puis, une fois validé, affichage de l'écran complet de modification du client, qui inclus la création, modification, suppression des enregistrements liés.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : mai 2007 Messages : 9 ![]() |
Merci beaucoup pour ces infos.
Malheureusement le but de l'appli est justement d'avoir à passer par le moins de formulaires possible. J'vais essayer de juste séparer l'upload de fichiers. |
|
|
00
|
|
|
#9 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Il reste la possibilité de faire un formulaire non lié à doctrine. Ce qui nous laisse les validations. Et de traiter directement le retour du formulaire. Un peu plus long en écriture pour le développeur, mais moins long que de faire des tas d'essais infructueux
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : juillet 2007 Messages : 2 ![]() |
Bonjour,
Je viens d'être confronter au même problème, cela vient bien du fait de faire un $this->getObject()->getMonObjetEnRelation() dans le formulaire embarqué si cet objet n'existe pas, symfony en créer un du coup lors de l'enregistrement de formulaire embarqué (qui se fait avant le formulaire principal) créer un enregistrement vide de l'objet en relation... j'espère me faire comprendre :p mon cas: relation one/one entre client et image j'embarque le form image dans celui du client, mais dans le form image je fait appel à une méthode de mon objet client $this->getObject()->getClient()->getFileSrc() (pour mon widget sfWidgetFormInputFileEditable) du coup j'avais un client vide qui était créé avant l'enregistrement de mon nouveau client. j'ai modifié pour ne plus faire appel au méthode de mon client et tout est rentré dans l'ordre. J'espère avoir été compris, et que cela aidera d'autre personne. a+ |
|
|
00
|
|
|
#11 | ||||
|
Invité de passage
![]() Inscription : mai 2007 Messages : 9 ![]() |
Salut quiche,
Merci de m'avoir confirmé le problème. C'est le genre de truc qu'on ne nous apprend pas dans les tutos Pour l'upload de fichiers j'ai trouvé une solution plutôt intéressante. Si on ne spécifie pas d'option 'path' dans le validateur, symfony nous laisse gérer le save du fichier. Et comme j'ai accès aux inputs de l'utilisateur (le formulaire vient d'être validé) je peux donc dynamiquement enregistrer mon fichier dans un chemin qui comprend les données envoyées. Dans le form Code :
Code :
http://oldforum.symfony-project.org/index.php/m/80174/ En espérant que cela serve à qqn. |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com