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 :

Problème au flush() [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut Problème au flush()
    Bonsoir,

    J'ai un problème et après une aprèm de recherche aucun moyen de m'en sortir.

    Je vais essayer d'être clair :

    J'ai un objet "Project", un second Objet "Assumption".

    La relation entre Project et Assumption : 1:M

    Matérialisé avec Doctrine ORM en annotation :
    Dans la classe project, le champ "assumptions" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
     * @ORM\OneToMany(targetEntity="Assumption", mappedBy="project")
     */
     protected $assumptions;
    Et dans la classe Assumption le champ project :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /**
     * @ORM\ManyToOne(targetEntity="Project", inversedBy="assumptions")
     * @ORM\JoinColumn(name="project_id", referencedColumnName="id")
     */
     protected $project;
    Le problème est que quand j'insère ou modifie un projet via flush(), aucun problème, mais quand j'insère un Assumption en lui passant le projet, tous les champs de ma table excepté l'id auto-généré se mettent à blank...

    Si quelqu'un a déjà eut le problème ou voit quelque chose de choquant dans mes relations...

    Merci d'avance de votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,
    je propose mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($tonObjet);exit;
    juste après le flush dans chaque cas , vérifie aussi que cet objet est bien conforme au table (colonne nullable etc ..)

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Pour que vous ayez le plus d'infos en votre possession je partage aussi le code d'update ainsi que le code où j'appelle cet update (et je sens que c'est ici qu'il doit y avoir un problème ...)

    l'Update :
    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
     
    /**
         * Function to update an assumption in DB
         * @param type $form
         * @param type $id
         */
        public function updateProjectAssumption($form, $id)
        {
            // get the Project from DB
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id); 
            // get assumptions linked to this project
            $assumptions = $project->getAssumptions();
            $i=0;
           // In the form label for each assumption is: assumption1, assumption2 ...
            foreach ($assumptions as $assumption) {
                $i++;
                $assumption->setText($form->get('assumption'.$i)->getData());
                $assumption->setProject($project);
            }
            // Save the Assumption with new datas in DB
            $em->flush();
            $this->confirm = true;
        }
    Et le code de mon action dans mon contrôleur :
    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
     
    /**
         * This action will create a form to display config infos for the selected project
         * User will be able to update it
         * @param Request $request
         * @param type $id
         * @return render
         */
        public function viewAction(Request $request, $id)
        {
            // Get the project selected
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id); // get the Project from DB
            // Get forms to display Config
            $formProjectToDisplay = $this->getFormDisplayProject($id);
            $formProjectToDisplay->handleRequest($request);
            $formSelectAnotherProject = $this->getFormSelectProject();
            $formAssumptions = $this->getFormAssumptions($id);
            $formAssumptions->handleRequest($request);
            $route = 'ats_capacity_plan_configurationview';
            $this->project = $rep->find($id);
     
            if ($formSelectAnotherProject->isValid())// User has clicked on submit and a project is selected
            { 
                $projectSelected = $formSelectAnotherProject->get('projects')->getData();
                $projectId = $projectSelected->getId();
                // execute action to display config
                return $this->redirect($this->generateUrl($route, array('id'=>$projectId)));
            }
            elseif($formAssumptions->isValid())// User has clicked on add assumptions and datas are correct
            {
               //$this->createProjectAssumption($formAssumptions, $project); // Persist infos in DB
               $this->updateProjectAssumption($formAssumptions, $this->project);
               return $this->redirect($this->generateUrl($route, array('id'=>$id)));
            }
            elseif($formProjectToDisplay->isValid())// User has clicked on submit and datas are correct
            {
               $this->updateProjectInformation($formProjectToDisplay, $this->project); // Persist infos in DB
               return $this->redirect($this->generateUrl($route, array('id'=>$id)));
            }
     
            $args = array(
                    'formProjectSelected' => $formProjectToDisplay->createView(),
                    'formChangeProject' => $formSelectAnotherProject->createView(),
                    'formAssumptions' => $formAssumptions->createView(),
                    'confirm' => $this->confirm,  
                    );
            return $this->render('ATSCapacityPlanBundle:Configuration:ConfigurationView.html.twig', 
                $args);
        }
    Pour info j'ai rajouté un cascade persist dans mes deux entités, mais ça ne change rien...
    Je n'ai rien vu de choquant dans le var_dump.

    Merci

  4. #4
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Salut Manumic,

    C'est une histoire de Owning/Inverse Side Doctrine.
    Trois phrases à retenir de la documentation à ce sujet pour ton problème.

    ManyToOne is always the owning side of a bidirectional association.
    OneToMany is always the inverse side of a bidirectional association.
    Doctrine will only check the owning side of an association for changes.
    Concrètement, c'est normal. Deux possibilités, soit tu persistes manuellement tes deux entités, soit tu modifies tes setters / adders pour qu'il fasse le set inverse.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Citation Envoyé par Nico_F Voir le message
    Salut Manumic,

    C'est une histoire de Owning/Inverse Side Doctrine.
    Trois phrases à retenir de la documentation à ce sujet pour ton problème.



    Concrètement, c'est normal. Deux possibilités, soit tu persistes manuellement tes deux entités, soit tu modifies tes setters / adders pour qu'il fasse le set inverse.

    Merci Nico_F.

    Mais j'ai beau relire et relire, mon mapping me semble correct et je ne vois pas l'erreur aussi flagrante puisse-t-elle être !

    FYI :

    Un projet peut avoir plusieurs Assumptions
    Une assumption n'est reliée qu'à un projet.

    Donc dans la table Assumption, un champ "project_Id" qui mappe vers Id de la table "Project" dans la classe l'attribut est : "project"
    Dans la table Project, pas de champ et dans la classe un attribut 'Assumptions' (qui liste toutes les assumptions où project_Id = id

    Dans la classe Assumption (qui est donc owner ?) on a setProject() & getProject();
    Dans la classe Project ( inverse side ?) on a get Assumptions;

    A me relire tout semble correct ?

    Mes travaux de ce matin ont révélé d'autres comportements bizarre ...

    Si je modifie un projet, tous les champs de toutes les assumptions liées sont mis à null. Si je modifie les assumptions d'un projet, ce sont au contraire tous les champs du projet qui sont mis à null ...

    Je suis vraiment perdu !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Si jamais ça peut éclairer une quelconque piste :

    J'ai ce message qui s'affiche au dessus des formulaires que je n'ai pas touchés à chaque fois que je j'en valide un:

    This form should not contain extra fields.

    Merci,

  7. #7
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Le mapping me semble correct également, le problème c'est que toutes tes entités ne sont pas forcément persistées, et qu'il y a un coté de la relation qui ne tient pas du tout compte des relations.

    Ce que je disais c'est que soit tu persistes manuellement tes deux objets :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $em->persist($obj1);
    $em->persist($obj2);
    $em->flush();

    soit tu modifies tes setters

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function addObj($obj)
    {
        $this->objs[] = $obj;
        $obj->setCurrentObj($this);
     
        return $this;
    }

    De cette manière tu persisteras des deux cotés, tu n'auras plus qu'un persist à faire et les données partiront avec ton flush.

    Le deuxième problème (form extra fields) n'a rien à voir, tu devrais ouvrir un autre topic.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Ok, donc à présent le problème c'est qu'il me créé un nouvel objet à chaque flush ...

    Je m'explique j'ai déjà un projet de créé, et je veux lui ajouter une assumption:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $newAssumption->setProject($project);
    $em->persist($newAssumption);
    $em->persist($project);
    $em->flush();
    J'ai à présent un nouveau projet de créé en base ... et à chaque fois que j’exécute ce code un nouveau projet est créé ...

  9. #9
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Si ton projet existait déjà, tu ne devrais normalement pas avoir besoin de le persister.

    En gros le persist va uniquement informer doctrine de l'état d'un objet qu'il ne manage pas encore.
    Si ton objet est déjà managé par doctrine, cette commande ne fait rien. Elle doit être utilisée pour un objet qui a été "détaché" ou nouveau (dans les deux cas non-managé).

    Il y a plusieurs raisons pour que ton persist/flush crée un nouvel objet : tu modifies l'id de ton objet, tu l'as précedemment détaché, tu as cloné ton objet etc. bref tu as un objet non managé par doctrine.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Alors voilà, j'ai refait tout le mapping de A à Z ... et par fichier orm.yml à la place de l'annotation (je ne sais pas pourquoi mais je suis tellement désespéré que je tente tout )

    J'ai fais pas mal de tests ... (j'ai passé la journée dessus encore ... ) :

    Quand j'appelle ma fonction qui lie une assumption à mon projet, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // get the Project from DB
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find;
    j'ai mis un var_dump juste après, et en fait il me récupère bien le bon projet, l'Id est correct, mais aucun champs n'est renseigné. Ils ont tous la valeur null ... (en base tout est correctement rempli)
    Je ne vois pas pourquoi il ne rempli pas correctement les champs de mon objet !?

    Dis moi si tu veux voir telle ou telle partie de mon code.

    Merci d'avance de ton aide !!

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Bon...

    Parceque je m'arrache les cheveux et que je tourne en rond et que je ne comprends pas du tout le comportement ... :

    Voici le code de l'action executée dans mon controlleur :

    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
    61
    62
     
    public function viewAction($id)
        {
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id);
            // Get forms to display Config
            $formProjectToDisplay = $this->getFormDisplayProject($id);
            //$formProjectToDisplay->handleRequest($request);
            $formSelectAnotherProject = $this->getFormSelectProject();
     
            $formAssumptions = $this->getFormAssumptions($id);
            //$formAssumptions->handleRequest($request);
            $formServices = $this->getFormServices($id);
            //$formServices->handleRequest($request);
            $route = 'ats_capacity_plan_configurationview';
            if($formSelectAnotherProject->isValid()){
                if ($formSelectAnotherProject->getClickedButton()->getName() == 'display')// User has clicked on submit and a project is selected
                { 
                    $projectSelected = $formSelectAnotherProject->get('projects')->getData();
                    $projectId = $projectSelected->getId();
                    // execute action to display config
                    return $this->redirect($this->generateUrl($route, array('id'=>$projectId)));
                }
            }        
            if($formAssumptions->isValid())// User has clicked on add assumptions and datas are correct
            {
                if ($formAssumptions->getClickedButton()->getName() == 'add') {
                    var_dump($project->getId()." ".$project->getName());exit;
                    $this->createProjectAssumption($formAssumptions, $project);
                    return $this->redirect($this->generateUrl($route, array('id'=>$id)));
                }
            }        
            if($formProjectToDisplay->isValid())// User has clicked on submit and datas are correct
            {
                if ($formProjectToDisplay->getClickedButton()->getName() == 'validate') {
     
                    var_dump($project->getId()." ".$project->getName());exit;
                    $this->updateProjectInformation($formProjectToDisplay, $project); // Persist infos in DB
                    return $this->redirect($this->generateUrl($route, array('id'=>$id))); 
                }
            }
            if($formServices->isValid())// User has clicked on submit and datas are correct
            {
                if ($formServices->getClickedButton()->getName() == 'add') {
                    $this->updateProjectInformation($formProjectToDisplay, $id); // Persist infos in DB
                    return $this->redirect($this->generateUrl($route, array('id'=>$id))); 
                }
            }
     
     
            $args = array(
                    'formProjectSelected' => $formProjectToDisplay->createView(),
                    'formChangeProject' => $formSelectAnotherProject->createView(),
                    'formAssumptions' => $formAssumptions->createView(),
                    'formServices' => $formServices->createView(),
                    'confirm' => $this->confirm,  
                    );
     
            return $this->render('ATSCapacityPlanBundle:Configuration:ConfigurationView.html.twig', 
                $args);
        }
    Le truc bizarre, c'est que si je clique sur le bouton de "formProjectToDisplay" les valeurs sont cohérentes. Mais si je clique sur le bouton de "formAssumptions" alors les champs sont vide ... D'ailleurs, plus à Null mais à "" ...

    Please heeeeeeeeeeeeeeeeeelp ^^

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Salut à tous !

    Bon je suis toujours bloqué et ne trouve aucun workaround !

    Je ne comprends pas du tout le comportement de symfony2 ...

    Je me suis dit, "bon ok... je vais utiliser une variable de session, comme ça j'utilise toujours la même variable et non plus des références !" ...

    Dans l'action que j’exécute, je set au tout début la valeur à ma variable de session en allant chercher l'objet dans la BDD (Si on est en GET seulement)

    Ensuite si jamais on est en POST, j'effectue plusieurs différent traitement en fonction du formulaire ayant été activé :

    J'ai 4 formulaires différents : Pour un seul, si je regarde ma variable, elle à bien toutes ses valeurs de saisies ... pour toutes les autres, ses attributs sont null sauf l'Id ...

    Comment est-ce possible que mon objet ai des valeurs différentes sans que je n'y touche !?

    Je vous présente une nouvelle fois mon code, avec les tests que j'effectue, et les résultats que j'ai ...

    Je prie pour que quelqu'un ai un flash et puisse m'expliquer !

    Merci d'avance à tous ceux qui me liront et chercherons à comprendre ! !

    Mon code :
    Code PHP : 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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public function viewAction($id)
        {  
            $session = $this->getRequest()->getSession();
            if (!($this->getRequest()->getMethod() == 'POST')) {
                $em = $this->getDoctrine()->getManager();
                $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
                $session->set('project', $rep->find($id));
                //var_dump($this->getRequest()->getMethod()." - ".$session->get('project')->getName());exit; -->Résultat : "GET - projet 1"
            }        
            // Get forms to display Config
            $formProjectToDisplay = $this->getFormDisplayProject($session->get('project'));
    
            $formSelectAnotherProject = $this->getFormSelectProject();
            
            $formAssumptions = $this->getFormAssumptions($session->get('project'));
    
            $formServices = $this->getFormServices($session->get('project'));
    
    
            $route = 'ats_capacity_plan_configurationview';
            if($formSelectAnotherProject->isValid()){
                var_dump($this->getRequest()->getMethod()." - ".$session->get('project')->getName());exit; --> Ici résultat : "GET - "
                if ($formSelectAnotherProject->getClickedButton()->getName() == 'display')// User has clicked on submit and a project is selected
                {
                    $projectSelected = $formSelectAnotherProject->get('projects')->getData();
                    $projectId = $projectSelected->getId();
                    // execute action to display config
                            //var_dump($session->get('project')->getId()." ".$session->get('project')->getName());exit;
                    return $this->redirect($this->generateUrl($route, array('id'=>$projectId)));
                }
            }        
            if($formAssumptions->isValid())// User has clicked on add assumptions and datas are correct
            {
                var_dump($this->getRequest()->getMethod()." - ".$session->get('project')->getName());exit; --> Ici résultat : "GET - "
                if ($formAssumptions->getClickedButton()->getName() == 'add') {
                            
                    $this->createProjectAssumption($formAssumptions, $session->get('project'));
                    return $this->redirect($this->generateUrl($route, array('id'=>$id)));
                }
            }        
            if($formProjectToDisplay->isValid())// User has clicked on submit and datas are correct
            {
                var_dump($this->getRequest()->getMethod()." - ".$session->get('project')->getName());exit; --> Ici résultat : "GET - projet 1"
                if ($formProjectToDisplay->getClickedButton()->getName() == 'validate') {
                    $this->updateProjectInformation($formProjectToDisplay, $session->get('project')); // Persist infos in DB
                    return $this->redirect($this->generateUrl($route, array('id'=>$id))); 
                }
            }
            if($formServices->isValid())// User has clicked on submit and datas are correct
            {
                if ($formServices->getClickedButton()->getName() == 'add') {
                    $this->updateProjectInformation($formProjectToDisplay, $session->get('project')); // Persist infos in DB
                    return $this->redirect($this->generateUrl($route, array('id'=>$id))); 
                }
            }
            
            
            $args = array(
                    'formProjectSelected' => $formProjectToDisplay->createView(),
                    'formChangeProject' => $formSelectAnotherProject->createView(),
                    'formAssumptions' => $formAssumptions->createView(),
                    'formServices' => $formServices->createView(),
                    'confirm' => $this->confirm,  
                    );
            
            return $this->render('ATSCapacityPlanBundle:Configuration:ConfigurationView.html.twig', 
                $args);
        }

  13. #13
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Ok focus sur le problème "je fais un find et on me retourne un objet avec uniquement l'id".

    L'objet retourné est-ce que c'est une instance de ta classe, ou est-ce que c'est un proxy ?

    Par la même occasion poste tes entités (et le mapping).

    D'autre part, montre aussi tes formType afin de voir si le problème ne vient pas de là : est-ce que tu as bien précisé le data_class dans chacun d'eux ?

  14. #14
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Ok, alors avant de te poster toutes les infos demandées, je vais commencer par les formtype car je pense que le problème vient d'eux (mais bon j'ai pensé à beaucoup de source sans pour le moment l'avoir réellement trouvée ^^) :

    Donc premièrement, je n'ai précisé le data_class que pour une des formes (celle qui marche ...) mais j'ai voulu le faire et je ne vois pas comment m'en sortir en fait ...

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    /**
         * Build a form to select a project from those in DB
         * @return form
         */
        protected function getFormSelectProject()
        {
            //Get All projects 
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $projects = $rep->findAll();
            // Get form to display Config
            $builder = $this->createFormBuilder();
            $builder->add('projects', 'entity', array(
                            'label' => 'Select a project ',
                            'class' => 'ATSCapacityPlanBundle:Project',
                            'property' => 'name',
                            'choices' => $projects,
                            'attr' => array('class'=>'btn')));
            $submitOptions = array('label' => 'Display', 'attr'=>array('class'=>'btn'));
            $builder->add('display', 'submit', $submitOptions);
            $submitOptions2 = array('label' => 'Create New Project', 'attr'=>array('class'=>'btn'));
            $builder->add('create', 'submit', $submitOptions2);
            $submitOptions3 = array('label' => 'Delete Selected Project', 'attr'=>array('class'=>'btn'));
            $builder->add('delete', 'submit', $submitOptions3);
            $form = $builder->getForm();
            $form->handleRequest($this->get('request'));
            return $form;
        }
     
        /**
         * Build a form to create a project
         * @return form
         */
        protected function getFormCreateProjectInformation()
        {
            $project = new Project();
            $builder = $this->createFormBuilder($project);
     
            // Add form fields
            $name = array('label' => 'Project', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('name', 'text', $name);
            $engagement = array('label' => 'Engagement', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('engagement', 'text', $engagement);
            $engagementManager = array('label' => 'Engagement Manager', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('engagementManager', 'text', $engagementManager);
            $projectManager = array('label' => 'Project Manager', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('projectManager', 'text', $projectManager);
            $startingWeek = array('label' => 'Starting week', 'constraints' => array(new NotBlank, new Length(array('min' =>1, 'max' => 2))));
            $builder->add('startingWeek', 'text', $startingWeek);
            $version = array('label' => 'Version', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 15))));
            $builder->add('version', 'text', $version);
            $versionDate = array('label' => 'Version Date', 'constraints' => array(new NotBlank));
            $builder->add('versionDate', 'date', $versionDate);
            $weekConfig = array('label' => 'Week config', 'constraints' => array(new NotBlank, new Length(array('min' =>1, 'max' => 2))));
            $builder->add('weekConfig', 'text', $weekConfig);
            $submitOptions = array('label' => 'Add the project', 'attr'=>array('class'=>'btn'));
            $builder->add('validate', 'submit', $submitOptions);
     
            // Get form object
            $form = $builder->getForm();
     
            if (!$this->confirm){
                $form->handleRequest($this->get('request'));
            }
            return $form;
        }
     
        /**
         * Build a form to display the selected project
         * @param type $id
         * @return form
         */
        protected function getFormDisplayProject($project)
        {
            //Get selected projects 
            //$em = $this->getDoctrine()->getManager();
            //$rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            //$projectToDisplay = $rep->find($id);
            $builder = $this->createFormBuilder($project);
            // Add form fields
     
            $name = array('label' => 'Project', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('name', 'text', $name);
            $engagement = array('label' => 'Engagement', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('engagement', 'text', $engagement);
            $engagementManager = array('label' => 'Engagement Manager', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('engagementManager', 'text', $engagementManager);
            $projectManager = array('label' => 'Project Manager', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 100))));
            $builder->add('projectManager', 'text', $projectManager);
            $startingWeek = array('label' => 'Starting week', 'constraints' => array(new NotBlank, new Length(array('min' =>1, 'max' => 2))));
            $builder->add('startingWeek', 'text', $startingWeek);
            $version = array('label' => 'Version', 'constraints' => array(new NotBlank, new Length(array('min' => 5, 'max' => 15))));
            $builder->add('version', 'text', $version);
            $versionDate = array('label' => 'Version Date', 'constraints' => array(new NotBlank));
            $builder->add('versionDate', 'date', $versionDate);
            $weekConfig = array('label' => 'Week config', 'constraints' => array(new NotBlank, new Length(array('min' =>1, 'max' => 2))));
            $builder->add('weekConfig', 'text', $weekConfig);
            $submitOptions = array('label' => 'Update project','attr'=>array('class'=>'btn'));
            $builder->add('validate', 'submit', $submitOptions);
     
            // Get form object
            $form = $builder->getForm(); 
            if (!$this->confirm){
                $form->handleRequest($this->get('request'));
            }
            return $form;
     
    protected function getFormAssumptions($project)
        {
            //Get selected projects 
            //$em = $this->getDoctrine()->getManager();
            //$rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            //$projectToDisplay = $rep->find($id);
            $assumptionsToDisplay = $project->getAssumptions();
            $builder = $this->createFormBuilder();
            // Add form fields
     
            $i = 0;
            foreach ($assumptionsToDisplay as $assump){
                $i++;
                $assumption = array('label'=>'Assumption : '.$i, 'required'=>'false', 'data'=>$assump->getText(), 'constraints' => array(new Length(array('min' => 0, 'max' => 100))));
                $builder->add('assumption'.$i, 'text', $assumption); 
            }    
            $blankAssumption = array('required'=>'false');
            $builder->add('assumption', 'text', $blankAssumption);
            $createAssumption = array('label' => 'Add Assumption','attr'=>array('class'=>'btn'));
            $builder->add('add', 'submit', $createAssumption); 
     
            // Get form object
            $form = $builder->getForm(); 
            if (!$this->confirm){
                $form->handleRequest($this->get('request'));
            }
            return $form;
        }
     
        protected function getFormServices($project)
        {
            //Get selected projects 
            //$em = $this->getDoctrine()->getManager();
            //$rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $project;//$rep->find($id);
            //$ser = new \ATS\CapacityPlanBundle\Entity\Service();
            $builder = $this->createFormBuilder();
     
            // Get All Categories
            $em2 = $this->getDoctrine()->getManager();
            $rep2 = $em2->getRepository('ATSCapacityPlanBundle:Category');
            $categories = $rep2->findAll();
     
            // Get All Priorities
            $em3 = $this->getDoctrine()->getManager();
            $rep3 = $em3->getRepository('ATSCapacityPlanBundle:Priority');
            $priorities = $rep3->findAll();
     
            // Get Project's Services
            $services = $project->getServices();
     
            // Add form fields        
            $i = 0;
            foreach ($services as $serv){
                $i++;
                $service = array('label'=>'Service : '.$i, 'required'=>'false', 'data'=>$serv->getName(), 'constraints' => array(new Length(array('min' => 0, 'max' => 100))));
                $builder->add('service'.$i, 'text', $service); 
                $builder->add('category'.$i, 'entity', array(
                            'class' => 'ATSCapacityPlanBundle:Category',
                            'property' => 'name',
                            'data' => $project->getCategorie(),
                            'choices' => $categories,
                            'attr' => array('class'=>'btn')));
                $builder->add('priority'.$i, 'entity', array(
                            'class' => 'ATSCapacityPlanBundle:Priority',
                            'property' => 'name',
                            'choices' => $priorities,
                            'data' => $project->getPriority(),
                            'attr' => array('class'=>'btn')));
            }    
            $blankServiceName = array('required'=>'false');
            $builder->add('serviceName', 'text', $blankServiceName);
            $builder->add('category', 'entity', array(
                            'class' => 'ATSCapacityPlanBundle:Category',
                            'property' => 'name',
                            'choices' => $categories,
                            'attr' => array('class'=>'btn')));
            $builder->add('priority', 'entity', array(
                            'class' => 'ATSCapacityPlanBundle:Priority',
                            'property' => 'name',
                            'choices' => $priorities,
                            'attr' => array('class'=>'btn')));
            $blankServiceDescription = array('required'=>'false');
            $builder->add('serviceDescription', 'text', $blankServiceDescription);
            $createService = array('label' => 'Add Service','attr'=>array('class'=>'btn'));
            $builder->add('add', 'submit', $createService); 
     
            // Get form object
            $form = $builder->getForm();    
            if (!$this->confirm){
                $form->handleRequest($this->get('request'));
            }
            return $form;
        }
        }

    --> Pour résumer ce que je veux faire, c'est une page qui présente un form détaillant les infos du Project, un form pour ses différentes assumptions ac possibilité d'en rajouter, un autre pour des services avec possibilité d'en rajouter ...etc

  15. #15
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Concernant les autres questions :

    --> L'objet retourné est une instance de la classe Project

    Mes deux entités :

    *Classe Project
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    <?php
     
    namespace ATS\CapacityPlanBundle\Entity;
     
    class Project
    {
       protected $id;
     
       protected $name;
     
       protected $engagement;
     
       protected $engagementManager;
     
       protected $projectManager;
     
       protected $version;
     
       protected $versionDate;
     
       protected $startingWeek;
     
       protected $weekConfig;
     
       // reverse
       protected $assumptions;
       protected $services;
     
     
       public function getId()
        {
            return $this->id;
        }
       public function getName()
        {
            return $this->name;
        }
       public function getEngagement()
        {
            return $this->engagement;
        }
       public function getEngagementManager()
        {
            return $this->engagementManager;
        }
        public function getProjectManager()
        {
            return $this->projectManager;
        }
        public function getStartingWeek()
        {
            return $this->startingWeek;
        }
        public function getVersion()
        {
            return $this->version;
        }
        public function getVersionDate()
        {
            return $this->versionDate;
        }
        public function getWeekConfig()
        {
            return $this->weekConfig;
        }
        public function getAssumptions()
        {
            return $this->assumptions;
        }
        public function getServices()
        {
            return $this->services;
        }
     
       public function setName($name)
       {
            $this->name = $name;
            return $this;
       }
       public function setEngagement($engagement)
       {
            $this->engagement = $engagement;
            return $this;
       }
       public function setEngagementManager($engagementManager)
       {
            $this->engagementManager = $engagementManager;
            return $this;
       }
       public function setProjectManager($projectManager)
       {
            $this->projectManager = $projectManager;
            return $this;
       }
       public function setStartingWeek($startingWeek)
       {
            $this->startingWeek = $startingWeek;
            return $this;
       }
       public function setVersion($version)
       {
            $this->version = $version;
            return $this;
       }
       public function setVersionDate($versionDate)
       {
            $this->versionDate = $versionDate;
            return $this;
       }
       public function setWeekConfig($weekConfig)
       {
            $this->weekConfig = $weekConfig;
            return $this;
       }
     
    }
    *Mapping Project
    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
     
    ATS\CapacityPlanBundle\Entity\Project:
        type: entity
        table: projects
        id:
            id:
                type: integer
                generator: { strategy: AUTO }
        fields:
            name:
                type: string
                length: 255
            engagement:
                type: text
            engagementManager:
                column: engagement_manager
                type: text
            projectManager:
                column: project_manager
                type: text
            version:
                type: text
            versionDate:
                column: version_date
                type: datetime
                nullable: true
            startingWeek:
                column: starting_week
                type: integer
            weekConfig:
                column: week_config
                type: integer
        oneToMany:
            services:
                targetEntity: ATS\CapacityPlanBundle\Entity\Service
                mappedBy: project
            assumptions:
                targetEntity: ATS\CapacityPlanBundle\Entity\Assumption
                mappedBy: project
    *Classe Assumption
    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
     
    <?php
     
    namespace ATS\CapacityPlanBundle\Entity;
     
     
    class Assumption
    {
       protected $id;
       protected $text;
     
       // Owner
       protected $project;    
     
     
       public function getId()
       {
            return $this->id;
       }
       public function getText()
       {
            return $this->text;
       }
        public function getProject()
        {
            return $this->project;
        }
     
        public function setText($text)
        {
             $this->text = $text;
             return $this;
        }
        public function setProject($project)
        {
             return $this->project = $project;
        }
    }
    *Mapping Assumption
    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
     
    ATS\CapacityPlanBundle\Entity\Assumption:
        type: entity
        table: assumptions
        id:
            id:
                type: integer
                generator: { strategy: AUTO }
        fields:
            text:
                type: string
                length: 150
        manyToOne:
            project:
                targetEntity: ATS\CapacityPlanBundle\Entity\Project
                joinColumn:
                    name: project_id
                    referencedColumnName: id
                    onDelete: CASCADE
                inversedBy: assumptions

  16. #16
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Wow mec, faut que tu tries un peu ton code, que tu construises tes formulaires dans des classes FormType prévues à cet effet.

    Là c'est très compliqué de s'y retrouver on mélange tout, y a un entityManager, un repository, la construction d'un form sans FormType et le traitement de la requête dans le form, le tout dans la même fonction.

    Reprend les bases pour construire un formulaire si tu penses que c'est là que ça pèche : perso y a trop de choses et je vais pas te mentir j'ai pas le courage de me lancer dans un code spaghetti comme ça.

    Le data_class correspond à la classe sur laquelle les résultats qui viennent de ce formulaire seront mappés : ce qui permet (quand tu fais ton handleRequest) de récupérer un objet correspondant aux données du formulaire. Si tu n'as pas de data_class le bind ne se fait pas et ton objet ne peut pas être rempli.

  17. #17
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    salut,

    Merci Nico_F de t'être soucié de mon problème !

    A priori ça fonctionne désormais ... Je ne sais pas trop ce que j'ai fait...

    Enfin, j'ai enlevé un accès à ma base de données depuis une fonction getForm() dans ma classe ...

    Tu as raison je ne respecte surement pas les bonnes pratiques symfony ... Je ne suis pas vraiment habitué à ce framework, mais comme j'ai envie de rédiger un code propre je vais faire mon possible !!

    Est-ce que je peux juste en profiter pour te demander des conseils ou ce n'est pas le bon endroit ... ?

    J'aimerais avoir ton avis sur la création des forms :

    Concernant le data_class, la je veux faire un formulaire qui affiche et permette de rajouter des "Assumptions" par exemple. Est ce que mon data_class doit etre assumptions, ou "projet" objet auquel il est lié en M.1 ?

    Je ne voit pas trop comment construire mon formulaire pour qu'il réalise ces actions à partir de ce data_class ! Vu que si mon projet peut contenir 2-5 voire 10 assumptions, comment les afficher ...

    Merci en tout cas du temps que tu as passé à m'aider !

    Emmanuel

  18. #18
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Alors, le but du data_class c'est d'être capable de passer d'un formulaire à un objet sans avoir à faire le binding soit même.

    Concrètement si tu n'as pas de data_class, le résultat de ton formulaire (après la validation quand tu fais un $form->getData()) c'est un tableau avec des clés et des valeurs.
    En déterminant une classe dans ton formulaire, ce même $form->getData() va te retourner une instance de ton data_class avec les informations que tu auras saisi dans ton formulaire (sous réserve que pour chaque champs mappé avec l'objet, la classe possède les getters/setters nécessaire au binding).

    Pour savoir quel formtype et quel data_class mettre, demande toi qu'est-ce que tu vas vouloir traiter/modifier/enregistrer etc.
    Si après validation tu vas devoir persister un objet Projet, alors le plus simple est d'avoir un formulaire ayant pour data_class Projet, de cette manière tu n'auras que deux lignes à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $projet = $form->getData();
    $em->persist($projet);
    Si c'est un objet Assumption que tu vas persister, alors le plus simple est de faire un formulaire dont le data_class sera Assumption ... et tu n'auras qu'à reprendre les deux lignes ci-dessus et remplacer $projet par $assumption.

    Dernier point, tu me parles de collections (one projet => many assumption). La question est :
    Est-ce que tu édites ton objet Project et tous ses objets Assumption dans une seule page en un seul formulaire ? Dans ce cas le data_class devrait être Project.
    Ou est-ce que tu édites chacun des objets Assumption individuellement, auquel cas le projet lié peut-être dans un champs caché du formulaire par exemple, et la ton data_class devrait être Assumption.

  19. #19
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 34
    Par défaut
    Merci d'autant m'éclairer !

    Tout s’éclaircit de plus en plus pour moi !

    J'ai à présent externalisé le formulaire pour les projets et ça fonctionne effectivement très bien (ajout/modification).

    Vu ce que tu me dit, pour les assumptions ce serait plutot un formulaire de type assumption, vu que pour persister je dois faire un assumption->setproject() (il est owner de project M.1).

    Et en fait ma page affiche plusieurs formulaire : un pour les attributs de Projet, et un pour chaque relation de projet (comme assumption).

    Ce qui me chagrine ... : Je peux avoir 5 assumptions, donc je doit en fait afficher 5 formulaires d'assumption ? Avec à chaque fois un submit ?

    Car moi ce que je faisait actuellement c'est que je créait un formulaire sans data-type, et je bouclait sur ma liste d'assumptions de mon projet, et pour chacune d'entre elles je rajoutait un champ texte en incrémentant le nom du champ à l'aide d'un compteur ...

    C'est là qu'en me servant du data_type je ne vois pas comment faire un formulaire qui affiche toutes les assumptions avec une dernière ligne vide pour pouvoir en ajouter une ...

    Merci encore de ton aide Nico !

  20. #20
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Alors dans ce cas voilà une solution possible :

    Un formType dédié à l'objet Assumption dans lequel on aura un champs hidden contenant le project_id. En rajoutant un DataTransformer sur cet élément il pourra automatiquement être transformé en objet.
    Documentation DataTransformer => http://symfony.com/doc/current/cookb...nsformers.html

    Un autre formType dédié à l'objet Project qui lui embarquera une 'collection' de AssumptionType : avec la possibilité d'ajouter/retirer dynamiquement des Assumption avec les options allow_add, allow_remove.
    Documentation CollectionType => http://symfony.com/doc/current/refer...ollection.html

    De cette manière, tu récupèreras le graphe d'objet suivant :
    Une entité Project, qui possède une collection d'Assumptions. Si tu Project cascade-persist Assumption, les nouvelles entités Assumption devrait être persistées aussi et comme dans ton formulaire tu possèdes la relation vers ce même Project (grâce au champs ID), chaque relation sera persistée également.

    À la sortie de ça tu ne devrais avoir qu'à persister le form data, correspondant à un objet Project. Bref, des formType assez costaud, pour une manipulation dans le formHandler on ne peut plus simple

    Tout ça est théorique, il se peut qu'il y ait un ou deux petits ajustements à faire, mais c'est la ligne directrice.

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de flush
    Par Valentin.C dans le forum Doctrine2
    Réponses: 1
    Dernier message: 14/08/2013, 11h28
  2. Problème avec Response.Flush
    Par Loki13 dans le forum ASP
    Réponses: 1
    Dernier message: 12/12/2008, 10h36
  3. Problème fonction FLUSH
    Par chreks dans le forum Fortran
    Réponses: 3
    Dernier message: 12/06/2008, 18h20
  4. [PHP-JS] problème avec le flush
    Par bat dans le forum Langage
    Réponses: 4
    Dernier message: 05/10/2005, 15h03
  5. Flush hosts et détection de problème
    Par psychomatt dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2005, 14h39

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