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 Imbriqué-FK non renseignée [3.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2005
    Messages : 51
    Points : 50
    Points
    50
    Par défaut Formulaire Imbriqué-FK non renseignée
    Hello tous,

    je travaille sur les formulaires imbriqués de symfony mais j'ai vraiment du mal même en suivant pas à pas le "cours sur symfony et les formulaires imbriqués"

    J'ai toujours mon entité Opérations qui peut contenir des Ventilations :

    Operation

    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
     
    /**
     * @var ArrayCollection $ventilations
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Ventilation", mappedBy="operation", cascade={"persist"})
     */
    protected $ventilations;
     
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->ventilations = new \Doctrine\Common\Collections\ArrayCollection();
    }
     
    /**
     * Add ventilation
     *
     * @param \AppBundle\Entity\Ventilation $ventilation
     *
     * @return Operation
     */
    public function addVentilation(\AppBundle\Entity\Ventilation $ventilation)
    {
        $ventilation->setOperation($this);
        this->ventilations[] = $ventilation;
     
        return $this;
    }
     
    /**
     * Remove ventilation
     *
     * @param \AppBundle\Entity\Ventilation $ventilation
     */
    public function removeVentilation(\AppBundle\Entity\Ventilation $ventilation)
    {
        $this->ventilations->removeElement($ventilation);
    }
     
    /**
     * Get ventilations
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getVentilations()
    {
        return $this->ventilations;
    }
    Ventilation

    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
     
    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Operation", inversedBy="ventilations")
     * @ORM\JoinColumn(name="operation_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $operation;
     
    /**
     * Set operation
     *
     * @param \AppBundle\Entity\Operation $operation
     *
     * @return Ventilation
     */
    public function setOperation(\AppBundle\Entity\Operation $operation = null)
    {
        $this->operation = $operation;
     
        return $this;
    }
     
    /**
     * Get operation
     *
     * @return \AppBundle\Entity\Operation
     */
    public function getOperation()
    {
        return $this->operation;
    }
    Les formumaires sont définis comme ceci

    OperationType

    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
     
    <?php
     
    namespace AppBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\CollectionType;
    use AppBundle\Form\VentilationType;
     
    class OperationType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('libelle', TextType::class)
                ->add('date', DateType::class, array(
                    'widget' => 'single_text',
                    'format' => 'dd/MM/yyyy'))
                ->add('estPointe', CheckboxType::class, array(
                    'required' => false,
                ))
                ->add('ventilations', CollectionType::class, array(
                    'entry_type' => VentilationType::class,
                    'allow_add'    => true,
                    'allow_delete' => true
                ))
            ;
        }
     
        /**
        ** {@inheritdoc}
        **/
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefined(array('compte'));
        }
     
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AppBundle\Entity\Operation',
                'compte'       => ''
            ));
        }
        *
        /**
        ** {@inheritdoc}
        **/
        public function getBlockPrefix()
        {
            return 'appbundle_operation';
        }
    }
    VentilationType

    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
     
    <?php
     
    namespace AppBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\NumberType;
     
    class VentilationType extends AbstractType
    {
        /**
        ** {@inheritdoc}
        **/
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('montantDebit', NumberType::class, array(
                    'scale' => 2
                ))
                ->add('montantCredit', NumberType::class, array(
                    'scale' => 2
                ))
            ;
        }
     
        public function configureOptions(OptionsResolver $resolver)
        {
          $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Ventilation'
          ));
        }
     
        /**
        ** {@inheritdoc}
        **/
        public function getBlockPrefix()
        {
            return 'appbundle_ventilation';
        }
    }
    Tout ce passe bien, sauf qu'à l'enregistrement, l'ID Operation n'est pas enregistré en base de données comme clé étrangère dans Ventilation

    Le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    /**
    ** @param Request $request
    ** @param Compte $compte
    ** @return Response|RedirectResponse
    **/
    public function ajoutAction(Request $request, Compte $compte)
    {
        if ($compte->getUser() != $this->getUser()) {
            throw $this->createAccessDeniedException('Accès au compte non autorisé.');
        }
     
        $o = new Operation();
        $o->setCompte($compte);
        $form = $this->createForm(OperationType::class, $o, array('compte' => $compte));
        $form->handleRequest($request);
     
        if ($form->isSubmitted() && $form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($o);
                $em->flush();
                return $this->redirectToRoute('compte_show', array('slug' => $compte->getSlug()));
        }
     
        return $this->render('operation/add.html.twig', array(
            'form' => $form->createView(),
            'operation' => $o,
            'type' => 'add',
        ));
    }
    Une idée ?

    merci,

    PS : La mauvaise idée serait d'ajouter une boucle pour placer "operation" dans les différentes ventilations...

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    Salut
    Essaie de mettre un nullable=false dans l'entity Ventilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @ORM\JoinColumn(name="operation_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)
    Jérôme

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2005
    Messages : 51
    Points : 50
    Points
    50
    Par défaut
    Très bien merci, je vais essayer ça tout à l'heure ou demain.

    Merci pour cette piste !

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2005
    Messages : 51
    Points : 50
    Points
    50
    Par défaut
    Hello,

    Alors le seul effet est que maintenant j'ai une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [3/3] NotNullConstraintViolationException: An exception occurred while executing 'INSERT INTO bp_ventilation (montant_debit, montant_credit, date_crea, date_maj, operation_id, categorie_id) VALUES (?, ?, ?, ?, ?, ?)' with params [99, 0, "2017-01-06 06:09:29", "2017-01-06 06:09:29", null, null]:
     
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'operation_id' cannot be null
    et voici a quoi ressemble la ventilation "hydratée" :

    Nom : 2017-01-06_06h12_13.png
Affichages : 88
Taille : 28,8 Ko

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    Dans la définition du form OperationType, ajoute un by_reference
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ->add('ventilations', CollectionType::class, array(
                    'entry_type' => VentilationType::class,
                    'allow_add'    => true,
                    'allow_delete' => true,
                    'by_reference' => false,
                ))
    https://symfony.com/doc/2.8/referenc...l#by-reference
    Jérôme

  6. #6
    Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mai 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2005
    Messages : 51
    Points : 50
    Points
    50
    Par défaut
    Oulala ... Merci ! Maintenant j'ai bien "la référence" operation dans ventilation !

    Merci jejeman cela fait 2 semaines que je bloquais sur ça..

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/10/2006, 16h10
  2. Probleme Formulaire imbriques
    Par gloglo dans le forum Struts 1
    Réponses: 10
    Dernier message: 30/08/2006, 20h30
  3. Réponses: 9
    Dernier message: 28/07/2006, 17h38
  4. Réponses: 12
    Dernier message: 08/02/2006, 11h51
  5. formulaire imbriqué
    Par jani dans le forum Langage
    Réponses: 9
    Dernier message: 18/01/2006, 15h40

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