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 :

plusieurs formulaires et plusieurs boutons


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut plusieurs formulaires et plusieurs boutons
    Bonjour,

    J'ai une entité question qui contient plusieurs entités réponse.
    Je voudrais pouvoir afficher sur une même page toutes mes questions et les réponses associées ainsi qu'un bouton pour valider la réponse.
    En gros j'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    question 1
    - reponse 1.1
    - reponse 1.2
    bouton submit
    question 2
    - reponse 2.1
    - reponse 2.2
    bouton submit
    ensuite on choisit la réponse voulue et on clique sur le submit, la page affiche le résultat à la question à laquelle on a répondu et affiche la question et les réponses pour les autres question.
    Pour le moment, j'ai réussit à afficher la liste des questions, on clique sur une question, on voit la liste des réponses, on clique sur les réponses et on voit les résultats et on peut revenir sur la liste des questions.
    Ce qui me manque c'est d'afficher sur une meme page question/réponses + form
    Comment faire ?
    Merci
    Jérôme

  2. #2
    Membre habitué Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Points : 149
    Points
    149
    Par défaut
    Salut!

    Je suis pas sûr de bien comprendre la question, peux tu poster le code de tes entiites (enlève les getters & setters sinon ça va être illisible ).

    Mais si je comprend bien :
    Tu as une page avec des questions et les réponses associées.
    Lorsque l'on répond à une question, on est redirigé vers la même page.
    Si une question a eu une réponse, on affiche celle-ci, sinon on affiche le formulaire.

    Y-a-t-il une relation OneToMany entre tes entités : Question 1-n Reponse ?
    Dans ce cas, comment stocke tu l'info : l'utilisateur a répondu la Reponse N° X à la Question N° Y ?

    Ou au contraire tes entités te servent à stocker cette info, et dans ce cas comment gère tu la relation Question-Reponses.
    Javascript est la pornstar des langages de programmation : souple, puissant, tu lui fais faire ce que tu veux, et ça peut finir bien crade.
    ---
    https://www.bgaze.fr

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    En fait, j'ai une 3eme entité qui est ReponseUser qui permet de savoir à quelle réponse a répondu un user.
    Mais dans l'immédiat ce que je veux faire, c'est afficher sur une même page la liste de toutes les questions ouvertes (et réponses associées) sous forme de form pour que les user puissent sélectionner une réponse à chaque question.
    Ensuite, une fois que le user a cliqué sur une réponse il valide le form et retourne sur la meme page sauf qu'il ne peut plus répondre à la question à laquelle il a déjà répondu et à la place il voit les résultats de cette question (avec % de vote pour chaque réponse)
    Je pense qu'il doit falloir passer par une collection, mais je vois pas trop.
    Merci de votre aide.
    Jérôme

  4. #4
    Membre habitué Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Points : 149
    Points
    149
    Par défaut
    Ok, mais sans le code c'est pas facile de savoir exactement de quoi on parle. Pour moi une solution possible est la suivante, au lieu d'essayer de créer un seul formulaire, tu en crées un par question :

    1) Dans le controller de ta page principale, tu boucles sur tes questions et tu alimentes un tableau :
    - si la question n'a pas été répondue, tu y mets le formulaire correspondant (sans oublier le ->createView()).
    - sinon, tu y met la réponse choisie par l'utilisateur.
    Puis tu renvoie le tableau à ta vue.

    2) Dans ta vue, tu boucles sur sur ton tableau et tu teste le contenu. Si c'est un formulaire tu l'affiches normalement, sinon tu affiche la réponse.
    Du coup tu te retrouves sur une page avec x formulaires différents, chacun ayant son action propre (je parle de l'attribut html), son boutton, etc.

    3) A la fin du traitement de ces formulaires, dans le controller, tu mets une redirection vers celui de ta page principale.

    Il est possible à mon avis de procéder plus directement en utilisant le formulaire de ReponseUser, mais là il me faut le code de tes trois entités.
    Javascript est la pornstar des langages de programmation : souple, puissant, tu lui fais faire ce que tu veux, et ça peut finir bien crade.
    ---
    https://www.bgaze.fr

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    Je vois ce que tu veux dire, mais ce que je ne vois pas c'est comment SF fait le bind ? et comment il sait sur quelle question le user a cliqué ?
    Pour l'instant ce que j'ai fait, c'est que j'affiche la liste des questions soit sous forme de résultat, soit un lien vers la possibilité de répondre. ensuite si le gars il veut répondre, il clique sur le lien et la je lui montre une page où il y a le formulaire il clique et je lui affiche un lien pour revenir à la page précédente.

    Voici le 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
    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
    /**
     * PollQuestion
     *
     * @ORM\Table(name="poll_question")
     * @ORM\Entity(repositoryClass="DataBaseBundle\Entity\PollQuestionRepository")
     */
    class PollQuestion
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255)
         */
        private $name;
     
        /**
         * @var boolean
         *
         * @ORM\Column(name="enabled", type="boolean")
         */
        private $enabled;
     
        /**
         * @var date
         *
         * @ORM\Column(name="startdate", type="date")
         */
        private $startDate;
     
        /**
         * @var date
         *
         * @ORM\Column(name="enddate", type="date")
         */
        private $endDate;
     
        /**
        *
        * @ORM\OneToMany(targetEntity="PollAnswer", mappedBy="question", cascade={"persist"})
        */
        private $answers;    
    ...
    }
    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
    /**
     * PollAnswer
     *
     * @ORM\Table(name="poll_answer")
     * @ORM\Entity(repositoryClass="DataBaseBundle\Entity\PollAnswerRepository")
     */
    class PollAnswer
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255)
         */
        private $name;
     
        /**
         * @var \PollQuestion
         *
         * @ORM\ManyToOne(targetEntity="PollQuestion", inversedBy="answers")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="question", referencedColumnName="id", nullable=false )
         * })
         */
        private $question;
    ...
    }
    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
    /**
     * PollAnswerUser
     *
     * @ORM\Table(name="poll_answer_user")
     * @ORM\Entity(repositoryClass="DataBaseBundle\Entity\PollAnswerUserRepository")
     */
    class PollAnswerUser
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="date", type="datetime")
         */
        private $date;
     
        /**
         * @var \PollAnswer
         *
         * @ORM\ManyToOne(targetEntity="PollAnswer")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="answer", referencedColumnName="id")
         * })
         */
        private $answer;
     
        /**
         * @var \User
         *
         * @ORM\ManyToOne(targetEntity="User")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="user", referencedColumnName="id")
         * })
         */
        private $user;
    ...
    }
    Jérôme

  6. #6
    Membre habitué Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Points : 149
    Points
    149
    Par défaut
    Bon, je sais pas si c'est exactement ça que tu veux faire, mais du coup tu pourrais faire comme ça pour tes entités :

    PollQuestion 1-n PollAnswer
    PollAnswer n-n User

    Dans PollAnswer tu crée la méthode suivante, qui t'informe si cette réponse a été choisie par l'user :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function hasAnswered(User $user) {
        return $this->getUsers()->contains($user);
    }
    Dans PollQuestion tu crée la méthode suivante, qui retourne la réponse si la question a été répondue, sinon false :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function hasAnswered(User $user) {
        foreach ($this->getAnswers() as $a) {
            if ($a->hasAnswered($user)) {
                return $a;
            }
        }
        return false;
    }
    Ainsi tu peux faire dans ton controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $tmp = array();
    foreach ($questions as $q) {
        $tmp[] = $q->hasAnswered($user) || $this->createForm(new PollQuestionType(), $q, array(
                    'action' => $this->generateUrl('pollquestion_update', array('id' => $q->getId()))
                ))->createView();
    }
    return array('questions' => $tmp);
    Et dans ta vue :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {% for q in questions %}
        {# si un attribut "question" existe, alors c'est une réponse, sinon c'est un formulaire #}
        {% if (q.question is defined) %}
            <p>{{ q.question.name }}</p>
            <p>{{ q.name }}</p>
        {% else %}
            {{ form(q) }}
        {% endif %}
    {% endfor %}

    Voila, c'est juste une idée, j'ai pas testé. Et en termes de perf je sais pas trop, il risque d'y avoir pas mal de lazy-loading, du coup faudra peut-être optimiser avec tes custom repository.

    EDIT : évidemment dans le controller correspondant à la route pollquestion_update n'oublie pas de mettre à jour ta réponse avec addUser puis de faire une redirection vers ta page principale.
    Javascript est la pornstar des langages de programmation : souple, puissant, tu lui fais faire ce que tu veux, et ça peut finir bien crade.
    ---
    https://www.bgaze.fr

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    Merci pour ces pistes !
    Jérôme

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/07/2015, 12h29
  2. Réponses: 4
    Dernier message: 02/03/2011, 23h16
  3. [ZF 1.10] layout avec plusieurs zones et plusieurs formulaires
    Par psylo66 dans le forum MVC
    Réponses: 3
    Dernier message: 07/10/2010, 09h15
  4. [AC-2007] Un seul sous-formulaire dans plusieurs formulaires
    Par j.lebowski dans le forum IHM
    Réponses: 0
    Dernier message: 09/07/2010, 18h00
  5. Réponses: 3
    Dernier message: 02/07/2008, 19h08

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