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 :

Enregistrer une demande dans la bdd via un form (liste déroulantes entité et formulaire imbriqués


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut Enregistrer une demande dans la bdd via un form (liste déroulantes entité et formulaire imbriqués
    Bonjour

    Je suis en train de développer une application pour faire des demandes d'installation de logiciel (spécificité du logiciel, date à laquel le logiciel doit être installé, remarques complémentaires...)

    L'utilisateur peux demander d'installer un logiciel existant ou d'installer un logiciel qui n'a pas encore été installé.

    Concrètement on a une première partie du formulaire qui contient la liste déroulante des logiciels déjà présent dans la base.
    La deuxième partie contient des champs nom, version, os pour entré un nouveau logiciel

    La troisième partie du formulaire est commune au 2 partie précédente et contient la date d'installation, les remarques complémentaires...

    J'arrive à faire une demande d'un nouveau logiciel (2 partie du formulaire). Par contre je bloque lorsqu'il s'agit de faire une demande en utilisant la liste déroulante.

    Voici le code :

    Le formulaire lié à l'entité demande


    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
    <?php
     
    class DemandeType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('reflogiciel', 
                          'entity', 
                          array('class' => 'XXX\YYY\Entity\Logiciel',
                                'property' => 'nom',
                                'expanded' => false,
                                'label' => 'Choisissez un logiciel dans la liste ci-dessous : ',
                                )
                          );
     
            $builder->add('RefLogiciel', new LogicielType);
            $builder->add('remarque', 'textarea', array('label' => 'Toute information pouvant nous être utile'));
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'XXX\YYY\Entity\Demande'
            );
        }
     
     
        public function getName()
        {
            return 'demande';
        }
    }
     
    ?>
    Le logiciel lié à l'entité Logiciel

    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
     
    <?php
     
    class LogicielType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('nom', 'text', array('label' => 'Logiciel'));
            $builder->add('version', 'text');
            $builder->add('os', 'choice', array('choices' => array('Linux' => 'Linux', 'Windows' => 'Windows', 'Mac OS' => 'Mac OS'), 'label' => 'Système d\'exploitation'));
     
            $builder->add('licence', 'choice', array('choices' => array('libre' => 'libre', 'freeware' => 'freeware', 'propriétaire' => 'propriétaire'), 'label' => 'Type de licence'));
            $builder->add('url', 'text', array('label' => 'Adresse web ou trouver le logiciel (s\'il n\'est pas sur le web  mettez \'CD\')'));
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'XXX\YYY\Entity\Logiciel'
            );
        }
     
     
        public function getName()
        {
            return 'logiciel';
        }
    }
     
    ?>
    Et la méthode de création dans mon controller

    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
     
    <?php
     
    public function createDemandeAction()
    {
        $demande = new Demande();
     
        $form = $this->createForm(new DemandeType(), $demande);
     
        $request = $this->get('request');
     
        if ('POST' == $request->getMethod()) {
     
            $form->bindRequest($request);
     
            if ($form->isValid()) {
     
                $em = $this->getDoctrine()->getEntityManager();
     
                //hydrate l'objet demande
                $em->persist($demande);
     
                //hydrate l'objet Logiciel
                $em->persist($demande->getRefLogiciel());
                $em->flush();
            }
        }
     
        return $this->render('XXXYYY:Default:createdemande.html.twig', array('environement' => $this->get('kernel')->getEnvironment(), 'form' => $form->createView()));
    }
     
    ?>
    Ce que je me demande c'est comment hydrater l'objet logiciel à partir de la liste déroulante.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut trace dans le profiler
    Dans l'onglet request du profiler, j'ai cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %array% { reflogiciel: '33', RefLogiciel: { nom: '', version: '', os: Linux, licence: libre, url: '' }, remarque: test, _token: 9dc37216de79cd7c25899413f0cb9aef2eb305b5 }
    Apparement il retrouve bien la reférence à la demande n°33 (refLogiciel est une clé étrangère dans la table demande) mais les autres champs sont vides.

    Est-ce que cela veux dire qu'il faut que je fasse une requête préalable pour récuprérer les valeurs des champs avant de persister les données ?

    Je pensais que ça se faisait automatiquement ?

    Est-ce que j'ai mal fait quelques choses dans mon code précédent ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Bonjour

    J'ai continué à travailler sur ce code et maintenant je bute sur un autre problème.

    J'ai trouvé comment hydrater l'entité Logiciel avant l'enregistrement. Voici le code du Controller : (le reste du code est identique)

    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
    <?php
    public function createDemandeAction()
        {
            $demande = new Demande();
     
            $form = $this->createForm(new DemandeType(), $demande);
     
            $request = $this->get('request');
     
            if (isset($_POST['choixInstallation'])) {
     
                if ($_POST['choixInstallation'] === 'new') {
     
                    if ('POST' == $request->getMethod()) {
                        $form->bindRequest($request);
     
                        if ($form->isValid()) {
     
                            $em = $this->getDoctrine()->getEntityManager();
     
                            $em->persist($demande); //écrit les données de l'entité demande
                            $em->persist($demande->getRefLogiciel()); //écrit les données de l'entité logiciel grâce à la relation entre demande et logiciel avec le champ refLogiciel
                            $em->flush();
                        }
     
                    }
     
                } else if ($_POST['choixInstallation'] === 'exist') {
     
                    $em = $this->container->get('doctrine')->getEntityManager();
     
                    $logiciel = $em->find('XXXYYY:Logiciel', $_POST['demande']['reflogiciel']);
     
                    if ('POST' == $request->getMethod()) {
     
                        $form->bindRequest($request);
     
                        if ($form->isValid()) {
     
                            $em = $this->getDoctrine()->getEntityManager();
     
                            $em->persist($demande); //écrit les données de l'entité demande
                            $em->persist($logiciel); //écrit les données de l'entité logiciel
                            $em->flush();
                        }
                    }
     
     
     
                }
            }
     
            return $this->render('DosicaluPedagicielBundle:Default:createdemande.html.twig', array('environement' => $this->get('kernel')->getEnvironment(), 'form' => $form->createView()));
        }
    ?>

    J'ai fait un test en commentant les champs de la 2ème partie dans le template et dans le form. La demande est bien enreigstrée.

    Si je décommente les champs, la demande n'est pas enregistrée car le formulaire n'est pas valide.

    La question maintenant c'est : comment faire cohabiter les 2 parties du formulaire ensemble ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Après décommentage du code dans le controller, je devrais pouvoir entrer une demande pour un nouveau logiciel OU faire une demande d'un logiciel existant.

    Je peux rentrer une demande pour un nouveau logiciel.

    Par contre quand je choisi un logiciel dans la liste déroulante, j'ai ce message d'erreur :

    A new entity was found through the relationship 'Dosicalu\PedagicielBundle\Entity\Demande#refLogiciel' that was not configured to cascade persist operations for entity: Dosicalu\PedagicielBundle\Entity\Logiciel@000000001e9dd84b000000001cb70081. Explicitly persist the new entity or configure cascading persist operations on the relationship. If you cannot find out which entity causes the problem implement 'Dosicalu\PedagicielBundle\Entity\Logiciel#__toString()' to get a clue.
    Est-ce que quelqu'un sait de quoi il retourne ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Points : 34
    Points
    34
    Par défaut Comment choisir les champs à valider
    Après inversitgation (et commentage intempestif de code ) il s'avère de reflogiciel de la liste déroulante et RefLogiciel qui contient les champs text du formulaire (nom, version, os) font tous les 2 référence à l'entité Logiciel.

    Le problème c'est que quand je choisi un logiciel dans la liste déroulante, les champs text ne sont pas renseignié et l'entité Logiciel n'est pas hydraté.

    Est-ce qu'il existe un moyen de choisir qu'elle groupe de champ on veut valider.

    Par exemple en pseudo-(pseudo) code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    si j'ai coché 'logiciel existant' alors
     
        je persiste mes données avec reflogiciel (la liste déroulante)
     
    sinon si j'ai coché 'nouveau logiciel' alors
     
        je persiste mes données avec RefLogiciel (le groupe de champs text)
     
    finsi

Discussions similaires

  1. [OL-2003] Enregistrer une Macro dans Outlook 2003 (demande de modèle)
    Par BtjpsspgrW dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 24/02/2014, 11h09
  2. Enregistrement d'une dataTable dans ma BDD
    Par pools dans le forum Windows Forms
    Réponses: 0
    Dernier message: 28/05/2009, 21h15
  3. Réponses: 1
    Dernier message: 15/04/2008, 20h23
  4. [Upload] Enregistrer chemin d'une image dans ma BDD
    Par Erwan M. dans le forum Langage
    Réponses: 6
    Dernier message: 02/04/2008, 15h45
  5. Réponses: 8
    Dernier message: 12/07/2006, 10h32

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