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 :

enregistrement embedForm & foreignKey


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut enregistrement embedForm & foreignKey
    Bonjour,

    J'ai un petit souci avec mon formulaire imbriqué pour enregistrer la clef primaire dans la 2e table.

    Pour créer un petit forum tout simple, j'ai 2 tables : une "message" qui contient une ForeignKey qui relie le message à une table "Subject" qui contient la liste des sujets.

    Quand j'ajoute un message, pas de souci. La clef primaire est bien embarqué dans mon formulaire puique le suject existe déjà. Par contre lors de la création d'un nouveau sujet, j'imbrique le formulaire "message" car il est impossible de créer un nouveau sujet dans un forum sans écrire un message ! Mais le souci, viens du fait que ce formulaire ne connait pas d'avance sa ForeignKey tant que le suject n'est pas enregistré

    Mon schema est :
    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
    Message:
      tableName: forum_message
      actAs:
        timestampable
      columns:
        subject_id:      integer
        author:     string(45)
        message:      string()
        created_at: timestamp
        updated_at: timestamp
      relations:
        subject:
          local:    subject_id
          foreign:  id
          foreignAlias:  messages
    Subject:
      tableName: forum_subject
      actAs:
        timestampable
      columns:
        title:      string(45)
        author:     string(45)
        hit:      integer(4)
        created_at: timestamp
        updated_at: timestamp
        numb_response: integer(4)
        slug_title:      string(255)
        is_activated: { type: boolean, default: 1 }
    Nom : schema.png
Affichages : 83
Taille : 14,9 Ko

    Dans mon action new si l'url est "/forum/new/id/1" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      public function executeNew(sfWebRequest $request)
      {
        if($request->getParameter('id')){
          $this->form = new MessageForm();
        }else{
          $this->form = new SubjectForm();
        }
      }
    dans create j'ai encore un petit bug de redirection, mais ce n'est pas le problème pour le moment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public function executeCreate(sfWebRequest $request)
      {
        if($request->getParameter('id')){
          $this->form = new MessageForm();
        }else{
          $this->form = new SubjectForm();
        }
        $this->processForm($request, $this->form);
        $this->setTemplate('new');
      }
    Mais si l'url est /forum/new/ j'oriente vers le Sujet et dans le fichier /lib/form/doctrine/SubjectForm.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class SubjectForm extends BaseSubjectForm
    {
      public function configure()
      {
        unset($this['subject_id'], $this['author'], $this['hit'],$this['numb_response'], $this['slug_title'],$this['is_activated'], $this['created_at'], $this['updated_at']);
        $message = new Message();
        $message->subject = $this->getObject();
        $form = new MessageForm($message);
        $this->embedForm('Message', $form);
      }
    }
    Alors comment décomposer la méthode "save" dans l'action"processForm" ?
    Car sans symfony est doctrine, je ferais 2 requettes : une pour créer le nouveau Sujet, puis "mysql_insert_id()" pour récupérer l'ID de l'insertion et après je pourrais sauver le message en le reliant avec l'ID de sa ForeigneKey, si je suis bien claire !?

    Dans tous les cas merci d'avance de vos réponses pour enfin arriver à créer ce petit forum, car mes internautes comme moi en avons marre de phpBB

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Il faut que la table et le form sujet soit maître dans lors de la création. Le sujet sera créé en premier et le message suivra...

  3. #3
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut
    Merci Mimi68,

    Je vais refaire des tests, mais je pensais que mon form sujet était maître ou alors je ne te suis pas ?

  4. #4
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Par défaut
    Bonjour,

    Alors je suis content d'être tombé sur ce post, car en effet je m'arrache
    un peu les cheveux sur la double création d'éléments liés.

    Et mimi68 c'est pas la première fois que je te vois aidé des ptits gars qui n'en
    veulent sur les liaisons dans doctrine (je pense que la communauté te remerci )

    Alors explique moi, s'il te plais, comment définit on un élément maitre.
    Dans le schéma ? dans l'appel du bon module ?

    Sinon Jylac as tu réussi tes tests ?

    Merci par avance

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Une heure du mat !!!

    Il y a des fois, où, a ces heures là, je ferais mieux de ne pas répondre...

    Je ne suis pas sur de comprendre ce que j'ai écris

    J'avoue qu'en relisant le message de jylac, je ne comprend plus très bien ce qu'il veut. De plus, une des dernières phrases : "puis "mysql_insert_id()" pour récupérer l'ID de l'insertion" m'inquiète au plus haut point...

    Je propose donc a notre amis jylac, s'il n'a pas résolu son problème de reformuler sa demande et pour pyppos de faire un nouveau sujet avec une question plus précise, parce que là, elle est basée sur un de mes délires et c'est pas top...

    Sur ce, je retourne me coucher (à non, il n'est pas encore minuit).

  6. #6
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Par défaut
    Alors après quelques recherches et un très bon tutoriel :

    Tuto advanced Form fait par Par Ryan Weaver, Fabien Potencier

    Dans un premier temps j'aurai tendance à modifier ton schéma YAML pour utiliser son comportement naturel.

    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
     
    Message:
      tableName: forum_message
      actAs:
        timestampable
      columns:
        subject_id:      integer
        author:     string(45)
        message:      string()
        created_at: timestamp
        updated_at: timestamp
      relations:
        subject:
          alias: Subject //suffira pour faire la relation
          foreignType: one
          foreignAlias: Messages
     
    Subject:
      tableName: forum_subject
      actAs:
        timestampable
      columns:
        title:      string(45)
        author:     string(45)
        hit:      integer(4)
        created_at: timestamp
        updated_at: timestamp
        numb_response: integer(4)
        slug_title:      string(255)
        is_activated: { type: boolean, default: 1 }
    Bon le changement dans les relations de la table "Message" n'est pas bien importante, mais le comportement naturel des langages est si beau

    Ensuite il ne faut pas modifier les actions "executeNew" et "executeCreate" enfin pas pour le problème posé.

    En revanche :

    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
     
    ///lib/form/doctrine/SubjectForm.class.php
    class SubjectForm extends BaseSubjectForm
    {
      public function configure()
      {
      	//ne pas unset subject_id
        unset(/*$this['subject_id'], */$this['author'], $this['hit'],$this['numb_response'], $this['slug_title'],$this['is_activated'], $this['created_at'], $this['updated_at']);
     
        if ($this->isNew())
        {
    	    $message = new Message();
    	    $message->subject = $this->getObject();
    	    $form = new MessageForm($message);
    	    $this->embedForm('Message', $form);
     	}
     	else
     	{
     		//ceci permettra à l'action edit de retrouver les messsages déjà créés
     		$this->embedRelation('Messages');
     	}
    }
    Bon j'avoue je n'ai pas testé l'exemple donné, mais je me suis fait un autre exemple identique.

    En tout cas pour mon projet en cour, je vais me retaper l'écriture du schéma au plus simple, je ne conseil à personne de surcharger les schémas plus que ce qui est présenté dans le tutoriel. (Sauf pour les As de l'indexation, les Néo des schémas relationnels).

    Vula, (trop fier c'est mon deuxieme post )

  7. #7
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Le même schéma vu par moi (qui ne suis pas un as, mais bon, j'en ai fais un paquet pour d'autre ici).

    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
     
     
    Message:
      tableName: forum_message
      actAs:
        timestampable: ~
      columns:
        subject_id:      integer
        author:     string(45)
        message:      string()
      relations:
        Subject:
          foreignAlias: Messages
     
    Subject:
      tableName: forum_subject
      actAs:
        timestampable: ~
      columns:
        title:      string(45)
        author:     string(45)
        hit:      integer(4)
        numb_response: integer(4)
        slug_title:      string(255)
        is_activated: { type: boolean, default: 1 }
    Les colonnes : created_at et updated_at sont créée directement par le "behavior" temestampable. Inutile de surcharger.

    Si le nom de ta relation porte le même nom, pas nécessaire d'utiliser alias (qui doit être un alias de class, utilisé habituellement en doctrine).

    Je suis parti (peut-être à tords) sur l'idée que la liaison entre les tables était de type 1-n et non 1-1, si c'est le deuxième qui est vrai, la liaison est fausse.

    Je ne vois pas trop l'intérêt dans le form subject de virer tous les champs du subject... mais j'ai peut-être raté un virage. Ce sujet ne me porte pas chance...

  8. #8
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Par défaut
    En effet dans mon exemple ta modification du schéma fonctionne de la même façon, et c'est bien une relation 1:n.

    Comme quoi pourquoi compliquer les choses quand elle sont simple.

    En revanche je comprend pourquoi les champs du form Subject sont retiré, en effet par rapport au nom des champs, on comprend que ces champs vont être rempli automatiquement par l'appli, peut-être que pour "author" un input hidden aurait été bien vu.

    Aurait-on l'arrogance de notifier ce post en "résolu et perfectionné " ? Jylac ?

  9. #9
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Je n'ai pas trouvé de bouton "résolue et perfectionné" !

    Et il reste un champ dans message qui me chiffonne, c'est le champ message que, suivant le type de données courte ou pouvant être longue, j'aurais passé en clob.

    Mais on va dire que l'on est presque dans le cosmétique...

    Je te fais confiance pour la notion du formulaire de saisie, il faudrait que je fasse des essais, mais j'ai pas vraiment le temps là.

  10. #10
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 11
    Par défaut
    J'ai bien peur qu'a ce rythme là on est conçu un forum,
    et à la fin on se demandera pourquois

  11. #11
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Un forum avec deux tables, cela sera plutôt un exploit

  12. #12
    Membre éclairé

    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 51
    Par défaut
    Hé oui c'était bien mon objectif : faire un Forum

    Et ce qu'il me manquait dans ma class "MessageForm" qui est inclue dans "SubjectForm" est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if($this->getObject()->getSubjectId()!=''){ // seulement si foreignKey !
    		  $this->widgetSchema['subject_id'] = new sfWidgetFormInputHidden(); 
    		  $this->validatorSchema['subject_id'] = new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('subject'), 'required' => false));
    }
    et si le champs caché "subject_id" n'est pas renseigné, la méthode "processForm" crée une ligne dans la table "subject" et crée une ligne dans la table "Message" avec la foreigneKey automatiquement si j'ai bien compris ce que j'ai fait au mois de juillet

    Si ça peut aider ceux qui m'ont compris ou qui ont résolu leurs problèmes dans le même sens que moi

  13. #13
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    J'espère que tu penseras ton forum comme un plugin, délégant la sécurité à sfGuardUser.

    Ainsi, il sera possible de l'intégrer a des applications existantes.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Par défaut
    Bonjour, je remonte ce sujet car je rencontre exactement le même problème. J'ai regardé la documentation, mais je ne vois pas comment surcharger la méthode doSave() pour qu'elle inscrive une ligne ID dans la table sujet et dans la table message.
    Auriez vous une idée? Merci d'avance

    Problème résolu, pour les personnes qui viendront sur ce post avec le même problème ne vous fiez pas à ce qui est dit plus haut, si vous devez modifiez la méthode save pour un formulaire imbriqué, c'est juste que vous avez mal configuré vos formulaires. Si vous faites les choses proprement, Symfony gérera parfaitement les relations.

    Cordialement

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/02/2010, 13h19
  2. [1.x] Enregistrer les valeurs d'un form dans la table d'un embedform
    Par noreaga10 dans le forum Symfony
    Réponses: 0
    Dernier message: 19/01/2010, 01h19
  3. [VB6] [Crystal] Selection enregistrement
    Par littlecow dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/01/2005, 14h08
  4. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 16h26
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 16h17

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