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

Doctrine2 PHP Discussion :

Persister une entité et flush "plus tard"


Sujet :

Doctrine2 PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Persister une entité et flush "plus tard"
    Bonjour,

    Je me tourne vers vous car j'ai un soucis que je n'arrive pas à résoudre.
    J'ai une page Annonce où on rempli tous les champs du formulaire de l'annonce qu'on envoi ensuite. A ce moment là, je ne souhaite pas encore "flush" mon entité, en effet il y a d'abord une page de confirmation, qui récapitule les données saisies. Une fois cette page validée, c'est à ce moment là que je souhaite effectuer mon flush.

    J'ai fait la méthode "simple" et ça ne marche pas :

    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
     
            if ($request->get("validate") != null) {
                $em = $this->getDoctrine()->getManager();
                $em->flush();
     
                return $this->redirect($this->generateUrl('index'), 301) ;
            }
     
            $annonce = new Annonce();
     
            $formDepotAnnonce = $this->createFormBuilder($annonce)
                ->add('departement', 'entity', array(
                    'class' => 'TUA\EntitiesBundle\Entity\Departement',
                    'empty_value' => 'Département'))
                ->add('ville', 'text')
                ->add('categorie', 'entity', array(
                    'class' => 'TUA\EntitiesBundle\Entity\Categorie',
                    'empty_value' => 'Catégorie'))
                ->add('titre', 'text')
                ->add('description', 'text')
                ->add('prix', 'text')
                ->add('commission', 'text')
                ->getForm();
     
            $formDepotAnnonce->handleRequest($request);
     
            if ($formDepotAnnonce->isValid()) {
     
                $user = $this->getUser();
                $annonce->setUser($user);
                $em->persist($annonce);
     
                return $this->render('TUAAnnonceBundle:DeposerAnnonce:deposer_annonce2.html.twig', array('annonce' => $annonce));
            }      
     
            return $this->render('TUAAnnonceBundle:DeposerAnnonce:deposer_annonce.html.twig', array('formDepotAnnonce' => $formDepotAnnonce->createView()));
    Avec cette méthode, je n'ai pas d'erreur mais mon annonce n'est pas enregistrée en BDD.

    J'ai essayé de stocker l'objet annonce en session, mais j'ai des erreurs de sérialization que je n'arrive pas à résoudre non plus...

    Ma question est donc, comment est-ce que je peux enregistrer mon entité annonce en BDD uniquement après la validation sur la 2ème page ?

    Je vous remercie.

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Tu ne peux pas persister sur un cycle Request/Response et flusher sur un autre. Le protocole HTTP est stateless.

    Par contre tu peux passer les informations dont tu as besoin en GET ou en POST à la page suivante sans pour autant les enregistrer en base, afin qu'elles soient à nouveau accessibles sur le changement de page et enregistrer ton objet à ce moment là. Pas la peine de t'embêter à faire des sessions.

    ++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse !

    Pour passer l'info, qui serait donc un objet annonce hydraté, je l'envoie à la prochaine page dans un return de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->render('TUAAnnonceBundle:DeposerAnnonce:deposer_annonce2.html.twig', array('annonce' => $annonce));
    Et comment je récupère à nouveau dans mon contrôleur ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    une solution est de renvoyer ton formulaire dans ta seconde template, et de l'afficher dans une div caché,
    ton bouton "valider" doit soumettre de nouveau ce formulaire caché et transmettre également le paramètre "validate" qui force le flush.
    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
     
            $annonce = new Annonce();
     
            $formDepotAnnonce = $this->createFormBuilder($annonce)
                ->add('departement', 'entity', array(
                    'class' => 'TUA\EntitiesBundle\Entity\Departement',
                    'empty_value' => 'Département'))
                ->add('ville', 'text')
                ->add('categorie', 'entity', array(
                    'class' => 'TUA\EntitiesBundle\Entity\Categorie',
                    'empty_value' => 'Catégorie'))
                ->add('titre', 'text')
                ->add('description', 'text')
                ->add('prix', 'text')
                ->add('commission', 'text')
                ->getForm();
     
            $formDepotAnnonce->handleRequest($request);
     
            if ($formDepotAnnonce->isValid()) {
     
                $user = $this->getUser();
                $annonce->setUser($user);
               
                 
                if ($request->get("validate") != null) {               
                   $em = $this->getDoctrine()->getManager();
                   $em->persist($annonce);
                   $em->flush(); 
                   return $this->redirect($this->generateUrl('index'), 301) ;
               }
    
     
                return $this->render('TUAAnnonceBundle:DeposerAnnonce:deposer_annonce2.html.twig', array('annonce' => $annonce, 'formDepotAnnonce' => $formDepotAnnonce->createView()));
            }      
     
            return $this->render('TUAAnnonceBundle:DeposerAnnonce:deposer_annonce.html.twig', array('formDepotAnnonce' => $formDepotAnnonce->createView()));

    Pour la solution de mettre l'entité en session, As tu consulté la doc?
    http://doctrine-orm.readthedocs.org/...n-session.html
    L'erreur vient probablement du fait que tu faisait un persist avant de mettre ton entité en session, il faut le faire aprés avoir l'avoir récupéré de la session.

  5. #5
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Citation Envoyé par solofein Voir le message
    Merci pour ta réponse !

    Pour passer l'info, qui serait donc un objet annonce hydraté, je l'envoie à la prochaine page dans un return de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->render('TUAAnnonceBundle:DeposerAnnonce:deposer_annonce2.html.twig', array('annonce' => $annonce));
    Et comment je récupère à nouveau dans mon contrôleur ?
    Déjà ce que tu fais là, ce n'est pas passer un paramètre à la prochaine page, c'est passé un paramètre à ta template ... tu es toujours sur la même page.
    Ensuite, on ne passe pas un objet par URL : ce n'est pas possible. On peut passer des infos en POST, en GET, ou les stocker en session (dans le cas d'un objet il sera serialisé), à toi de faire ton choix, moi je te suggère le POST qui est le plus propre dans ce cas de figure.

    Ce que tu veux faire se fait en 3 étapes.

    - Ta première action comporte un formulaire que tu remplis
    - Ta deuxième action reçoit les données, instancie un objet qui correspond à ses données (ça c'est facultatif puisque cet objet va être détruit au prochain changement de page) et passe cet objet à ta template. Ta template fait un tableau récapitulatif à partir de ton objet (ou des infos brutes) ainsi qu'un formulaire non éditable comprenant toutes les infos de ton objet.
    - Ta troisième action reçoit les infos du formulaire de l'étape 2, instance l'objet, le persiste et le flush.

    ++

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour vos réponses !

    C'est surtout le formulaire "caché" qu'il me manquait dans la deuxième page finalement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. sauvegarder une adresse et la récupérer plus tard
    Par nbs1522 dans le forum Débuter
    Réponses: 6
    Dernier message: 11/01/2013, 10h37
  2. [2.x] Impossible de Persister une entité
    Par hx.jonathan dans le forum Symfony
    Réponses: 10
    Dernier message: 03/10/2011, 18h37
  3. Réponses: 12
    Dernier message: 27/05/2010, 20h01
  4. enregistrer une figure et l'utiliser plus tard
    Par jeune ingénieure dans le forum Images
    Réponses: 6
    Dernier message: 06/01/2010, 10h58

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