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 dynamique, data transformer entity -> collection [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
    Février 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 116
    Par défaut Formulaire dynamique, data transformer entity -> collection
    Bonjour,

    J'ai un gros problème avec un formulaire dynamique, je ne sais pas du tout comment m'y prendre

    J'ai une entité Product qui est reliée à une entité attributeGroup, elle même reliée à une autre entité, Attribute. L'entité Product est également reliée à l'entité Variant reliée en OneToMany à Attribute.
    ,
    Avant de pouvoir créer un produit, il faut que je crée des groupes d'attribut, par exemple taille avec ses attributs petit, moyen, grand.
    Lorsque je créer un produit, je choisi ses groupes d'attribut, puis je génère les variantes(déclinaisons)

    Mon problème est que je ne vois pas du tout comment m'y prendre pour afficher un formulaire ayant un champ variant en collection (liste des groupes d'attribut avec leur attribut dans un champ de type choice) et gérer la soumission du formulaire pour que cela me retourne la variante qui correspond aux attributs sélectionnés.

    Merci.

  2. #2
    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
    Hello,

    Les formulaires dynamiques ne sont pas un sujet simple mais la documentation de Symfony est relativement bien fournie sur ce sujet.

    Je te suggère de commencer par jeter un œil à cette page qui explique le concept des évènements de formulaire et comment les traiter, je pense que ça répondra à pas mal d'interrogations et tu auras de la matière pour débuter. http://symfony.com/fr/doc/current/co...ification.html

    C'est un gros morceau à attaquer et ça demande un peu de temps pour la prise en main mais ça en vaut la peine car c'est très utile

    Bon courage et n'hésite pas à revenir poser des questions si tu as des problèmes pour mettre ce système en place.

    ++ bon courage

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 116
    Par défaut
    Merci Nico,

    J'ai déjà lu et relu la documentation, le problème est que je ne vois pas comment mettre tout ça en place dans mon formulaire. J'avais déjà crée un formulaire contenant les différentes liste d'attributs pour chaque groupe(via PRE_SET_DATA) mais lors de la soumission du formulaire, cela me retournait bien les attributs sélectionnés mais pour les mauvais groupes, ce qui retournait une erreur de validation.

    Je retourne à ma lecture

    I'll be back !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 116
    Par défaut
    Me revoilà

    je n'y arrive vraiment pas.

    mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
     
            $builder->add('quantity', 'integer', array(
                        'attr'   => array('min' => 1, 'value' => 1),
                        'mapped' => false,
                        'label'  => false
                    ))
                    ->add('attributeGroups', 'collection', array(
                        'type'  => new  \App\ProductBundle\Form\Type\AttributeGroup\FrontFormType($this->locale),
                        'label' => false
                    ));
        }
    le FrontFormType:
    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
     
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
     
                $entity       = $event->getData();
     
                $id           = $entity->getId();
                $translations = $entity->getTranslations();
                $groupName    = $translations[$this->locale]->getName();
                $form         = $event->getForm();
                $locale       = $this->locale;
     
                $form->add('attributes', 'a2lix_translatedEntity', array(
                    'class'                => 'AppProductBundle:Attribute',
                    'translation_property' => 'name',
                    'multiple'             => false,
                    'label'                => $groupName.' id = ' .$id,
                    'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($id) {
                        return $er->createQueryBuilder('a')
                                  ->where('a.attributeGroup = :id')
                                  ->orderBy('a.name', 'ASC')
                                  ->setParameter('id', $id);
                    },
                ));
            });
        }
    L'affichage fonctionne, mais la soumission du formulaire ne fonctionne pas. Les Groupes d'attributs sont inversés et donc cela retourne une erreur de validation car les attributs ne correspondent pas au groupe d'attributs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [2014-12-30 15:30:08] doctrine.DEBUG: SELECT a0_.id AS id0, a0_.name AS name1, a0_.position AS position2, a0_.attributeGroup_id AS attributeGroup_id3 FROM attributes a0_ WHERE a0_.attributeGroup_id = ? AND a0_.id IN (?) ORDER BY a0_.name ASC [2,["1"]] []
    [2014-12-30 15:30:08] doctrine.DEBUG: SELECT a0_.id AS id0, a0_.name AS name1, a0_.position AS position2, a0_.attributeGroup_id AS attributeGroup_id3 FROM attributes a0_ WHERE a0_.attributeGroup_id = ? AND a0_.id IN (?) ORDER BY a0_.name ASC [1,["3"]] []
    cela devrait être:
    [1,["1"]]
    [2,["3"]]

    Je ne vois pas du tout comment gérer cette erreur...

    Merci

    Edit:
    Si je fais sans la génération dynamique du formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $builder->add('attributes', 'a2lix_translatedEntity', array(
                    'class'                => 'AppProductBundle:Attribute',
                    'translation_property' => 'name',
                    'multiple'             => false,
                    'label'                => false,
                    'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
                        return $er->createQueryBuilder('a')
                                  ->orderBy('a.name', 'ASC');
                    }
                ));
    Cela fonctionne, mais du coup, je me retrouve avec plusieurs listes déroulante ayant exactement le même contenu et sans label..

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 116
    Par défaut
    Je me permets de faire un petit up

  6. #6
    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
    Dans la doc que je t'ai fourni, le dynamisme du formulaire est géré via des event listeners et event subscribers.
    Et sauf erreur de ma part, je n'en vois aucun dans ton code. [EDIT] Sorry j'ai mal regardé, je jète un œil dès que je peux.

    Tu devrais d'avantage creuser la partie event, car c'est la clé d'un formulaire dynamique bien construit.

    Concrètement en fonction des choix de certains champs de ton formulaire que ces listeners (ou subscriber) vont écouter, tu pourras modifier la construction de ton formulaire.

    Tu peux le tourner dans tous les sens et essayer de ne pas toucher aux évènements de formulaires si tu sens que c'est un morceau trop compliqué, mais je ne vois pas d'autre méthode.

    Joue avec les listeners et les subscribers sur un cas simple à part, et applique le petit à petit à ton formulaire. Une fois que tu as compris le fonctionnement c'est quelque chose de très puissant.

    Bonne chance
    ++

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

Discussions similaires

  1. [2.x] Formulaire dynamique pour champ collection
    Par symfony_dev dans le forum Symfony
    Réponses: 0
    Dernier message: 20/09/2014, 18h12
  2. Data transformation service
    Par mlequim dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/02/2005, 11h53
  3. pb access formulaire dynamique
    Par jibouze dans le forum IHM
    Réponses: 3
    Dernier message: 12/01/2005, 09h39
  4. formulaire dynamique
    Par shirya dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/10/2004, 16h13
  5. [struts]Formulaire dynamique
    Par GreenJay dans le forum Struts 1
    Réponses: 8
    Dernier message: 28/05/2004, 16h35

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