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 :

ajout et validation d'une extra option a un champ entity d'un formulaire [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 60
    Points
    60
    Par défaut ajout et validation d'une extra option a un champ entity d'un formulaire
    Bonjour
    je suis nouveau sur symfony2 et je veux faire comme suite :
    j'ai une entity reservation qui a un champ chambre qui reference une liste d'objets chambre (relation manyToMany), je veux que l'utilisateur choisi les chambres qu'il veux réserver mais s'il veux il peut choisir l'option "En exclusivité" pour dire tous les chambres.
    j'ai ajouter l'option "En exclusivité" dans le champ de form chambre avec la methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public function finishView(FormView $view, FormInterface $form, array $options) {
            $new_choice = new ChoiceView(array(), 0, "En exclusivité");
            $view->children["chambres"]->vars["choices"][] = $new_choice;
        }
    maintenant tous vas bien sauf que $form->isValid() est toujours false ce qui est logique parceque l'option que j'ai ajouter n'est pas un objet chambre.
    j'ai voulu changer les données post soumises mais je sais pas comment ?
    je voudrai savoir comment faire pour valider ce champ est l'enregistrer dans la base ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    tu devrais plutot ajouter cette option dans la méthode buildForm()de ton formType
    Symfony2 vérifie que le choix soumis fasse bien parti des choix proposés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('chambres', 'choice', [
                                            'choices' => $monTableauDeChoix
             ]);
     
        }

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    oui mais comme ça le form ne respectera pas le shema de la base de données et ne va pas enregistrer l'objet chambre dans sa table !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    t'as pas obligé de lié ton formulaire a un objet de la base de données.
    Tu peux soit passé via un objet php tout simple, soit tu peux mettre l'option mapped a false pour indiquer a Symfony que tu ne veux pas que ce champ soit mappé a l'entité doctrine

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    merci bouceaup pour la reponse.
    j'ai esseyé ton idée mais il y a un problème :
    dans le controlleur $form->getData() me retourne bien un objet reservation sauf que l'attribu chambre de cet objet contien null. là je doit tester sur les données soumis par le form et faire $reservation->setChambre($tableauDeChambres) ou $reservation->setChambre($tableauDeTousLesChambres) selon le choix de l'utilisateur et après persister l'objet
    mais comment acceder au données $_post dans le controller ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    de mémoire (nomduformulaire = getName de ton FormType):
    $request->get("nomduformulaire") ou $request->request->get("nomduformulaire")

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2010
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Bonjour
    j'ai enfin trouvé la solution
    j'ai utilisé un champ de type choice a la place du type entity pour eviter le probleme de validation et ensuite j'ai utilisé un dataTransformer pour convertir les entiers envoyé par l'utilisateur en objets reservation et là je peut tester pour voir si l'utilisateur a choisi "En exclusivité" qui a la valeur "0" ou non :

    extrai de la classe reservationType la methode formBuild :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                ->add(
                    $builder->create("chambres", "choice", array(
                        "choices" => $chambres,
                        "multiple" => TRUE,
                    ))
                    ->addModelTransformer($chambreTransformer)
                )
    le 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
    65
    66
     
    <?php
     
    namespace GreenHouse\HomeBundle\Form;
     
    use Symfony\Component\Form\DataTransformerInterface;
    use Doctrine\Common\Persistence\ObjectManager;
    use Symfony\Component\Form\Exception\TransformationFailedException;
    use GreenHouse\HomeBundle\Entity\chambre;
     
    class chambreTransformer implements DataTransformerInterface {
     
        /**
         * @var ObjectManager
         */
        private $om;
     
        /**
         * 
         * @param ObjectManager $om
         */
        public function __construct(ObjectManager $om) {
            $this->om = $om;
        }
     
        /**
         * 
         * @param int $id
         */
        public function reverseTransform($value) {
            if ($value == NULL) {
                return null;
            }
     
            if (in_array(0, $value)) {
                return $this->om->getRepository("GreenHouseHomeBundle:chambre")->findAll();
            }
     
            $chambres = array();
            foreach ($value as $id) {
                $chambre = $this->om->getRepository("GreenHouseHomeBundle:chambre")->findOneBy(array(
                    "id" => $id
                ));
     
                if ($chambre == NULL) {
                    throw new TransformationFailedException("Chambre avec id = $id introuvale");
                }
                $chambres[] = $chambre;
            }
     
            return $chambres;
        }
     
        /**
         * 
         * @param chambre $chambre
         */
        public function transform($chambre) {
            if ($chambre instanceof chambre) {
                return $chambre->getId();
            }else {
                return $chambre;
            }
        }
     
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/01/2010, 10h51
  2. ajouter une nouvelle option à la commande wget
    Par GoldenEyes dans le forum Linux
    Réponses: 2
    Dernier message: 01/09/2008, 15h40
  3. Réponses: 14
    Dernier message: 28/08/2003, 23h29
  4. [VB6] Ajouter un commentaire à une fonction d'une DLL
    Par Ace303 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/06/2003, 08h14
  5. Réponses: 12
    Dernier message: 26/02/2003, 08h14

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