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 symfony - Afficher des champs sous condition [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti Avatar de cyreel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 388
    Points : 324
    Points
    324
    Par défaut Formulaire symfony - Afficher des champs sous condition
    Bonjour @ tous,
    je débute avec symfony et là j'en suis à la gestion des formulaires.
    Je veux permettre aux utilisateurs de modifier les profils (jusque là tout se passe bien).
    J'ai 2 types d'utilisateur dont l'un (entreprise) a des champs supplémentaire (logo, activité) comment utiliser le même formulaire et n'afficher les 2 champs que lorsque l'utilisateur est une entreprise tout en gardant le même formulaire? (j'ai pensé a l'option de 2 formulaire différent mais option écartée).

    Merci à tous.
    Mon controlleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            $user = $this->getUser();
            if(!$user->isEnabled()) return $this->redirect($this->generateUrl('home'));
     
            $em = $this->getDoctrine()->getManager();
            $vars = array();
            $appconfig = new AppConfig();
            $config = $appconfig->getConfig('Global');
     
            // Formulaire "Profil"
            $form = $this->createForm(ProfilFormType::class, $user, array('em' => $em));
    contenu ProfilFormType.php
    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
     
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $this->em = $options['em'];
     
            $builder
                ->add('civility', CivilityType::class, array(
                    'label' => 'Civilité :',
                    'constraints' => new NotBlank(),
                ))
                ->add('lastname', TextType::class, array(
                    'label' => 'Nom :',
                    'attr' => array(),
                    'constraints' => new NotBlank(),
                ))
                ->add('firstname', TextType::class, array(
                    'label' => 'Prénom :',
                    'attr' => array(),
                    'constraints' => new NotBlank(),
                ))
                ->add('address', TextareaType::class, array(
                    'label' => 'Adresse :',
                    'attr' => array(),
                    'required' => false
                ))
     
                ->add('zipCode', TextType::class, array(
                    'required' => false,
                    'label' => 'Code Postal :',
                    'attr' => array(),
                    'constraints' => array(
                        new Type(array('type'=>'numeric', 'message'=> 'Le code postal ne doit contenir que des chiffres')),
                    )
                ))
     
                ->add('phone', TextType::class, array(
                    'label' => 'Téléphone :',
                    'constraints' => array(
                        new NotBlank(),
                        new Phone(),
                    )
                ))
     
                ->add('activites', TextareaType::class, array(
                    'label' => 'Activités :',
                    'attr' => array(),
                    'required' => false
                ))
     
                ->add('validPassword', PasswordType::class, array(
                    'label' => 'Mot de passe actuel :',
                    'constraints' => array(
                        new UserValidPassword(),
                    )
                ))
                ;
    }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    bonjour
    exemple :
    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
     
    use Symfony\Component\Security\Core\SecurityContext;
     
    class UserType extends AbstractType
    {
     
        private $securityContext;
     
        public function __construct(SecurityContext $securityContext)
        {
            $this->securityContext = $securityContext;
        }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
            // Current logged user
            $user = $this->securityContext->getToken()->getUser();
     
            // Add fields to the builder
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'required'   => false,
                'data_class' => 'Acme\HelloBundle\Entity\User'
            );
        }
     
        public function getName()
        {
            return 'user_type';
        }
    }
    ###
    services:
        form.type.user:
            class: Acme\HelloBundle\Form\Type\UserType
            arguments: ["@security.context"]
            tags:
                - { name: form.type, alias: user_type }
    ###
    $form = $this->createForm($this->get('form.type.user'), $data);

    sinon on peux le faire coté twig avec render_rest false a la fin de la form et traiter les champs cas par cas selon le user connecté
    mais c'est pas bien comme solution

  3. #3
    Membre averti Avatar de cyreel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 388
    Points : 324
    Points
    324
    Par défaut
    Merci @MehrezLabidi pour la réponse.
    Mais tu pourrais expliquer un peu?
    Je craint de ne pas tout comprendre.
    Merci.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Points : 358
    Points
    358
    Par défaut
    Il est possible d'utiliser les "Form Events" de la manière suivante :
    D'abord importer dans ProfilFormType.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    et utiliser de cette manière
    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
     
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use($options) {
                $user = $event->getData();//recuperation de l'objet sur lequel le formulaire se base
                $form = $event->getForm();//recuperation du formulaire
                //en fonction du type de l'utilisateur les champs sont différents
                if ($user->getType()=='montype') {
                    $form->add('activity', null, array('label' => 'Activité : '));
                    //....
                } else {
                    $form->add('civility', null, array('label' => 'Civilité : '));
                    //....
                }
            });
        }

  5. #5
    Membre averti Avatar de cyreel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 388
    Points : 324
    Points
    324
    Par défaut
    Merci @numew,
    ça marche bien mais comment faire la condition dans le fichier twig? car j'ai cette erreur lorsque l'utilisateur n'est pas une entreprise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Neither the property "activites" nor one of the methods "activites()", "getactivites()"/"isactivites()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView" in AppBundle:User:index.html.twig at line 33
    En effet dans le cas d'un utilisateur simple le champ activités ne dois pas exister.

    Contenu twig
    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
     
    <div class="col-md-8 col-md-offset-2">
                        {{ form_start(form) }}
     
                        {{ form_errors(form) }}
                        {{ form_row(form.civility) }}
                        {{ form_row(form.lastname) }}
                        {{ form_row(form.firstname) }}
                        {{ form_row(form.company) }}
                        {{ form_row(form.address) }}
                        {{ form_row(form.zipCode) }}
                        {{ form_row(form.phone) }}
                        {{ form_row(form.email, { 'attr': {'readonly': 'readonly'} }) }}
                        {{ form_row(form.validPassword) }}
                        {{ form_row(form.activites) }}
                    </div>

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Points : 358
    Points
    358
    Par défaut
    Si jamais le formulaire peut être affiché sans modifications, il suffit d'utiliser la ligne
    qui affiche le formulaire en entier avec seulement les champs existants sans avoir besoin d'écrire une ligne "form_row" pour chacun.

    Sinon il faut vérifier l'existence du champs de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        {% if form.activites is defined %}
            {{form_row(form.activites)}}
        {% endif %}
    Au passage, mettre le champs "email" en readonly seulement coté twig n’empêche pas (en modifiant le code source) qu'il soit modifié (pas de contrôle coté serveur) il vaut mieux le bloquer dans le formBuilder avec l'option "disabled"=>true

  7. #7
    Membre averti Avatar de cyreel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 388
    Points : 324
    Points
    324
    Par défaut
    Merci à tous.
    Problème resolu.

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

Discussions similaires

  1. [Toutes versions] Concaténer des champs, sous conditions
    Par SylvainM dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/03/2014, 22h06
  2. [AC-2000] Formulaire afficher certain champ sous condition
    Par ClementZa dans le forum IHM
    Réponses: 0
    Dernier message: 15/07/2010, 13h16
  3. Afficher un champs sous condition
    Par wachoo31 dans le forum IHM
    Réponses: 3
    Dernier message: 09/05/2007, 13h08
  4. Afficher un champ sous condition
    Par Cantalou dans le forum Access
    Réponses: 24
    Dernier message: 01/02/2006, 15h25
  5. SQL sous Access : affiche un des champs si condition rempli
    Par Thomus38 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/09/2005, 13h09

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