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 de sélection d'un objet [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut formulaire de sélection d'un objet
    Bonjour,
    J'ai une vue dans laquelle s'affiche un tableau listant tous les objets (triés) de ma classe adherent.
    Je voudrais égalementy afficher un formulaire de sélection qui proposerait un champ 'choices' contenant la liste des noms concaténés aux prénoms de chaque adhérent, ainsi que deux boutons 'submit': modifier qui redirige vers mon formulaire de modification, et 'supprimer' qui supprime l'objet de la base.

    Alors mon premier problème, c'est que je n'arrive pas à concaténer le nom et le prénom, car il me demande un attribut dans le property.
    Voici on code (au niveau du controller, à cause du problème que je décris ensuite):
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      // crée un formulaire de sélection
            $builder= $this->createFormBuilder();     
            $builder->add('Nom', 'entity', array(
                'class' => 'BAMAdherentBundle:Adherent',
                'property' => 'nom',
                'choices' => $adherents,
                'expanded'=> false,
                'multiple'=>false,)); 
            $form=$builder->getForm();

    Le deuxième problème c'est pour créer la classe form.
    J'ai un problème pour passer mon tableau d'adherents en paramètres et le récupérer dans ma fonction pour l'inclure dans le 'choices'. Il me met l'erreur suivante:
    ContextErrorException: Warning: spl_object_hash() expects parameter 1 to be object, null given in /var/www/BAM/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php line 90
    Voici ma classe:

    Code php : 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
     
    namespace BAM\AdherentBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
     
    class ChoixAdherentType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('Nom', 'entity', array(
                'class' => 'BAMAdherentBundle:Adherent',
                'property' => 'nom',
                'choices' => $options,
                'expanded'=> false,
                'multiple'=>false,));
        }
     
        public function getName()
        {
            return 'bam_adherentbundle_choixadherent';
        }
     
            /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'BAM\AdherentBundle\Entity\Adherent'
            ));
        }
     
    }

    Et mon dernier problème c'est pour récupérer l'action du clic sur un des deux boutons. J'ai regardé sur la doc et il me semble avoir suivi l'exemple, mais apparemment non... Puisqu'il me revoit toujours à la homepage (sur laquelle se trouve le formulaire) que je clique sur n'importe quel bouton.
    Voici mon code:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            // récupération du résultat du formulaire
            $request = $this->get('request');
            if($request->getMethod() == 'POST' && $form->isValid())
            { 
                if($form->get('modifier')->isClicked())
                {
                    return $this->redirect($this->generateUrl('bam_adherent_ajout'));
                }
                return $this->redirect($this->generateUrl('bam_adherent_ajout')); 
            }

    Merci de votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Bon, j'ai résolu le plus simple des problèmes (disons que je savais déjà que cette solution existait mais que j'espérais qu'il y aurait plus simple).
    A savoir que je copie tous les noms et prénoms concaténés dans un tableau pour le passer dans mon choice.
    Par contre les autres problèmes me laissent sans voix!
    Enfin voici ma petite modif:
    Pour la copie dans le tableau puis le passage en formulaire:
    Code php : 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
     
            $i=0;
            foreach($adherents as $adherent)
            {
                $listNoms[$i]=$adherent->getNom().' '.$adherent->getPrenom();
                $i++;
            }
     
            // créé un formulaire de sélection
            $builder= $this->createFormBuilder();     
     
            $builder->add('listeAdherents', 'choice', array(
                'choices' => $listNoms,
                'expanded'=> false,
                'multiple'=>false,));
            $form=$builder->getForm();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Alors pour ce qui est de la validation du formulaire, j'avais oublié un bind($request) ce qui faisait qu'il ne trouvait pas le form valide.
    Ensuite, le isClicked n'existait pas (la doc que j'avais trouvé ne devait pas correspondre à mon cas...). J'ai du vérifier l'existence du bouton tout simplement, comme en php. Il ne reste plus que la génération du formulaire dans une classe. Mais là je pêche vraiment.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     // récupération du résultat du formulaire
            $request = $this->get('request');
            if($request->getMethod() == 'POST' )
            {
                $form->bind($request);
                if($form->isValid())
                {
                    if($request->request->get('modifier'))
                    { 
                        return $this->redirect($this->generateUrl('bam_adherent_ajout'));
                    }            
                }
             }

  4. #4
    Membre confirmé Avatar de Parmifer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Par défaut
    Bonjour.

    Peux-tu me quoter la ligne de code qui soulève l'exception? Merci.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Citation Envoyé par Parmifer Voir le message
    Bonjour.

    Peux-tu me quoter la ligne de code qui soulève l'exception? Merci.
    at FormFactory->create(object(ChoixAdherentType), array('adherents' => array(object(Adherent), object(Adherent), object(Adherent), object(Adherent), object(Adherent), object(Adherent))), array()) in /var/www/BAM/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php line 181

    at Controller->createForm(object(ChoixAdherentType), array('adherents' => array(object(Adherent), object(Adherent), object(Adherent), object(Adherent), object(Adherent), object(Adherent)))) in /var/www/BAM/src/BAM/AdherentBundle/Controller/AdherentController.php line 53
    et la ligne de code dans mon controller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form = $this->createForm(new ChoixAdherentType(), array('adherents'=>$adherents));
    Merci.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Voilà ce que j'obtiens quand je fais un getData() sur mon builder, dans la classe de mon formulaire:

    The form's view data is expected to be an instance of class BAM\AdherentBundle\Entity\Adherent, but is a(n) array. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) array to an instance of BAM\AdherentBundle\Entity\Adherent.
    Il suffirait donc peut-être que j'indique que le data_class est null.
    Il ne me reste plus qu'à trouver dans la doc où passer ce paramètre à null.

    Je regarde....

    édité:
    Voici ma classe du formulaire après passage de l'entité à null. Il me reste donc encore le problème de la concaténation de deux attributs dans le property, que je ne comprends pas:
    Code php : 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
     
    class ChoixAdherentType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $adherents=$builder->getData();
     
            $builder->add('Nom', 'entity', array(
                'class' => 'BAMAdherentBundle:Adherent',
                'property' => 'nom',
                'choices' => $adherents,
                'expanded'=> false,
                'multiple'=>false,));
        }
     
        public function getName()
        {
            return 'bam_adherentbundle_choixadherent';
        }
     
            /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => null
            ));
        }
     
    }

  7. #7
    Membre Expert 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 : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    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
            $i=0;
            foreach($adherents as $adherent)
            {
                $listNoms[$i]=$adherent->getNom().' '.$adherent->getPrenom();
                $i++;
            }
     
            // créé un formulaire de sélection
            $builder= $this->createFormBuilder();     
     
            $builder->add('listeAdherents', 'choice', array(
                'choices' => $listNoms,
                'expanded'=> false,
                'multiple'=>false,));
            $form=$builder->getForm();
    Moi aussi ça me laisse sans voix quand je découvre une chose pareille.
    Cela dit, tout est dans la doc...

    http://symfony.com/fr/doc/current/re....html#property => pour afficher la concaténation nom - prénom dans la liste déroulante d'ENTITÉS
    http://symfony.com/fr/doc/current/bo...sieurs-boutons => pour gérer les différents clics de boutons submit
    http://symfony.com/fr/doc/current/bo...-de-formulaire => pour déclarer ton formulaire dans le contrôleur

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Citation Envoyé par Nico_F Voir le message
    Moi aussi ça me laisse sans voix quand je découvre une chose pareille.
    Cela dit, tout est dans la doc...

    http://symfony.com/fr/doc/current/re....html#property => pour afficher la concaténation nom - prénom dans la liste déroulante d'ENTITÉS
    http://symfony.com/fr/doc/current/bo...sieurs-boutons => pour gérer les différents clics de boutons submit
    http://symfony.com/fr/doc/current/bo...-de-formulaire => pour déclarer ton formulaire dans le contrôleur
    Bonjour,
    Merci de m'avoir répondu, et je comprends que la petite boucle avec concaténation manuelle ainsi que le formulaire dans le controller te désolent.
    Mais justement comme expliqué plus haut à défaut d'avoir trouvé mieux pour le moment. Si je souhaitais vraiment laisser mon code en l'état, je ne serai pas venue poster ici. De plus je fais avec mon peu d' expérience et ce que je comprends des docs.

    Pour ce qui est de la doc, j'ai déjà tout lu ce à quoi tu fais référence (comme je l'ai précisé plus haut).
    Pour ce qui est du double bouton, je "re" précise que c'est parce que j'avais oublié le bind qu'il considérait pas le form valide.
    Donc là c'est ok.

    Pour ce qui est de la concaténation de deux attributs dans le choice, je n'ai toujours pas compris et pourtant c'était déjà sur cette doc que j'étais allée.
    (cf mon premier code qui utilise un choice d'ENTITY avec le "nom" en property).

    En fait, si je passe mon entité sans préciser le properties il m'affiche un attribut au hasard. Si je précise un attribut, je ne peux pas en préciser 2.
    Et je n'ai pas non plus envie de passer l'intégralité des attributs en string.

    Pour ce qui est du formulaire, oui merci, j'en ai déjà créé plusieurs dans mon projet en suivant la doc, et ils fonctionnent tous très bien. Mais celui-là, c'est le premier que je fais qui ne soit pas rattaché à une entité. Du coup je pense que le problème vient de là, mais peut être que je me trompe.

    Les problèmes restent donc entiers puisque je n'ai pas plus que ce que j'avais avant, excepté de la raillerie (moquerie?).

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

Discussions similaires

  1. sélection et suppression objet sur panel
    Par gracerare dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/06/2007, 14h39
  2. sélections automatiques d'objets dans Word
    Par antoine.b dans le forum VBA Word
    Réponses: 6
    Dernier message: 19/06/2007, 15h30
  3. sélection avec l'objet DOM:Range
    Par freekind dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/03/2007, 14h24
  4. Réponses: 3
    Dernier message: 19/03/2006, 20h38
  5. [xsl] formulaire de sélection
    Par MatMeuh dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 13/12/2004, 09h04

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