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 :

Formulaires et liste déroulante [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Formulaires et liste déroulante
    Bonjour,

    je m'interroge sur la meilleure façon de renseigner dynamiquement les valeurs d'une liste déroulante dans un formulaire.

    Je pars donc d'une liste déroulante comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $builder->add('foo_choices', 'choice', array(
        'choices' => array('foo' => 'Foo', 'bar' => 'Bar', 'baz' => 'Baz'),
        'preferred_choices' => array('baz'),
    ));
    et je souhaite que le tableau de choix passé en paramètres soit généré à partir d'une entité.

    La doc symfony2 préconise l'utilisation d'une "ChoiceListInterface" mais je ne vois pas comment l'utiliser.
    Sinon, je peux générer un tableau moi-même à partir de mon entité mais est-ce la bonne méthode?
    Avez-vous déjà fait ça?

    Au plaisir de vous lire...

  2. #2
    Membre actif

    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2009
    Messages : 91
    Points : 223
    Points
    223
    Par défaut
    Salut,

    Avec le EntityType cela ne fonctionne-t-il pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
     
    $builder->add('users','entity',
         array('class' => 'Acme\\HelloBundle\\Entity\\User',
    ));
    http://symfony.com/doc/current/book/...rm-integration

    http://api.symfony.com/2.0/Symfony/B...ntityType.html

    +++

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2011
    Messages : 50
    Points : 35
    Points
    35
    Par défaut
    Pour ma part le EntityType fonctionne, mais je reste bloqué sur un autre problème, je voudrais que cette liste soit renseignée en fonction de ce que je sélectionne dans une autre liste déroulante mais je ne sais pas comment faire avec du javascript dans ce cas.

    Dans mon cas il s'agit d'écrire un article, qui est rattaché à une sous-rubrique.
    Et la sous-rubrique dépend de la rubrique.


    Mais lorsque je créais mon builder pour cette seconde liste déroulante, le champ ne faisant pas parti de mon objet "article", il ne trouve pas de setter et refuse de me l'afficher...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Salut et merci pour vos réponses,

    je n'ai pas réussi avec l'entité, il attend un tableau et j'ai évidemment la réponse suivante:
    Expected argument of type array or \Closure, string given
    J'ai finalement crée une classe statique qui génère un tableau (id => label).

    @massacreur : comment as-tu fait pour utiliser ton entité directement? as-tu créé dans cette entité une méthode getAll() ou quelque chose comme ça?

    A+

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2011
    Messages : 50
    Points : 35
    Points
    35
    Par défaut
    Essaie en renseignant les différentes propriétés du builder en mode EntityType, cela vient sans doute de la.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $builder->add('article','entity', array(
                'class' => 'Application\MonAppliBundle\Entity\Article',
                'property' => 'nomArticle',
                'multiple' => false,
                'required' => false
                ));
    De cette façon tu précises que ta liste déroulante doit afficher dans la liste déroulante le champ "property" c'est à dire le nom de l'article dans mon cas.

    Et non je n'ai pas eu besoin de créer de méthode getAll ou autre...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bon,
    je poste ma solution si ça peut aider quelqu'un :

    D'abord on a le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $choicesArray = ChoiceListGenerator::generateFullItemList($em);
    $form = $this->get('form.factory')
             ->createBuilder('form', $myEntity)
             ->add('Item', 'choice', 
                      array ('label' => "myItem", 
                             'choices' => $choicesArray))
             ->getForm();
    Et la classe qui génère le tableau :
    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
    class ChoiceListGenerator
    {
       /**
        * génère une liste de code et de valeurs pour les listes déroulantes
        * @return array tableau de type array($code => $value) 
        * à utiliser dans un select.
        * @param type $em entityManager
        */
       public static function generateFullItemList($em)
       {
          $itemList = $em->getRepository('Path\To\Entity\myEntity')->findAll();
          foreach ($itemList as $item)
          {
             $choicesArray[$item->getItemCode()] = $item->getItemName();
          }
          return $choicesArray;
       }
     
    }
    Voilà ça marche.
    Je suis curieux de savoir s'il n'y a rien de prévu dans le framework quand même...

    A bientôt!

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Désolé massacreur, j'étais en train d'écrire mon post quand tu m'as répondu...

    J'ai testé rapidement ta solution mais j'ai toujours un message d'erreur me disant "object expected, string given".

    Je ne vais pas passer la journée là-dessus, mais merci quand même pour tes conseils, je regarderai plus en détail une autre fois.

    A bientôt.

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Sinon il y a cette méthode qui fonctionne pour moi :
    https://github.com/beberlei/AcmePizz...erItemType.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                ->add('pizza', 'entity', array(
                    'class'         => 'Acme\PizzaBundle\Entity\Pizza',
                    'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); },
                ))
                ->add('count', 'integer')
                ;
        }
    Ici on récupère toutes les pizzas grâce à une requête données à query_builder, la fonction prends le repository en paramètre, c'est là que tu dois créer ta méthode retournant ce que tu souhaites. Par exemple:

    Créer ta classe repository correspondant à ton entité, si tu as une entité Categorie, alors créés une entité CategorieRepository qui étends EntityRepository.

    Ne pas oublier de faire ça dans Categorie pour indiquer la classe repository:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @orm:Entity(repositoryClass="NaN\MonBundle\Entity\CategorieRepository")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use Doctrine\ORM\EntityRepository;
     
    class CategorieRepository extends EntityRepository
    {
        public function getAllArticles()
        {
            $qb = $this->_em->createQueryBuilder();
     
            $qb->add('select', 'u')
                   ->add('from', 'NaN\MonBundle\Entity\Produit u');
     
                   return $qb;
        }
    }
    Assures toi que ta classe Produit possède une méthode __toString() qui renvoie le nom du produit pour être affiché dans la liste déroulante.

    Puis dans ton formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ->add('monChamps', 'entity', array(
                    'class' => 'NaN\MonBundle\Entity\Categorie',
                    'query_builder' => function ($repository) { 
                        return $repository->getAllArticles();
                    },
                ))
    Et voilà!

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    merci à Lidaa qui m'a apporté la solution dans le post suivant :
    http://www.developpez.net/forums/d10...e/#post6000097

    Je donne donc la solution à mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $builder->add('NomDeLaPropriété', 'entity', 
                    array ('label' => 'NomDuLabel',
                           'class' => 'MonAppliBundle:MonEntité', 
                           'property' => 'PropriétéAAfficher',
                           'required' => false));
    La nuance se trouve dans l'appel à l'entité :

    Le code suivant est donné en exemple dans la doc symfony2 mais ne fonctionne pas chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'class' => 'MonAppliBundle\Entity\MonEntité'
    alors que celui-ci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     'class' => 'MonAppliBundle:MonEntité'
    Et c'est plus simple que ce que j'avais proposé plus haut...

  10. #10
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    C'est dans le cadre d'une jointure ou pas ? Parce que si oui, tu peux utiliser le field type guessing : http://symfony.com/doc/current/book/...-type-guessing

    En gros, si tu es sur un formulaire User et que tu veux choisir un Group : comme la jointure entre User et Group est faite cote Entity, le composant Form peut deviner tout seul le type de champ a presenter. Il te fera tout seul un select avec la liste des groupes, en faisant en arriere plan la requete comme un grand.

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

Discussions similaires

  1. [Formulaire] méchante liste déroulante
    Par choups76 dans le forum IHM
    Réponses: 8
    Dernier message: 19/04/2007, 14h51
  2. Recherche formulaire avec liste déroulante
    Par kimar dans le forum Access
    Réponses: 2
    Dernier message: 28/07/2006, 12h02
  3. Réponses: 9
    Dernier message: 10/07/2006, 14h52
  4. Pb Formulaire avec liste déroulante
    Par Rouanou dans le forum IHM
    Réponses: 12
    Dernier message: 23/11/2005, 16h51

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