|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Bonjour,
J'ai un souci avec la validation d'un formulaire dans symfony, il s'agit d'un formulaire dans un module que j'ai créé pour la gestion des livraisons de produits faisant parties de Packages: Voici une partie de mon schema.yml de la table concernée: Code :
et grâce à ça j'ai des listes déroulantes pour article et package dans le formulaire. mais quand je crée une nouvelle livraison et je fais save, j'ai l'erreur "Invalid" devant les champs de noms d'Article et package A votre avis, ça vient de quoi ce problème: de la méthode __toString(), des validateurs...? je cherche mais je trouve pas encore |
||
|
|
00
|
|
|
#2 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Je pense pas que ça ne vient pas de la méthode __toString(), je viens de tester en la supprimant et j'ai toujours "Invalid"..
voici la partie du code générée par symfony dans le controller qui est sensé traiter le formulaire: Code :
|
||
|
|
00
|
|
|
#3 | ||
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je pencherais pour un problème lié au schéma (disons dans les 30% de probabilités).
Essaye avec un schéma modifié ainsi Code :
Dans le cadre d'une table de liaison pour une liaison n-n, c'est ce que l'on fait généralement, mais avec des arguments sur la liaison, c'est beaucoup plus discutable, tout dépend e ce qui se cache derrière les ..... et dans le reste du schema. Il est possible de rajouter un index unique sur les deux clefs pour s'assurer de l'unicité de la relation, mais je pense qu'ici on doit pouvoir envisager plusieurs lignes avec des quantités différentes. Attention à ne pas avoir de relations réciproques que Package et Article.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
||
|
00
|
|
|
#4 | |||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Citation:
- 'nbr_pieces' - 'quantite_par_piece' - 'unite' Citation:
Citation:
Si je mets à jour le schema.yml, cela ne risque pas d'écraser toutes classes et mes fichiers Form...j'ai fait qq modifications et j'ai pas envie de les perdre. |
|||
|
|
00
|
|
|
#5 | |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Citation:
Tu as donc trois tables avec deux relations 1-n et non pas deux tables avec une relations n-n avec des arguments qui en génère une troisième (table) pour la liaison. Il faut que la table "LivraisonPackageArticle" bénéficie de son propre Id. Quant tu régénères, tu effaces tous ce qui se trouve dans lib/modeles/doctrine/base, lib/form/doctrine/base et lib/filter/doctrine/base. Si tu y a fait des modifications (ce qui est plus que fortement décommandé) il faudra les reporter sur les fichiers dans doctrine/ de chacun des trois. Attention, toutes les données de la base régénérée sont perdues. En principe elles proviennent d'un "fixature" donc pas de problème. Si tu as bien pris tes précautions il n'y a aucun inconvénient à régénérer. Pense à faire un cc après. Je régénère très souvent dans mes projets.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
|
00
|
|
|
#6 | |||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Citation:
Citation:
selon mon schema, j'obtiens une table "LivraisonPackageArticle" où chaque ligne se présente comme ça: packageId, articleId, nbr_pieces, quantite_par_piece, unite sachant que j'obtiens plusieurs lignes pour un même packageId, puisqu'il contient différentes quantités de 1,n articles. on l'a discuté aussi dans : http://www.developpez.net/forums/d10...alculer-somme/ Citation:
tu penses que cette conception n'est pas la bonne? |
|||
|
|
00
|
|
|
#7 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Je ne m'était pas penché sur le schéma dans l'autre sujet.
Si tu peux avoir deux lignes pour le même pakage et le même article avec une différence sur l'un des : nbr_pieces, quantite_par_piece, unite. Alors oui, tu as un problème dans ton schéma qui interdit explicitement (de par la clef) ce type de chose. De plus, si tu veux, un jour, partir de cette table pour aller vers une autre (une liaison 1-n ou cette table serait 1) alors là, tu auras un problème (ce jours là). Si non, ton schéma est viable.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#8 | |
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Citation:
là ça te paraît correct? |
|
|
|
00
|
|
|
#9 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Si tu as la situation tel que tu le décris et que "jamais il n'y aura la demande d'avoir deux articles différents dans un package parce que c'est sémantiquement impossible", alors oui, c'est correcte.
Mais si j'avais à faire ce type de développement, je mettrais un id indépendant de tous liens pour cette table, les deux champs en relations, un index sur ces deux champs pour m'assurer de leur unicité. Ainsi j'ai le même comportement que toi et, le cas échéant, la possibilité de le changer facilement (suppression de l'index unique sur les deux champs) avec un minimum d’impact sur le reste de l'application. Ça ne veux pas dire que ce que tu fais est faux, juste que mon approche serait différente. J'ai vu tellement de spécifications inamovibles être modifiées une fois les premiers écrans dans les mains des utilisateurs sur des projets mal étudiés que je préfère prévoir que guérir.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#10 | |
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Citation:
doctrine:build --model doctrine:build --sql .. donc c sûr que les classes ne sont pas remplacées avec la regénération? |
|
|
|
00
|
|
|
#11 | |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
La commande que j'utilise est
Code :
symfony doctrine:build --all --no-confirmation --and-load Citation:
Dans tous les cas et si tu as un doute, une copie préalable de sauvegarde est rapide et sur. Et faire régulièrement un freez de son développement évite de mauvaises surprises.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
|
00
|
|
|
#12 | |||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
j'ai essayé d'optimiser le schema.yml en suivant tes conseils que tu m'avais fourni dans une autre discussion:
Citation:
Code :
|
|||
|
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Bon, j'ai pu finalement résoudre ce problème d'erreur SQL et de mise à jour du schema.yml
Maintenant je reteste le prb des champs invalid dans le formulaire, j'ai plus de problèmes pour les champs "ArticleId" et "PackageId", mais ça m'affiche l'erreur : Code :
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens ![]() j'ai l'impression que ça vient de l'Id de cette table qui est en principe caché, mais normalement ça doit s'incrémenter automatiquement. |
|
|
00
|
|
|
#14 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Le fait de me redonner des informations d'optimisation que je donne régulièrement ne peux me permettre de comprendre ce que tu as fais...
Donne moi plutôt ton shema.yml.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#15 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
voici la table concernée dans le schema.yml
Code :
|
||
|
|
00
|
|
|
#16 | |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Dans ce bout de schéma, le type date(25) ne correspond à rien. Le type doit être date.
Je ne peux voir ton problème sur un si petit bout. Donc, sauf si le schema est monstrueux (en taille), pourrais-tu mettre le schema ? Citation:
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
|
00
|
|
|
#17 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
oui mon schéma est énorme, là je te mets la descritpion de toutes les tables concernées:
Code :
et normalement tu m'avais dis précédemment qu'il vaut mieux avoir cet id là, qu'une clé primaire composée de 2 ou 3 clés étrangères puisque symfony gère mal ça. Alors, j'ai juste l'impression que l'erreur Code :
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens Quand je fais "New" dans "ArticleIntegrePackage" représentant une nouvelle livraison d'un package, l'Id (clé primaire) n'est pas visible sur le formulaire. En validant l'erreur apparait, mais l'enregistrement est quand même sauvegardé dans la BD |
||
|
|
00
|
|
|
#18 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Doctrine (et pas symfony) a quelques particularités.
Il gère mal les relations avec des clefs primaires multiples, mal celle à deux clef et pas du tout au delà. Par contre il exige que chaque table dispose d'une clef primaire, en principe de quoi, s'il n'y en a pas de déclarée, il va créer automatiquement un champ id (integer ou bigint) auto incrémenté. A partir de la dernière version de doctrine, il va le créer en bigint. De plus, pour les liaison, vu comment tu les déclares (et tu les déclares bien), il va chercher à lier un champ id avec un champs nomtable_id. D'où l'importance de conserver les conventions de nommage. Il peut arriver que cela ne soit pas possible, on peut alors lui indiquer les champs à lier. Pour ton problème, je soupcones que tu travails en 1.4.8 ou plus (ce qui est bien) et que les clefs primaires auto générée le soient en bigint et pas integer. Ce qui pourrait expliquer impossibilité de créer des liaisons entre un integer et un bigint et pourrait expliquer le message d'erreur. Essaye de remplacer les type: integer dans tes tables par des type: bigint. Si non, il reste la méthode que j'utilise dans les cas désespéré. Je supprime un grand nombre de tables du schéma et génère la base, puis je rajoute par paquet de table jusqu'à trouver le paquet qui va provoquer l'erreur. Puis je test les tables du paquet pour trouver celle qui génère l'erreur, puis les champs et les liaisons... Un peu long, mais efficace quant je ne sais plus où donner de la tête. J'ai parcouru ton schéma, à part le type: date(25) qui me semble toujours aussi faux, je ne vois pas de problèmes particuliers.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
|
|
#19 |
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 311 ![]() |
Merci Michel,
je galère toujours avec cette erreur SQLSTATE[HY093].. je travaille bien avec la version 1.4.8 de symfony. Alors j'ai essayé de remplacer les types integer par BIGINT partout où il y a des clés. j'ai supprimé aussi le date(25)..MAIS j'ai toujours la même erreur ![]() j'ai pas encore essayé ta solution de cas désespéré..peut être que je vais finir par le faire |
|
|
00
|
|
|
#20 |
![]() ![]() Michel RottaResponsable d'exploitation informatique Inscription : septembre 2005 Messages : 4 913 ![]() |
Il ne faut pas supprimer "date(25)" mais le remplacer par "date".
Pour integer et/ou bigint pas d'avis. Pour ton message d'erreur, j'ai une autre piste. Il est possible que tu ai, sur une table, une clef multiple et que tu tentes de mettre cette table en relation avec une autre dans une liaison 1-n. Ce qui n'est pas possible avec doctrine 1.2. Si non, ma solution de test m'a déjà souvent sorti de situation à priori inextricables.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
|
|
00
|
Copyright © 2000-2012 - www.developpez.com