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 :

Un DataTransfomer dans un EventSubscriber ne va pas


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut Un DataTransfomer dans un EventSubscriber ne va pas
    Bonjour,

    Je n'arrive pas à faire fonctionner mon dataTransformer dans mon subscriber

    lorsque je veux affiche mon champ {{form_row(form.tuteur), j'ai comme erreur que la méthode form.tuteur n'existe pas
    pourtant je l'ajoute bien à mon form

    voici mon code

    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
     
     
    <?php
    class EnfantTuteurType extends AbstractType {
     
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options) {
     
            $entityManager = $options['em'];        
     
            $builder->addEventSubscriber(new EnfantTuteurFieldSubscriber($entityManager, $builder));
        }
     
    }
    Mon subscriber

    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
     
    class EnfantTuteurFieldSubscriber implements EventSubscriberInterface {
     
        private $entityManager;
        private $builder;
     
        public function __construct($entityManager, FormBuilderInterface $builder) {
     
            $this->entityManager = $entityManager;
            $this->builder = $builder;
        }
     
        public static function getSubscribedEvents() {
     
            return array(
                FormEvents::PRE_SET_DATA => 'OnPreSetData',
     
            );
        }
     
        /**
         
         *
         * @param \Symfony\Component\Form\FormEvent $event
         */
        public function OnPreSetData(FormEvent $event) {
     
            $enfant_tuteur = $event->getData();
     
            //Symfony\Component\Form\Form
            $form = $event->getForm();
     
            $transformer_enfant = new EnfantToNumberTransformer($this->entityManager);
            $transformer_tuteur = new TuteurToNumberTransformer($this->entityManager);
     
            //new
            if (!$enfant_tuteur || null === $enfant_tuteur->getId()) {
     
                $this->builder->add(
                        $this->builder->create('enfant', 'hidden')
                                ->addModelTransformer($transformer_enfant));
     
               $this->builder->add(
                        $this->builder->create('tuteur', 'hidden')
                                ->addModelTransformer($transformer_tuteur));
     
                $form->add('autocompletion', 'text', array(
                    'mapped' => false,
                    'label' => ' ',
                    'required' => true,
                    'attr' => array(
                        'class' => 'form-control',
                        'placeholder' => 'Nom')));
            }
            //on edit
            else {        
     
                $form->add('relation', null, array('label' => 'Relation (Père, mère, belle-mère...)', 'attr' => array('class' => 'form-control')));
                $form->add('ordre', null, array('attr' => array('class' => 'form-control')));
            }
        }
    }
    Mon data transformer

    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
     
    class TuteurToNumberTransformer implements DataTransformerInterface
    {
        /**
         * @var ObjectManager
         */
        private $om;
     
        /**
         * @param ObjectManager $om
         */
        public function __construct(ObjectManager $om)
        {
            $this->om = $om;
            var_dump(123);
        }
     
        /**
         * Transforms an object (enfant) to a string (number).
         *
         * @param  Menage|null $tuteur
         * @return string
         */
        public function transform($tuteur)
        {
            var_dump($tuteur);
            if (null === $tuteur) {
                return "";
            }        
     
            return $tuteur->getId();
        }
     
        /**
         * Transforms a string (number) to an object (enfant).
         *
         * @param  string $number
         *
         * @return Menage|null
         *
         * @throws TransformationFailedException if object (enfant) is not found.
         */
        public function reverseTransform($number)
        {
            var_dump($number);
            if (!$number) {
                return null;
            }
     
            $tuteur = $this->om
                ->getRepository('EnfanceMercrediBundle:Tuteur')
                ->findOneBy(array('id' => $number))
            ;
     
            if (null === $tuteur) {
                throw new TransformationFailedException(sprintf(
                    'An Tuteur with number "%s" does not exist!',
                    $number
                ));
            }
     
            return $tuteur;
        }
    }
    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    C'est normal qu'il n'y est pas de namespace et d'imports ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    Oui je ne les ai pas mis ici pour alléger le code

    si fe fais un simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php
     
    $form->add("tuteur")
    mon form s'affiche

    c'est au niveau du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
      $this->builder->add(
                        $this->builder->create('tuteur', 'hidden')
                                ->addModelTransformer($transformer_tuteur));
    que ca coince

    comme si il ne s'ajoute pas au form

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    As tu essayé comme ceci:
    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
     
    class EnfantTuteurFieldSubscriber implements EventSubscriberInterface {
     /...
        /** 
         *
         * @param \Symfony\Component\Form\FormEvent $event
         */
        public function OnPreSetData(FormEvent $event) {
     
            $enfant_tuteur = $event->getData();
     
            //Symfony\Component\Form\Form
            $form = $event->getForm();
     
            $transformer_enfant = new EnfantToNumberTransformer($this->entityManager);
            $transformer_tuteur = new TuteurToNumberTransformer($this->entityManager);
     
            //new
            if (!$enfant_tuteur || null === $enfant_tuteur->getId()) {
     
                $fieldEnfant=$this->builder->create('enfant', 'hidden')
                                ->addModelTransformer($transformer_enfant)
                                ->getForm();
                $form->add($fieldEnfant);
    //....
            }
    //...
        }
    }
    Pour ma part dans ce genre de cas, j'utilise ce bundle:
    https://github.com/Gregwar/FormBundle

    mais je ne l''ai jamais utlisé dans un listener ou subscriber.

Discussions similaires

  1. Somme dans un formulaire ne variant pas quand on filtre
    Par Patchimou dans le forum Access
    Réponses: 3
    Dernier message: 31/08/2006, 17h58
  2. Réponses: 11
    Dernier message: 09/04/2006, 15h06
  3. Réponses: 3
    Dernier message: 26/01/2006, 14h11
  4. requête dans acces qui ne marche pas...
    Par sam01 dans le forum Access
    Réponses: 3
    Dernier message: 14/12/2005, 17h48
  5. Réponses: 1
    Dernier message: 08/11/2005, 10h03

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