IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

embed forms mode création nouvel item : problem foreign key


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    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 ?

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    Bonjour,
    Merci pour ta réponse, voici mon schéma yml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!!!!

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    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.

  7. #7
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    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

  8. #8
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    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!!

  9. #9
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    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.

  10. #10
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    j'ai trouvé une discussion à toi un peu similaire:
    http://www.developpez.net/forums/d98...partir-module/

    quand tu fais dans le template:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  11. #11
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Points : 73
    Points
    73
    Par défaut
    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!!

Discussions similaires

  1. [AC-2003] [A-03] Comment désactiver le mode création à l'ouverture d'un form?
    Par electrosat03 dans le forum VBA Access
    Réponses: 9
    Dernier message: 05/02/2022, 16h21
  2. PROBLEME FOREIGN KEY
    Par neeoo11 dans le forum Débuter
    Réponses: 1
    Dernier message: 27/12/2011, 10h56
  3. probleme foreign key avec clé composée
    Par jccanut dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2007, 13h05
  4. Probleme de création nouvelle base sous ACCESS 2007
    Par choco95 dans le forum Sécurité
    Réponses: 3
    Dernier message: 10/07/2007, 08h09
  5. [Firebird] Création de clé étrangère - FOREIGN KEY
    Par Vincent BONNAL dans le forum SQL
    Réponses: 3
    Dernier message: 05/08/2005, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo