Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2011, 17h45   #1
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 311
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 311
Points : 33
Points : 33
Par défaut embed forms mode création nouvel item : problem foreign key

Bonjour,

j'ai une question concernant l'utilisation des embed Forms. est-ce qu'on peut l'utiliser uniquement quand on fait l'édition d'un item existant ou bien même à la création d'un nouvel item?

je m'explique:

j'ai une classe Article et une classe fabriquant reliés par une relation 1-n ArticleFabriquant.
mon but est de pouvoir associer au moment de la création d'un nouvel article, les "n" fabriquants correspondants (des images à cocher).
j'ai utilisé pour ça à partir de "ArticleForm.class.php":

Code :
1
2
3
4
 
//ArticleForm.class.php
....
$this->embedForm('fabriquant', new ArticleFabriquantForm());
le problème c'est que dans le formulaire imbriqué s'affiche la liste des items déjà existants, mais l'item dont la création est en cours n'y figure pas (c normal il n'est pas encore dans la base). et si je fais:

Code :
1
2
3
4
 
//ArticleFabriquantForm.class.php
....
unset($this['article_id']);
j'ai une erreur de violation de la foreign key.

Alors je voudrais savoir si vous avez une solution par rapport à mon problème.

Merci à vous!
flora806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 09h21   #2
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
Si j'ai bien compris, tu as une relation N-N entre Article et Fabriquant.

Dans le cas où tu n'as aucune donnée dans la table association ArticleFabriquant, Symfony gère automatiquement les relations N-N et le formulaires qui va avec.
Si en plus tu ne cherche pas à créer un nouveau fabriquant lors de la création d'un article, alors c'est encore plus simple.

Donc question, peut-tu nous montrer ton schéma et préciser si il y a des données dans la table association et aussi si tu souhaite créer un nouveau fabriquant lors de la création d'un article ?
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 09h53   #3
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 311
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 311
Points : 33
Points : 33
Bonjour,
Merci pour ta réponse, voici mon schéma yml:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
Article:
  connection: doctrine
  tableName: article
  actAs: { Timestampable: ~ }
  columns:
    nom:
      type: string()
      notnull: true
    reference:
      type: string()
      notnull: true
	.....
  relations:
    Fabriquants:
      class: Fabriquant
      refClass: ArticleFabriquant
      local: article_id
      foreign: fabriquant_id
      foreignAlias: Articles  
Fabriquant:
  connection: doctrine
  tableName: fabriquant
  actAs: { Timestampable: ~ }
  columns:
    nom_fabriquant:
      type: string()
      notnull: true
    logo:
      type: blob()
      notnull: true
	.....
ArticleFabriquant:
  connection: doctrine
  tableName: articlefabriquant
  columns:
    article_id:
      type: integer
      notnull: true   
    fabriquant_id: 
      type: integer
      notnull: true     
  relations:	  
    Article:
      onDelete: RESTRICT
      local: article_id
      foreign: id	  
      foreignAlias: ArticleFabriquants
    Fabriquant: 
      onDelete: RESTRICT 
      local: fabriquant_id
      foreign: id	  
      foreignAlias: ArticleFabriquants
dans la table d'association, à part les id (clés étrangères), j'ai pas d'autres données.
le formulaire imbriqué se présente comme ça:
Id article-->liste déroulante des ids
Id fabriquant-->cases à cocher des logos

quand je fais au niveau du formulaire de création d'un article:
Code :
1
2
3
4
 
//ArticleForm.class.php
....
$this->embedForm('fabriquant', new ArticleFabriquantForm());
je dois renseigner en même temps l'article id, alors que si je suis dans le formulaire de création, je ne peux pas encore l'avoir dans la liste déroulante des articlesId, du coup même si je coche une case, ce n'est pas sauvegardé dans la base.

je voudrais donc savoir comment associer un fabriquant à un nouvel article et aussi je serai intéressée par la création d'un nouveau fabriquant en même temps que le nouvel article.
Merci!!!!
flora806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h29   #4
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
Première chose, dans un table association - ArticleFabriquant dans notre cas - les deux clés étrangères doivent former la clé primaire de la table association donc ton schéma doit ressembler à ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Article:
  connection: doctrine
  tableName: article
  actAs: { Timestampable: ~ }
  columns:
    nom:
      type: string()
      notnull: true
    reference:
      type: string()
      notnull: true
	.....
  relations:
    Fabriquants:
      class: Fabriquant
      refClass: ArticleFabriquant
      foreignAlias: Articles  
Fabriquant:
  connection: doctrine
  tableName: fabriquant
  actAs: { Timestampable: ~ }
  columns:
    nom_fabriquant:
      type: string()
      notnull: true
    logo:
      type: blob()
      notnull: true
	.....
ArticleFabriquant:
  connection: doctrine
  tableName: articlefabriquant
  columns:
    article_id:
      type: integer
      notnull: true
      primary: true   
    fabriquant_id: 
      type: integer
      notnull: true
      primary: true
  relations:	  
    Article:
      onDelete: RESTRICT
      local: article_id
      foreign: id	  
      foreignAlias: ArticleFabriquants
    Fabriquant: 
      onDelete: RESTRICT 
      local: fabriquant_id
      foreign: id	  
      foreignAlias: ArticleFabriquants
Tu peux remarquer que j'ai aussi enlever les attributs local et foreign de la relation N-N car ils n'ont pas lieu d'être.

J'ai pas tester mais normalement, si tu refait tes formulaires, tu devrais avoir par défaut une liste de sélections multiples que tu peux transformer en cases à cocher bien sûr.

Pour finir, la création d'un fabriquant dans la création d'un article, il faut passer par le plugin ahDoctrineEasyEmbeddedRelationsPlugin.
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/06/2011, 11h41   #5
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 311
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 311
Points : 33
Points : 33
j'ai pu résoudre le problème que j'ai expliqué grâce à l'exploitation des foreignAlias et à l'ajout d'un Widget approprié pour l'affichage des logos.

Maintenant, je me heurte à un problème similaire..j'ai une autre relation n-n où la table d'association contient cette fois des données en plus:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
Article:
  connection: doctrine
  tableName: article
  actAs: { Timestampable: ~ }
  columns:
    nom:
      type: string()
      notnull: true
	reference:
	  type: string()
      notnull: true
	.....
  relations:
    Fabriquants:
      class: Fabriquant
      refClass: ArticleFabriquant
      local: article_id
      foreign: fabriquant_id
      foreignAlias: Articles
	Fournisseurs:
      class: Fournisseur
      refClass: ArticleFournisseur
      local: article_id
      foreign: fournisseur_id
      foreignAlias: Articles  
Fournisseur:
  connection: doctrine
  tableName: fournisseur
  actAs: { Timestampable: ~ }
  columns:
    nom_fournisseur:
      type: string()
      notnull: true
	adresse:
	  type: string()
	.....	
ArticleFournisseur:
  connection: doctrine
  tableName: articlefournisseur
  columns:
    article_id:
      type: integer
      notnull: true   
    fournisseur_id: 
      type: integer
      notnull: true
    quantite_livree:
	  type: integer
  relations:	  
    Article:
      onDelete: RESTRICT
      local: article_id
      foreign: id	  
      foreignAlias: ArticleFabriquants
    Fournisseur: 
      onDelete: RESTRICT 
      local: fournisseur_id
      foreign: id	  
      foreignAlias: ArticleFournisseurs
comment je peux faire pour renseigner au moment de la création d'un article, le fournisseur (et éventuellement en créer un nouveau) ainsi que la quantite à livrer?
avec le foreign alias, donc mon formulaire d'article, je n'ai qu'une liste déroulante des fournisseurs existants, et non pas de l'attribut quantité.
flora806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h51   #6
Membre habitué
 
Homme Ludovic
Étudiant
Inscription : janvier 2011
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Ludovic
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 124
Points : 140
Points : 140
Attention à la clé primaire de ta table association encore une fois. (Voir mon message précédent).
Problème récurent avec Symfony, il faut tout faire à la main dans ce cas là ou alors réussir à "détourner" l'utilisation du plugin ahDoctrineEasyEmbeddedRelationsPlugin. Personnellement, j'ai toujours pas réussi mais bon je m'y attarde pas vraiment dessus faut dire.
PeytaWodka est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/06/2011, 08h29   #7
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Je plussoies tout ce qui est donnés comme informations par PeytaWodka.

Je rajouterais juste que les embed gèrent mal la prise en compte de la création de nouveaux enregistrements. Le plugin donné permet de simplifier largement la gestion et la génération des templates pour les embed
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 16h07   #8
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 311
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 311
Points : 33
Points : 33
Merci pour votre aide,
j'ai utilisé le plugin ahDoctrineEasyEmbeddedRelationsPlugin et ça fonctionne maintenant

juste une autre petite question, peut-on afficher un formulaire dans un template?

par exp: j'ai une vue (template) qui décrit un article (showSuccess) et j'ai besoin d'afficher à ce niveau un formulaire permettant de rajouter des commentaires sur cet article, des idées?

merci à vous!!
flora806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 16h43   #9
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Quelque part, le template est conçut pour ... afficher des formulaires !

Donc, oui, c'est réalisable.

Il faudra instancier un objet commentaire vierge dans l'action de ton show, en plus de la recherche des données. Et voir qui va traiter le retour.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 17h02   #10
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 311
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 311
Points : 33
Points : 33
j'ai trouvé une discussion à toi un peu similaire:
http://www.developpez.net/forums/d98...partir-module/

quand tu fais dans le template:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
...
<form .... <chemin vers le traitement de l'insertion d'un commentaire> >
  <h2>Insérer votre commentaire<?h2>
  <table>
    <?php echo $formComm ?>
    <tr colspam=2>
      <td><input type="submit" /></td>
    </tr>
  </table>
</form>
le <chemin vers le traitement de l'insertion d'un commentaire>, ça représente quoi, le chemin vers l'action d'ajout d'un commentaire à partir du module commentaire?
flora806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 11h59   #11
Nouveau Membre du Club
 
Inscription : mars 2007
Messages : 311
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 311
Points : 33
Points : 33
salut à tous!
j'ai une autre question par la même occasion..j'arrive pas à trouver des réponses précises sur le net
comment pourrait-on exécuter une action spécifique selon la valeur d'un champ (dans une liste déroulante) lors de l'enregistrement d'un formulaire symfony?

Merci pour votre aide!!
flora806 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h41.


 
 
 
 
Partenaires

Hébergement Web