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 personnalisé [2.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut Formulaire personnalisé
    Bonjour,

    J'ai deux entités comme suit:

    Pratiquant (nom, prenom): OneToMany -> souscriptions

    Souscription (nbreDeMois) : (ManyToOne ->pratiquant)

    J'aimerais créé un formulaire qui va charger la liste des pratiquants.
    Et pour chaque pratiquant, je vais pouvoir choisir le nombre de mois de souscription (nbreDeMois).
    Avec une case à cocher devant chaque pratiquant pour sélectionner les pratiquants prêts pour la souscription. Et enfin un bouton pour tout enregistrer.


    J'ai commencé par créer un formulaire en ajoutant un champs de collection (souscriptions).
    Mais je me demande s'il faut créer une nouvelle entité pour ce formulaire.
    A vrai dire je manque d'idées.

    Merci de m'éclairer un peu avec quelques pistes si possible.

  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
    je crois que tu as juste besoin d'un formulaire ,qui aura parmi ses colonnes un array associatif des souscriptions (récupérer à part ) .
    Tout le formulaire sera affiché dans une boucle for (pour les pratiquant) coté twig .
    j'ai compris que tu veux un seul bouton submit et c'est faisable.
    Partage-nous ton formBuilder d'abord

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 72
    Points : 107
    Points
    107
    Par défaut
    Je t'invite à regarder dans une autre direction à l'aide de ce Bundle :
    https://github.com/stwe/DatatablesBundle

    Il te permet de créer à partir d'entités des tableaux de données auxquels tu peux ajouter une case à cocher de multi-selection et des actions. D'après ce que tu décrit ça pourrait facilement s'adapter à ton problème il me semble.

    En terme de rendu final ça sera peut-etre plus agréable à utiliser qu'un formulaire classique.
    Mais c'est sur que c'est une autre piste et que peut-etre tu jugera que ça ne te convient pas ^^

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Merci à vous tous.
    Li'dée de mehrezlabidimehrez m'interesse d'abord.
    Voici mon formulaire:
    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
    <?php
     
    namespace Jack\AikidoBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
     
    class PratSousType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
     
            $builder
                ->add('souscriptions', 'collection', array('type'=> new SouscriptionType(),
                    'allow_add'=>true,
                    'allow_delete' =>true
                )) 
     
            ;
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
     
            ));
     
     
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'prat_sous';
        }
    }
    Voilà là où j'ai commencé.

  5. #5
    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
    Tu peux tester et construire dans ton controlleur de pratiquant a partir de ça .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     $formBuilder = $this->get('form.factory')->createBuilder('form', $pratiquant);
            $formBuilder
     
                    ->add('souscription', 'choice', array(
                       'choices' =>  $array_souscription_nbreDeMois  ,                                   
                        'expanded' => false,
                        'multiple' => false
                    ));
    dans l'array tu doit mettre les valeurs a partir des quelles tu va choisir dans ta liste .
    Pour recuperer ce que tu as choisi avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      $souscription =  $form["souscription"]->getData(); 
    var_dump($souscription);exit;

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Actuellement, mon formulaire enregistre la souscription d'un seul pratiquant(membre) à la fois:
    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
    <?php
     
    namespace Jack\AikidoBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class SubscriptionType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('date')
                ->add('nbMonth')
     
                ->add('member', 'entity', array(
                    'class' => 'JackAikidoBundle:Member',
                    'property' => 'name',
                    'multiple' => true,
                    'expanded' => true,
                ))                 
            ;
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Jack\AikidoBundle\Entity\Subscription'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'subscription';
        }
    }
    Es-ce qu'il est possible d'enregistrer à une date donnée, la souscription de tous les pratiquants(membres) d'un seul coup ?

  7. #7
    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
    Oui c'est possible d'enregistrer plusieurs données , une requête sera dans une boucle peu n'importe .
    a mon avis ,ce que tu fais dans twig maintenant c'est de mettre les champs de la form dans une boucle foreach ( parcourant tes pratiquants )
    et tu va voir dans la vue que les choses evoluent.
    Et tu continues

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Okay. Voici mon controller:
    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
    public function subscriptionAction()
    {    
        $entity = new Subscription();
     
        $repository = $this->getDoctrine()
                           ->getRepository('JackAikidoBundle:Member');
     
        $members = $repository->findAll();
     
        $formBuilderPratSub = $this->createFormBuilder();
     
        //Make a loop for each $member
        foreach($members as $member)
        {
            $formBuilder = $this->get('form.factory')->createNamedBuilder(
                    $member->getId(), 
                    new SubscriptionType(), 
                    $entity
                    );
            $formBuilderPratSub->add($formBuilder);
        }
        //Create the form
     
        $form = $formBuilderPratSub->getForm();
        $form->add('submit', 'submit', array('label' => 'Create'));
     
        return $this->render('JackAikidoBundle:Aikido:souscription.html.twig', 
            array(
                'entity' => $entity,
                'forms'   => $form->createView(),
                'members' => $members,
        ));
     
    }
    Ma vue:
    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
        <table class="table">
            <thead>
                <tr>
                    <th>Member ID</th>
                    <th>Name</th>
                    <th>Firstname</th>
                    <th>Nb Month</th>
                </tr>
            </thead>
            <tbody>
                {% for member in members %}
                    {% for form in forms %}
                        <tr>
                            <td>{{ member.id }}</td>
                            <td>{{ member.nom }}</td>
                            <td>{{ member.prenom }}</td>
                            <td>{{ form_row(form.nbMonth)}}</td>
                        </tr>
     
                    {% endfor %}
     
                {% endfor %}
            </tbody>
        </table>
       <div>{{ form_row(forms.submit) }}</div>
    Error:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method "nbMonth" for object "Symfony\Component\Form\FormView" does not exist in JackAikidoBundle:Aikido:souscription.html.twig at line 25
    J'ai essayé d'afficher juste lo formulaire:
    Voici l'aperçu:
    Nom : aiki_sub.png
Affichages : 104
Taille : 7,5 Ko

    Comme vous le constatez, je suis encore très loin de mon objectif.

  9. #9
    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
    tu as essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {% for member in members %}
                {{ form(forms)}}
     {% endfor %}
    pour voir ce résultat ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    je viens d'essayer ça. j'obtiens le même résultat.
    Puis j'ai essayé ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for member in members %}
            {{ form(forms.1.nbMonth)}}
     {% endfor %}
    J'obtiens une seule fois le champs "nbMonth": résultat excompté!
    Mais dans une boucle pour avoir 2 fois ce champs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {% set i = 1 %}    
    {% for member in members %} 
            {{ form(forms.i.nbMonth)}}
       {% set i = i +1 %}   
     {% endfor %}
    Error:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method "i" for object "Symfony\Component\Form\FormView" does not exist
    Que faire?
    Un autre moyen peut être pour construire 'forms' dans le controller.

  11. #11
    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
    Une autre idée ,c'est de ne pas utiliser les form de symfony
    quand tu mets dans la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <input type="text" name="name[]"  id="name" style=""  value="" title="">
    tu vas trouver un champs de texte .
    tu l'encadre pas une boucle foreach sur les pratiquants .
    Tu vas avoir plusieurs champs input dans ta vue .
    dans ton controlleur tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    use Symfony\Component\HttpFoundation\Request;
    xxxAction(Request $request){}
    dans l'action tu récupères un tableau qui contient ce que t'as mis dans PLUSIEURS input à la fois .
    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $name = $this->getRequest()->get('name'); // var_dmp($name); =>  array
    dans la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <form  action='{{path('ROUTING DE L'ACTION xxxAction')}}' method="post" {{ form_enctype(form) }} >
    de la meme facon tu ecrit un champs (bouton radio ou liste multiple je sais pas ) qui va avoir en choix ( les id de l'autre entité ) ( dans un boucle foreach aussi )

    Une fois tu as récuperé tes choix et données inserés dans la form , tu les rassemble convenablement .
    J'ai eu un probléme pareil et je l'ai résolu avec la façon ci-dessus .

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Grand merci!
    Je vais essayer ça.

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

Discussions similaires

  1. [Outlook 2003] Parcourir un formulaire personnalisé en VBA
    Par Rikikix dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 02/10/2008, 14h42
  2. [wss] Master page et Formulaire Personnalisé
    Par zghidi dans le forum SharePoint
    Réponses: 2
    Dernier message: 04/01/2008, 16h45
  3. formulaire personnalisé plus sympa
    Par yadla dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/08/2007, 17h45
  4. Créer un formulaire personnalisé
    Par dddodo dans le forum IHM
    Réponses: 19
    Dernier message: 08/01/2007, 13h17
  5. [VB.net 2005] Formulaire personnalisé
    Par PoZZyX dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/05/2006, 16h57

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