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 :

[SF3]comment imbriquer 3 formulaires.


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : août 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [SF3]comment imbriquer 3 formulaires.
    bonsoir,
    j'ai 3 entités "liées", dont je veux les hydrater dans le même formulaire.
    alors un 'advert' appartient à un et un seul 'customer' qui possède 'un et un seul account'
    les entités advert, customer et account sont associées respectivement aux advertType, customerType et accountType.
    le problème c'est que: depuis le advertType, je veux utiliser seulement 3 champs (parmi 5) de customerType et 2 champs (parmi 4) de accounttype.

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    <?php
     
    namespace XX\XXBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
     
    //*****************************************************************
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\IntegerType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    //*******************************************************************
     
    class AdvertType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                    ->add('title',       TextType::class
                            , array(
                            'label'=>'Titre',
                            'attr' => array(
                            'placeholder' => 'Titre',
                            )))
                    ->add('content',     TextareaType::class                       
                            , array(
                            'label'=>'Description',
                            'attr' => array(
                            'placeholder' => 'Description...',
                            )))
                    ->add('price',       IntegerType::class
                            , array(
                            'label'=>'Prix',
                            ))
                    ->add('brand',       TextType::class
                             , array(
                            'label'=>'Marque',
                            'attr' => array(
                            'placeholder' => 'Marque(s)',
                            )))
                    ->add('showphone',   CheckboxType::class
                            , array(
                            'required' => false,
                            'label'=>'Afficher le numéro',
                            ))
                    ->add('picture',     PictureType::class
                            , array(
                            'data_class' => null,
                            'label'=>'Photos',
                            ))
                    ->add('published',   CheckboxType::class
                            , array(
                                'required' => false,
                                'label'=>'Publier',
                                ))
                    ->add('category',    EntityType::class, array(
                                'class'        => 'XXXXBundle:Category',
                                'choice_label' => 'longname',
                                'multiple'     => false,
                                'expanded'     => false,
                          ))
     
                    ->add('customer',    CustomerType::class)
                    ->add('account',     AccountType::class)
                    /*->add('save',        SubmitType::class
                            , array(
                            'label'=>'Publier mon annonce',
                            'attr' => array('class' => 'clearfix'),
                            )                        
                        )*/
            ;
        }
     
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'XX\XXBundle\Entity\Advert'
            ));
        }
     
        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'xx_xxbundle_advert';
        }
     
     
        public function getName()
        {
            return 'advert';
        }
     
    }
    remarque : j'ai essayer d'ajouter le bouton 'submit' au niveau de controleur mais ça n'a pas fonctionné d'apres une recommandation
    merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Bonjour.

    Je ne suis pas sûr d'avoir bien saisi la question.
    Peut-être que tu peux utiliser le paramètre $options de la méthode buildForm pour spécifier des cas particuliers...
    Exemple (complètement au hasard) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if ($options['action'] == 'advertTypeAction') {
                $builder
                    ->remove('customer')
                    ->remove('account')
                ;
            }
    De retour parmis vous après 10 ans!!

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : août 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    Bonjour.

    Je ne suis pas sûr d'avoir bien saisi la question.
    bonsoir,
    admettant qu'il y a 3 entités:
    1)advert(id,title,content,price,date,brand,showphone,picture,published,category)
    2)customer(id,firstname,lastname,adresse,phone)
    3)account(id,email,password,role)
    depuis un et un seul formulaire je veux hydrater "partiellement" les 3 objets (qui sont liés):title+content+price+categeory+firstname+email+password.

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    En fait, faut partir du principe que l'on peut tout faire et de différentes façons qui plus est.
    Avec doctrine, on peut programmer l'hydratation partielle pour obtenir au final une entité contenant des propriétés particulières.
    J'ai trouvé ces liens qui en parlent si ça t'intérresse :
    http://docs.doctrine-project.org/pro...l-objects.html
    https://github.com/doctrine/doctrine2/issues/2314

    Maintenant, faut voir si l'enregistrement fonctionne directement ou bien si tu vas devoir faire une sauvegarde unitaire de chaque entité...

    Perso, j'ai déjà eu l'occasion de réaliser un formulaire dans lequel se trouvaient différentes entités à modifier...
    Avec une approche différente, côté controller, on envoi à la vue les entités que l'on souhaite retrouver dans le formulaire, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $entity1 = $this->get('form.factory')->createBuilder('App\Form\Type\Entity1Type', $entity1)->getForm();
    $entity2 = $this->get('form.factory')->createBuilder('App\Form\Type\Entity2Type', $entity2)->getForm();
    $entity3 = $this->get('form.factory')->createBuilder('App\Form\Type\Entity3Type', $entity3)->getForm();
    $view = View::create()
        ->setData([
            'entity1' => $entity1->createView(),
            'entity2' => $entity2->createView(),
            'entity3' => $entity3->createView(),
            ...
    J'espère t'avoir guidé sur une solution adaptée à ton besoin.
    N'hésite pas si tu as des questions.

    Bon courage!
    De retour parmis vous après 10 ans!!

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : août 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    En fait, faut partir du principe que l'on peut tout faire et de différentes façons qui plus est.
    Avec doctrine, on peut programmer l'hydratation partielle pour obtenir au final une entité contenant des propriétés particulières.
    J'ai trouvé ces liens qui en parlent si ça t'intérresse :
    http://docs.doctrine-project.org/pro...l-objects.html
    https://github.com/doctrine/doctrine2/issues/2314

    Maintenant, faut voir si l'enregistrement fonctionne directement ou bien si tu vas devoir faire une sauvegarde unitaire de chaque entité...

    Perso, j'ai déjà eu l'occasion de réaliser un formulaire dans lequel se trouvaient différentes entités à modifier...
    Avec une approche différente, côté controller, on envoi à la vue les entités que l'on souhaite retrouver dans le formulaire, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $entity1 = $this->get('form.factory')->createBuilder('App\Form\Type\Entity1Type', $entity1)->getForm();
    $entity2 = $this->get('form.factory')->createBuilder('App\Form\Type\Entity2Type', $entity2)->getForm();
    $entity3 = $this->get('form.factory')->createBuilder('App\Form\Type\Entity3Type', $entity3)->getForm();
    $view = View::create()
        ->setData([
            'entity1' => $entity1->createView(),
            'entity2' => $entity2->createView(),
            'entity3' => $entity3->createView(),
            ...
    J'espère t'avoir guidé sur une solution adaptée à ton besoin.
    N'hésite pas si tu as des questions.

    Bon courage!
    de retour,
    merci sub0 d'avoir intéresser à ma question,
    alors j'ai fini par fusionner les deux entités customer et account pour réduire les problèmes et j'ai réussi à enregistrer les données dans la base.
    puis j'ai eu l'idée d'optimisé le formulaire de cette façon:
    si l'utilisateur est inconnu tous les champs sont visible (2 entités à hydrater)
    si l'utilisateur est connecté, les champs firstname,lastname,adresse et phone seront cachés (une seule entité à hydrater).
    pour faire, dans advertType j'ai initialisé le constructeur
    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
    private $isGranted;
        public function __construct($isGranted,$customer_id)
        {
            $this->isGranted = $isGranted;
            $this->customer_id= $isGranted;
        }
    {...}
            if(!($this->isGranted))
            {
                 $builder->add('customer',    CustomerType::class);
            }
            else
           {
                 $builder->add('customer_id', HiddenType::class
                            , array('attr' => array(
                                'mapped' => false,
                                //'value' => $customer_id
                           )));
            }
    jusque là et je me bloque toute une journée sans trouver aucune solution sur le net, je ne sais pas comment remplir customer_id par l'id du client courant connecté, je sais par principe que c'est possible en advertType, add.html.twig et advertController.mais comment faire? quelle est la solution?
    merci d'avance pour réponses.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    juillet 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : juillet 2016
    Messages : 49
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    Imaginons tu as 2 entités, une A et une autre B.

    Tu fais le FormType de ton entités A.
    Tu fais ensuite le FormType de ton entité B.
    Ensuite dans l'entité B tu as une clé étrangère A_id. Donc dans le formtype de l'entité B tu ajoute le champs en question et tu lui passe le formType A comme classe

    FormAType.php:

    ...
    class FormAType extends AbstractType
    {
    /**
    * {@inheritdoc}
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

    $builder->add('Nom', TextType::class)
    ->add('Prenom', TextType::class)
    ->add('toto', TextType::class)
    ->add('titi', TextType::class);
    }
    ...
    }

    FormBType.php:
    class FormBType extends AbstractType
    {
    /**
    * {@inheritdoc}
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

    $builder->add('Mama', TextType::class)
    ->add('Mimi', TextType::class)
    ->add('Momo', TextType::class)
    ->add('Mumu', TextType::class)
    ->add('A_id', FormAType::class);
    }
    ...
    }

    Ensuite dans ton controlleur tu appelle ton FormBType. Et dans ton twig tu mets tes éléments tel que:

    Tu accède directement à B ( {{ form_widget(form.B) }}
    Pour accéder à A ( {{ form_widget(form.B.A) }}

    Je sais pas si j'ai répondu à ta question.

Discussions similaires

  1. [2.x] Comment rendre un formulaire imbriqué optionnel ?
    Par hsii04 dans le forum Symfony
    Réponses: 6
    Dernier message: 06/01/2012, 11h33
  2. Comment exporter un formulaire sous excel
    Par Naud dans le forum Access
    Réponses: 5
    Dernier message: 12/10/2005, 10h44
  3. Comment faire ??? Sous formulaire ? Autre ?
    Par Zotto dans le forum IHM
    Réponses: 11
    Dernier message: 14/06/2005, 15h53
  4. Comment afficher un formulaire de demarrage en plein ecran?
    Par ornitore dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 23/05/2005, 15h16
  5. [VB.NET] [PPC] Comment faire un formulaire sur pls pages?
    Par papy27 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 03/06/2004, 17h23

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