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 :

Formulaire à champs liés [2.x]


Sujet :

Symfony PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Formulaire à champs liés
    Bonjour à tous,

    J'ai un soucis sur un de mes formulaires.
    Mon modèle est assez simple, j'ai une entité entreprise avec des salariés, chaque salarié peut avoir un poste et chaque poste correspond à un type de poste.
    Dans mon formulaire, j'aimerais passer l'entité salarié et faire apparaître deux champs, un pour le type de poste et en fonction de celui là, une liste de poste dans un second champ.

    Voici le code de mes entités poste et type de poste :

    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
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
     
    <?php
     
    namespace KG\CompanyManagementBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * poste
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="KG\CompanyManagementBundle\Entity\PosteRepository")
     */
    class Poste
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="nom", type="string", length=255)
         */
        private $nom;
     
        /**
         * @var TypePoste
         *
         * @ORM\ManyToOne(targetEntity="KG\CompanyManagementBundle\Entity\TypePoste")
         * @ORM\JoinColumn(nullable=false)
         * @Assert\Valid()
         * @Assert\NotBlank(message="Veuillez sélectionner le type de poste")
         */
        private $type;
     
        /**
         * @var Entreprise
         *
         * @ORM\ManyToOne(targetEntity="KG\CompanyManagementBundle\Entity\Entreprise", inversedBy="postes")
         * @ORM\JoinColumn(nullable=false)
         */
        private $entreprise;
     
        /**
         * @ORM\OneToOne(targetEntity="KG\CompanyManagementBundle\Entity\Image", cascade={"persist"})
         * @Assert\Valid()
         */
        private $image;
     
         /**
         * @ORM\OneToOne(targetEntity="KG\CompanyManagementBundle\Entity\Salarie", inversedBy="poste")
         * @Assert\Valid()
         */
        private $salarie;
     
        /**
         * @var boolean
         * @ORM\Column(name="supprime", type="boolean")
         */
        private $supprime = false;
     
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set nom
         *
         * @param string $nom
         * @return Poste
         */
        public function setNom($nom)
        {
            $this->nom = $nom;
     
            return $this;
        }
     
        /**
         * Get nom
         *
         * @return string
         */
        public function getNom()
        {
            return $this->nom;
        }
     
        /**
         * Set type
         *
         * @param string $type
         * @return Poste
         */
        public function setType($type)
        {
            $this->type = $type;
     
            return $this;
        }
     
        /**
         * Get type
         *
         * @return string
         */
        public function getType()
        {
            return $this->type;
        }
     
        /**
         * Set image
         *
         * @param Image $image
         * @return Poste
         */
        public function setImage(Image $image)
        {
            $this->image = $image;
     
            return $this;
        }
     
        /**
         * Get image
         *
         * @return Image
         */
        public function getImage()
        {
            return $this->image;
        }    
     
        /**
         * Set Salarie
         *
         * @param \KG\CompanyManagementBundle\Entity\Salarie $salarie
         * @return Poste
         */
        public function setSalarie(\KG\CompanyManagementBundle\Entity\Salarie $salarie = null)
        {
            $this->salarie = $salarie;
     
            return $this;
        }
     
        /**
         * Get Salarie
         *
         * @return \KG\CompanyManagementBundle\Entity\Salarie
         */
        public function getSalarie()
        {
            return $this->salarie;
        }
     
        /**
         * Set entreprise
         *
         * @param \KG\CompanyBundle\Entity\Entreprise $entreprise
         * @return Poste
         */
        public function setExploitation(\KG\CompanyManagementBundle\Entity\Entreprise $entreprise)
        {
            $this->entreprise = $entreprise;
     
            return $this;
        }
     
        /**
         * Get entreprise
         *
         * @return \KG\CompanyManagementBundle\Entity\Entreprise
         */
        public function getEntreprise()
        {
            return $this->entreprise;
        }
     
        /**
         * Set supprime
         *
         * @param string $supprime
         * @return Poste
         */
        public function setSupprime($supprime)
        {
            $this->supprime = $supprime;
     
            return $this;
        }
     
        /**
         * Get supprime
         *
         * @return boolean
         */
        public function getSupprime()
        {
            return $this->supprime;
        }    
    }
    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
    <?php
     
    namespace KG\CompanyManagementBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * TypePoste
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="KG\CompanyManagementBundle\Entity\TypePosteRepository")
     */
    class TypePoste
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="libelle", type="string", length=20)
         */
        private $libelle;
     
     
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set libelle
         *
         * @param string $libelle
         * @return TypePoste
         */
        public function setLibelle($libelle)
        {
            $this->libelle = $libelle;
     
            return $this;
        }
     
        /**
         * Get libelle
         *
         * @return string
         */
        public function getLibelle()
        {
            return $this->libelle;
        }
    }
    Voici mon formulaire :

    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
    <?php
     
    namespace KG\CompanyManagementBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use KG\CompanyManagementBundle\Form\EventListener\AddTypePosteFieldSubscriber;
    use KG\CompanyManagementBundle\Form\EventListener\AddPosteFieldSubscriber;
    class AttribuerType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $propertyPathToPoste = 'poste';
     
            $builder
                ->addEventSubscriber(new AddPosteFieldSubscriber($propertyPathToPoste))
                ->addEventSubscriber(new AddTypePosteFieldSubscriber($propertyPathToPoste));
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {      
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'kg_companymanagementbundle_attribuer';
        }
    }
    Voici la classe AddPosteFieldSubscriber :
    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
     
    <?php
     
    namespace KG\CompanyManagementBundle\Form\EventListener;
     
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\PropertyAccess\PropertyAccess;
    use Doctrine\ORM\EntityRepository;
     
    class AddPosteFieldSubscriber implements EventSubscriberInterface
    {
        private $propertyPathToPoste;
     
        public function __construct($propertyPathToPoste)
        {
            $this->propertyPathToPoste = $propertyPathToPoste;
        }
     
        public static function getSubscribedEvents()
        {
            return array(
                FormEvents::PRE_SET_DATA  => 'preSetData',
                FormEvents::PRE_SUBMIT    => 'preSubmit'
            );
        }
     
        private function addPosteForm($form, $type)
        {
            $formOptions = array(
                'class'         => 'KGCompanyManagementBundle:Poste',
                'empty_value'   => '',
                'attr'          => array(
                    'class' => 'poste_selector',
                ),
                'query_builder' => function (EntityRepository $repository) use ($type) {
                    $qb = $repository->createQueryBuilder('poste')
                        ->innerJoin('poste.type', 'type')
                        ->where('type.id = :type')
                        ->setParameter('type', $type)
                    ;
     
                    return $qb;
                }
            );
     
            $form->add($this->propertyPathToPoste, 'entity', $formOptions);
        }
     
        public function preSetData(FormEvent $event)
        {
            $data = $event->getData();
            $form = $event->getForm();
     
            if (null === $data) {
                return;
            }
     
            $accessor = PropertyAccess::createPropertyAccessor();
     
            $poste = $accessor->getValue($data, $this->propertyPathToPoste);
            $type  = ($poste) ? $poste->getType()->getId() : null;
     
            $this->addPosteForm($form, $type);
        }
     
        public function preSubmit(FormEvent $event)
        {
            $data = $event->getData();
            $form = $event->getForm();
     
            $type = array_key_exists('type', $data) ? $data['type'] : null;
     
            $this->addPosteForm($form, $type);
        }
    }
    Voici la classe AddTypePosteFieldSubscriber :
    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 KG\CompanyManagementBundle\Form\EventListener;
     
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\PropertyAccess\PropertyAccess;
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
     
    class AddTypePosteFieldSubscriber implements EventSubscriberInterface
    {
        private $propertyPathToPoste;
     
        public function __construct($propertyPathToPoste)
        {
            $this->propertyPathToPoste = $propertyPathToPoste;
        }
     
        public static function getSubscribedEvents()
        {
            return array(
                FormEvents::PRE_SET_DATA => 'preSetData',
                FormEvents::PRE_SUBMIT   => 'preSubmit'
            );
        }
     
        private function addTypeForm($form, $type = null)
        {
            $formOptions = array(
                'class'         => 'KGCompanyManagementBundle:TypePoste',
                'property'      => 'libelle',
                'mapped'        => false,
                'empty_value'   => '',
                'attr'          => array(
                    'class' => 'type_selector',
                ),
            );
     
            if ($type) {
                $formOptions['data'] = $type;
            }
     
            $form->add('type', 'entity', $formOptions);
        }
     
        public function preSetData(FormEvent $event)
        {
            $data = $event->getData();
            $form = $event->getForm();
     
            if (null === $data) {
                return;
            }
     
            $accessor = PropertyAccess::getPropertyAccessor();
     
            $poste    = $accessor->getValue($data, $this->propertyPathToPoste);
            $type = ($poste) ? $poste->getType() : null;
     
            $this->addTypeForm($form, $type);
        }
     
        public function preSubmit(FormEvent $event)
        {
            $form = $event->getForm();
     
            $this->addTypeForm($form);
        }
    }
    J'appelle mon formulaire depuis mon contrôleur avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(new AttribuerType($salarie));
    Voici mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Neither the property "type" nor one of the methods "getType()", "type()", "isType()", "hasType()", "__get()" exist and have public access in class "KG\CompanyManagementBundle\Entity\Salarie".
    Voilà plusieurs jours que je bloque sur ce pb, j'attends beaucoup de vous

    Merci d'avance pour vos réponses.

  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
    Hello, tu ne nous montres pas les bons fichiers (et par conséquent tu ne dois pas chercher au bon endroit non plus).

    Le message définit une erreur dans la liaison entre SALARIE et TYPE.
    Pas entre POSTE et TYPE.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    Effectivement, le message montre une erreur entre salarie et type car je passe salarie en paramètre de la création de mon formulaire.
    D'ailleurs, je n'ai plus cette erreur lorsque je commente la partie du code dans AddTypePosteFieldSubscriber :
    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
            $formOptions = array(
                'class'         => 'KGCompanyManagementBundle:TypePoste',
                'property'      => 'libelle',
                'mapped'        => false,
                'empty_value'   => '',
                'attr'          => array(
                    'class' => 'type_selector',
                ),
            );
     
            if ($type) {
                $formOptions['data'] = $type;
            }
     
            $form->add('type', 'entity', $formOptions);
    Mais du coup ça ne fait pas ce que je veux...

  4. #4
    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
    Je n'arrive pas à trouver ou est-ce que tu manipules un quelconque objet/form $salarie.

    En fait même dans ton deuxième morceau de code je ne vois pas du tout le salarié, je ne vois pas non plus l'injection du salarié ou que ce soit dans les morceaux de code que tu nous montres.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ah bon?

    Pourtant à cet endroid là j'en parle :

    Citation Envoyé par FreeGeek Voir le message
    Bonjour à tous,

    J'appelle mon formulaire depuis mon contrôleur avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(new AttribuerType($salarie));
    Salarie a une relation avec poste.

  6. #6
    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
    Je pose quand même la question même si c'est écrit dans le message d'erreur, est-ce que ta classe Salarie possède une méthode getType() ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Non, j'ai juste un getPoste(), mais le getType() est joignable depuis getPoste du coup...

  8. #8
    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
    Ben cherche pas plus loin, si ton formulaire est mappé sur ton entité, mais que l'entité ne possède pas les accesseurs qu'il faut tu ne pourras pas le faire fonctionner.

    Quand tu fais un $form->add('type', 'entity', $formOptions); le form est celui de ton salarie. S'il ne trouve pas la méthode getType (ou setType) il ne saura pas comment ni à quelle donnée accéder.

    Comme ça de but en blanc je dirais que tu peux soit ajouter le type de poste à un formulaire poste (et non au formulaire salarié), ou bien faire des getters/setters getType() et setType($type) dans l'entité salarie qui eux vont appeler la méthode de l'objet poste avec lequel tu as une relation.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour tes réponses.
    Je suis étonné de ce que tu me dis car j'ai suivi cet exemple et dans l'exemple, location et province ou location et country n'ont pas de lien.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Il me semble aussi que le mapped = false permet de contourner le problème dont tu parles, non?

  11. #11
    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
    Oui oui, en effet ça m'avait échappé : je t'avoue avoir regardé ça en diagonale.

    L'exemple a l'air bien suivi, et je t'avoue que je ne vois pas bien ce qui cloche. Tu as essayé de passer avec Xdebug dessus ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Je n'arrive pas à exploiter Xdebug pour ce bug... Les variables me semblent correctes... Après ça plante toujours sur la création du champ type de poste.
    Dernière modification par Invité ; 25/08/2015 à 16h20.

  13. #13
    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
    Poste la stack trace à tout hasard

  14. #14
    Invité
    Invité(e)
    Par défaut
    Voici :

    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
    [1] Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException: Neither the property "type" nor one of the methods "getType()", "type()", "isType()", "hasType()", "__get()" exist and have public access in class "KG\CompanyManagementBundle\Entity\Salarie".
        at n/a
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php line 339
     
        at Symfony\Component\PropertyAccess\PropertyAccessor->readProperty(object(Salarie), 'type')
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php line 225
     
        at Symfony\Component\PropertyAccess\PropertyAccessor->readPropertiesUntil(object(Salarie), object(PropertyPath), '1', true)
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php line 58
     
        at Symfony\Component\PropertyAccess\PropertyAccessor->getValue(object(Salarie), object(PropertyPath))
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper.php line 57
     
        at Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper->mapDataToForms(object(Salarie), object(RecursiveIteratorIterator))
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php line 396
     
        at Symfony\Component\Form\Form->setData(object(Salarie))
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php line 488
     
        at Symfony\Component\Form\Form->initialize()
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php line 226
     
        at Symfony\Component\Form\FormBuilder->getForm()
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Component\Form\FormFactory.php line 39
     
        at Symfony\Component\Form\FormFactory->create(object(AttribuerType), object(Salarie), array())
            in C:\wamp\www\companymanager\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php line 250
     
        at Symfony\Bundle\FrameworkBundle\Controller\Controller->createForm(object(AttribuerType), object(Salarie))
            in C:\wamp\www\companymanager\src\KG\CompanyManagementBundle\Controller\SalarieController.php line 280
     
        at KG\CompanyManagementBundle\Controller\SalarieController->attribuerAction(object(Salarie), object(Request))
            in  line 
     
        at call_user_func_array(array(object(SalarieController), 'attribuerAction'), array(object(Salarie), object(Request)))
            in C:\wamp\www\companymanager\app\bootstrap.php.cache line 3094
     
        at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1')
            in C:\wamp\www\companymanager\app\bootstrap.php.cache line 3056
     
        at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true)
            in C:\wamp\www\companymanager\app\bootstrap.php.cache line 3207
     
        at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true)
            in C:\wamp\www\companymanager\app\bootstrap.php.cache line 2429
     
        at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
            in C:\wamp\www\companymanager\web\app_dev.php line 28

  15. #15
    Invité
    Invité(e)
    Par défaut
    Si tu avais à faire la même chose que moi, comment tu t'y prendrais?
    En essayant une autre méthode, je peux peut être réussir...

  16. #16
    Invité
    Invité(e)
    Par défaut
    J'ai fini par trouver... c'était bien tout bête : il fallait mettre 'mapped' => false et pas 'false'...

  17. #17
    Invité
    Invité(e)
    Par défaut
    J'ai cependant un nouveau problème. Les données dans le champ type de poste sont correctes, par contre, je n'ai rien dans le champ poste. Même si je mets une valeur dans type de poste, rien ne se met à jour.

    Voici mon code AJAX, j'imagine que c'est lui qui doit buguer... qu'en pensez vous ?

    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
    $("#kg_companymanagementbundle_attribuer_type").change(function(){
        var data = {
            type: $(this).val()
        };
     
        $.ajax({
            type: 'post',
            url: '{{ path("select_postes") }}',
            data: data,
            success: function(data) {
                var $poste_selector = $('#kg_companymanagementbundle_attribuer_poste');
     
                $poste_selector.html('<option>Poste</option>');
     
                for (var i=0, total = data.length; i < total; i++) {
                    $poste_selector.append('<option value="' + data[i].id + '">' + data[i].libelle + '</option>');
                }
            }
        });
    });
    J'ai bien ajouté son appel dans ma vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {% block javascripts %}
        {{ parent() }}
        {% javascripts '@KGCompanyManagementBundle/Resources/public/js/salarie/attribuer.js'%}
            <script src="{{ asset_url }}" type="text/javascript"></script>  
        {% endjavascripts %}    
    {% endblock %}
    Et 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
        /**
         * @Route("/postes", name="select_postes")
         */
        public function postesAction(Request $request)
        {
            $type_id = $request->request->get('type_id');
     
            $em     = $this->getDoctrine()->getManager();
            $postes = $em->getRepository('KGCompanyManagementBundle:Poste')->findByTypeId($type_id);
     
            return new JsonResponse($postes);
        }
    En débug j'ai l'erreur javascript suivante :

    http://localhost/companymanager/web/...s%22)%20%7D%7D Failed to load resource: the server responded with a status of 404 (Not Found)

    Il faut que je déclare une route dans le routing.yml?

    Merci à vous.
    Dernière modification par Invité ; 26/08/2015 à 13h35.

  18. #18
    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
    Oui, il faut que la route 'select_postes' existe et qu'il y ait une action derrière qui te retourne le tableau que tu utilises comme variable (data).

    Vicieux le mapped => 'false' mais avec xdebug tu aurais peut-être pu (en rentrant dans les entrailles du framework) t'apercevoir que l'option mapped n'était pas prise en compte dans les options.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Je débute, c'est pourquoi je ne sais pas encore super bien me servir de Xdebug.
    Est ce que tu pourrais m'expliquer comment déclarer la route?
    J'ai fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    kg_company_management_select_postes_salarie:
        path:      /entreprise/salarie/select_postes-salarie
        defaults:  { _controller: KGCompanyManagementBundle:Salarie:postes }
    J'ai supprimé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        /**
         * @Route("/postes", name="select_postes")
         */
    et j'ai remplacé dans mon AJAX le select_postes par kg_company_management_select_postes_salarie.
    Malgré ça j'ai toujours le même style d'erreur...
    Dernière modification par Invité ; 26/08/2015 à 14h33.

  20. #20
    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
    Symfony te propose une commande app/console routing:debug : est-ce que tu y retrouves bien ta route avec l'URL que tu veux ?

    Ton action de contrôleur s'appelle bien postesAction() ?

    Est-ce que tu rentres bien dans ton action ?

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

Discussions similaires

  1. [Débutant] Mise à jour d'une table via formulaire avec champs liés
    Par DaCoolG dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 28/01/2015, 14h09
  2. Formulaire avec champs liés à une requête
    Par willytito dans le forum IHM
    Réponses: 1
    Dernier message: 11/06/2007, 14h40
  3. Ouvrir un formulaire presaisie avec les champs liés
    Par FrédéricCM dans le forum Access
    Réponses: 1
    Dernier message: 02/06/2006, 21h14
  4. Champs liés dans un formulaire
    Par tonyC dans le forum ASP
    Réponses: 1
    Dernier message: 20/04/2006, 10h00
  5. Formulaire, champs de type file, value
    Par Space Cowboy dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2005, 08h29

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