Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] formtype et injection de variable

Sujet résolu
    27 juillet 2017 à 21:38:46

    Bonjour,

    Je voudrai passer à mon formtype un tableau de variables depuis le controller qui crée le form afin de mettre dans choices les choix à retenir. J'ai trouvé une solution par la session, mais je sens que je loupe quelque chose avec $options, mais quoi?

    Voila le formtype:

    class MessageType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
          $session = new session();        
          $recipients=$session->get('recipients');
                
              $builder
              ->add('Destinataire', ChoiceType::class, array(
                'choices'  => $recipients,
                'multiple'     => false,
                'expanded'=>true,
                'mapped'=>true,
                'label'=> 'Choisissez un destinataire'
                ));
            ->add('sujet',TextType::class)
            ->add('message',TextAreaType::class)
            ->add('file', FileType::class,array('label' => 'form.file', 'translation_domain' => 'FOSMessageBundle','required'=>false))
            ->add('Envoyez',SubmitType::class)
            ;
    }
    
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
          $resolver->setDefaults(array(
            'data_class' => 'CLS\MessageBundle\Entity\Message',
            ));
    
        }
    
        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
          return 'cls_message_form';
        }
    
    
      }

    Et dans mon controleur:

      $this->get('session')->set('recipients',$recipients);
      $form   = $this->get('form.factory')->create(MessageType::class,$message);

    sachant que $message hydrate le formulaire. Tout fonctionne bien y compris le choix prédéfini de mon choix destinataire qui est bien hydraté par le getDestinataire de message.

    Mon problème: comment passer le tableau $recipients directement depuis mon controleur sans utiliser la session?

    Merci de vos conseils




    -
    Edité par CarréDas1 27 juillet 2017 à 21:40:24

    • Partager sur Facebook
    • Partager sur Twitter
      28 juillet 2017 à 7:41:24

      Bonjour,

      Oui il est possible de passer directement des variables du contrôleur au form.

      Beaucoup de post sur le net sur le sujet ;):

      Un exemple : http://www.keganv.com/passing-arguments-controller-file-type-symfony-3/

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        29 juillet 2017 à 9:13:59

        Bonjour Monkey3d,

        J'ai enfin réussi et surtout compris. En fait je mettais ma valeur à la place de $options, alors qu'il faut mettre un tableau de type:

        $options ['mavaleur']=$mavaleur;

        Donc voici sur la base de mon post d'origine la solution.

        Le formType:

        class MessageType extends AbstractType
        {
            /**
             * {@inheritdoc}
             */
            public function buildForm(FormBuilderInterface $builder, array $options)
            {
              $recipients= $options['recipients'];
                  $builder
                  ->add('Destinataire', ChoiceType::class, array(
                    'choices'  => $recipients,
                    'multiple'     => false,
                    'expanded'=>true,
                    'mapped'=>true,
                    'label'=> 'Choisissez un destinataire'
                    ));
         
                ->add('Envoyez',SubmitType::class)
                ;
        
              }
            /**
             * {@inheritdoc}
             */
            public function configureOptions(OptionsResolver $resolver)
            {
              $resolver->setDefaults(array(
                'data_class' => 'CLS\MessageBundle\Entity\Message',
                'recipients'=>null,
                ));
            }
            /**
             * {@inheritdoc}
             */
            public function getBlockPrefix()
            {
              return 'cls_message_form';
            }
          }

        et l'appel dans le controller:

                $form   = $this->get('form.factory')->create(MessageType::class,$message,array('recipients'=>$recipients));

        Plus besoin de passer par la session, c'est comme même plus "propre" :ange:

        Merci monkey3d


        -
        Edité par CarréDas1 29 juillet 2017 à 9:15:08

        • Partager sur Facebook
        • Partager sur Twitter

        [Symfony] formtype et injection de variable

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown