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 :

Données de formulaires vides


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 Données de formulaires vides
    Bonjour,

    J'ai un souci à la récupération des données de mes formulaires ...

    Voilà, j'ai un premier formulaire qui contient une liste de formulaires.

    Ma page affiche deux formulaires, suivant le formulaire validé, je ne récupère pas les même infos dans mes forms ... Je ne comprends pas vraiment pourquoi ...

    Mes différents codes :

    FormType Projet:
    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
    <?php
    namespace ATS\CapacityPlanBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Validator\Constraints\NotBlank;
    use Symfony\Component\Validator\Constraints\Length;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class ProjectType extends AbstractType
    {
        private $manager;
     
        public function __construct(\Doctrine\ORM\EntityManager $manager)
        {
            $this->manager = $manager;
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $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);
            $builder->add('assumptions', 'collection', array(
            // each item in the array will be an "assumption" field
            'type' => new AssumptionType($this->manager),
            'allow_add'    => true,
            // these options are passed to each "email" type
            'options'  => array(
                'required'  => false,
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Assumption'
                ),
            ));
            $submitOptions = array('label' => 'Update the project', 'attr'=>array('class'=>'btn'));
            $builder->add('validate', 'submit', $submitOptions);
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Project',
            );
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Project',
            ));
        }
     
        public function getName()
        {
            return 'Project';
        }
     
    }
    Formtype Assumptions
    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
    <?php
    namespace ATS\CapacityPlanBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use ATS\CapacityPlanBundle\Form\DataTransformer\ProjectToNumberTransformer;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class AssumptionType extends AbstractType
    {
        private $manager;
     
        public function __construct(\Doctrine\ORM\EntityManager $manager)
        {
            $this->manager = $manager;
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {   
            $blankAssumption = array('required'=>false, 'attr'=>array('rows'=>1, 'cols'=>60));
            $builder->add('text', 'textarea', $blankAssumption);
            $project = array(
                    // validation message if the data transformer fails
                    'invalid_message' => 'That is not a valid project number',
                );
            $builder->add('project', 'hidden', $project);
            $builder->get('project')
                ->addModelTransformer(new ProjectToNumberTransformer($this->manager));
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Assumption',
            );
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Assumption',
            ));
        }
     
        public function getName()
        {
            return 'Assumption';
        }
     
    }
    Dernier FormType Pour créer une 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    namespace ATS\CapacityPlanBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use ATS\CapacityPlanBundle\Form\DataTransformer\ProjectToNumberTransformer;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class NewAssumptionType extends AbstractType
    {
        private $manager;
     
        public function __construct(\Doctrine\ORM\EntityManager $manager)
        {
            $this->manager = $manager;
        }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {   
            $blankAssumption = array('required'=>false, 'attr'=>array('rows'=>1, 'cols'=>60));
            $builder->add('text', 'textarea', $blankAssumption);
            $project = array(
                    // validation message if the data transformer fails
                    'invalid_message' => 'That is not a valid project number',
                );
            $builder->add('project', 'hidden', $project);
            $builder->get('project')
                ->addModelTransformer(new ProjectToNumberTransformer($this->manager));
            $submitOptions = array('label' => 'Update Assumptions', 'attr'=>array('class'=>'btn'));
            $builder->add('validate', 'submit', $submitOptions);
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Assumption',
            );
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'ATS\CapacityPlanBundle\Entity\Assumption',
            ));
        }
     
        public function getName()
        {
            return 'Assumption';
        }
     
    }
    Mon Action dans 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
    public function viewAction(Request $request, $id)
        {  
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id);
            
            // Get forms to display Config
            $formProjectToDisplay = $this->createForm(new ProjectType($em), $project);
            $formSelectAnotherProject = $this->getFormSelectProject();
            $formAddAssumption = $this->createForm(new NewAssumptionType($em));
            //$newAss = $this->createForm(new NewAssumptionType($em), $newAssumption);
            $route = 'ats_capacity_plan_configurationview';
            $formAddAssumption->handleRequest($request);
            $formProjectToDisplay->handleRequest($request);
            $formSelectAnotherProject->handleRequest($request);
            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($formProjectToDisplay->isValid())// User has clicked on submit and datas are correct
            {
                if ($formProjectToDisplay->getClickedButton()->getName() == 'validate'){
                    foreach ($formProjectToDisplay->get('assumptions') as $value) {
                        $value->handleRequest($request);
                        var_dump($value->getData()->getText());
                    }exit;
                    $this->updateProjectInformation($formProjectToDisplay->getData()); // Persist infos in DB
                    return $this->redirect($this->generateUrl($route, array('id'=>$id))); 
                }
            }
            if($formAddAssumption->isValid())// User has clicked on submit and datas are correct
            {
                foreach ($formProjectToDisplay->get('assumptions') as $value) {
                        $value->handleRequest($request);
                        var_dump($value->getData()->getText());
                    }exit;
                if (!is_null($formAddAssumption->getData()->getText()) ) {
                    $formAddAssumption->getData()->setProject($project);
                    $project->getAssumptions()->add($newAssumption);
                }
                $this->updateProjectInformation($project); // Persist infos in DB
                return $this->redirect($this->generateUrl($route, array('id'=>$project->getId())));
            }
            
            
            $args = array(
                    'addNewAssumption' => $formAddAssumption->createView(),
                    'formProjectSelected' => $formProjectToDisplay->createView(),
                    'formChangeProject' => $formSelectAnotherProject->createView(),
                    'confirm' => $this->confirm,  
                    );
            
            return $this->render('ATSCapacityPlanBundle:Configuration:ConfigurationView.html.twig', 
                $args);
        }

    Ici, si j'ai admettons trois assumptions dans mon projet, j'ai donc trois form assumptions, la première à bien sa valeur, mais les deux autres sont à null...

    Ici, toute sles valeurs récupérées sont correctes ...

    Je ne comprends pas ... Merci beaucoup d'avance

  2. #2
    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 j'ai changé un peu mon code de l'action dans le 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
    public function viewAction(Request $request, $id)
        {  
            $em = $this->getDoctrine()->getManager();
            $rep = $em->getRepository('ATSCapacityPlanBundle:Project');
            $project = $rep->find($id);
            $newAssumption = new Assumption();
            $project->getAssumptions()->add($newAssumption);
            $em->persist($newAssumption);
            // Get forms to display Config
            $formProjectToDisplay = $this->createForm(new ProjectType($em), $project);
            $formSelectAnotherProject = $this->getFormSelectProject();
            $route = 'ats_capacity_plan_configurationview';
     
            $formProjectToDisplay->handleRequest($request);
            $formSelectAnotherProject->handleRequest($request);
            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($formProjectToDisplay->isValid())// User has clicked on submit and datas are correct
            {
                if ($formProjectToDisplay->getClickedButton()->getName() == 'validate'){
                    foreach ($formProjectToDisplay->getData()->getAssumptions() as $value) {
     
                        var_dump($value->getText());
                        echo("\n----------------------------------------------------\n");
                    }exit;
                    $this->updateProjectInformation($formProjectToDisplay->getData()); // Persist infos in DB
                    return $this->redirect($this->generateUrl($route, array('id'=>$id))); 
                }
            }
     
     
            $args = array(
                    'formProjectSelected' => $formProjectToDisplay->createView(),
                    'formChangeProject' => $formSelectAnotherProject->createView(),
                    'confirm' => $this->confirm,  
                    );
     
            return $this->render('ATSCapacityPlanBundle:Configuration:ConfigurationView.html.twig', 
                $args);
        }
    Ce qu'il se passe, c'est que du coup actuellement mon projet en base contient deux assumptions.
    Je créé une nouvelle assumption, je la link à mon projet.
    Donc mon formulaire Projet créé trois formulaires Assumptions : deux avec du texte, un avec le texte à null.

    Je rempli le champ de mon formulaire corerspondant à la troisième assumption créée, (par exemple "assumption 3 ").
    Je valide mon form.

    Je récupère bien les valeurs de mon form Project :

    Les valeurs des trois formulaires assumptions sont :
    - 1er OK
    - 2eme Null
    - 3eme Null

    Pourquoi?????

    Merci de votre aide !

  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
    Si ça peut faire avancer le shimilibili-bili-bili-bili-bilick ...

    Si je remplace le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $formProjectToDisplay->handleRequest($request);
                $formSelectAnotherProject->handleRequest($request);
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ($this->getRequest()->getMethod() == 'GET') {
                $formProjectToDisplay->handleRequest($request);
                $formSelectAnotherProject->handleRequest($request);
            }
    Mes données sont bonnes, mais du coup je ne rentre plus dans le isValid() ...

  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
    Je ne sais pas ce que font ces formulaires, mais ça ne te dirait pas de séparer leur traitement dans des contrôleurs distincts ?

    Chaque formulaire enverrais vers un contrôleur spécifique et le contenu de ton objet Request serait toujours le même pour une action donnée, et en plus le code serait un peu plus lisible.

  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
    Et bien en fait je n'ai que deux formulaires sur ma page là :

    Un formulaire Projet (qui contient des formulaires Assumptions)
    Un formulaire "Select" pas encore externalisé qui sert à rediriger vers l'affichage d'un autre projet ...

    Du coup j'arrive à récupérer les bonnes valeurs màj dans mon form ...

    J'ai changé une partie de mon twig :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <table>
                <tr>
                    <td>{{ form_widget(prototype_assumptions) }}{{ form_errors(prototype_assumptions) }}</td>
                </tr>
            {% for form in formProjectSelected.assumptions %}
                <tr>
                    <td>{{ form_widget(form) }}{{ form_errors(form) }}</td>
                </tr>
             {% endfor %}
        </table>
    Sauf que maintenant j'ai avant chaque textarea de mes assumptions un 'Text' qui apparait ... pas très esthétique ...
    De plus si j'ouvre un projet sans assumption, il me met bien le prototype d'ajout, parcontre tout en bas j'ai un 'Assumptions' pareil que les 'Text' qui apparait ... :

    Nom : Text+Assumptions.JPG
Affichages : 115
Taille : 75,2 Ko

    Comment faire disparaitre cela ??

    (En tout cas encore merci Nico de m'aider !)

  6. #6
    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 c'est juste le label que tu veux retirer, tu peux rajouter 'label' => false dans les options de ton form (si ce label ne doit jamais apparaitre).
    Tu peux aussi jouer avec le form rendering si tu ne veux appliquer ça que sur cette action précise => http://symfony.com/doc/current/cookb...omization.html

  7. #7
    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, le fonctionne en effet très bien, et je n'ai plus "text".

    En revanche pour un formulaire Projet, lié à un projet qui ne contient pas encore d'assumptions, j'ai un "Assumptions" écrit en noir qui apparait tout en bas de ma page (comme dans ma capture d'écran précédente) et ça je ne sais pas comment l'enlever ...

    C'est en faisant des erreurs qu'on apprend, donc j'aime autant vous dire que j'apprends énormément en ce moment ...

    J'ai encore un souci de récupération de données d'un formulaire imbriqué à projet ... un seul champs reste à null ... j'ouvre un autre sujet, je vous présente mon code, ou vous avez la flemme d'encore me lire (ce que je peux aisément comprendre !) ?

    Merci,

  8. #8
    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
    Je serais tenté de te dire que pour le label Assumption c'est la même chose que pour texte, regarde si tu peux le désactiver depuis le ProjectType de la même manière là ou tu configures le form assumptions de type collection.

    Si ton autre problème n'a plus rien à voir avec le titre, oui je te suggère d'ouvrir un nouveau topic, et/ou de faire un saut sur le chat à l'occas', au moins tu auras de l'aide en temps réel.

  9. #9
    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 beaucoup Nico tes conseils m'ont permis de pas mal avancer !!!

    Pour info, je récupère désormais bien toutes les valeurs, j'ai juste changé dans mes classes d'entité :

    Before
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function setName($name)
       {
            $this->name  = $name;
            return $this;
       }
    After
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function setName($name)
       {
            return $this->name  = $name;
       }
    Je ne vois pas trop ce que ça change mais c'est bien ça qui m'empêchait de tout récupérer.

    Encore merci et à bientôt ... ;-)

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

Discussions similaires

  1. sous formulaire vide edit=#error
    Par hocine dans le forum IHM
    Réponses: 7
    Dernier message: 17/12/2005, 17h44
  2. Rafraichissement données sous-formulaire
    Par christellel198 dans le forum Access
    Réponses: 1
    Dernier message: 31/10/2005, 19h20
  3. copie de string donne une chaine vide
    Par zmatz dans le forum SL & STL
    Réponses: 5
    Dernier message: 15/10/2005, 15h31
  4. saisie de données dans formulaire
    Par philpaul dans le forum Access
    Réponses: 4
    Dernier message: 15/09/2005, 13h13
  5. Réponses: 4
    Dernier message: 29/11/2004, 16h51

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