8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je developpe actuellement un projet pour faire un QCM : J'ai entre autre 2 entités, Question et Proposition en oneToMany (pour chaque question il peut y avoir minimum 2 propositions ou plus) , que j'affiche sur twig ... seul hic, comment faire en sorte que pour chaque question, l'utilisateur ait au moins coché une proposition? en faisant un required dans la boucle twig c'est evidemment toutes les checkbox qui deviennent obligatoire Smiley decu

mon code twig :

<form action="{{ path('traitement_qcm')}}" method="post"> 
        {% for question in questions  %}    
        <article>
            <h4>Question n° {{ loop.index }}  :  {{ question.theme}} </h4> 
            <br>       
            <div class="sujet">            
            <h5>{{ question.sujet | raw }}</h5>           
            </div>
            <br>
            {% for proposition in question.propositions %}
                <div class="form-group">
                    <input class="form-check-input" type="checkbox" value ="{{question.id}}" name="{{proposition.id}}"
                     >
                    <label class="form-check-label" for="{{proposition.id}}">{{proposition.choix}}</label>
                </div>                   
            <br>
            {% endfor %}
        </article>       
    {% endfor %}
    <div class="form-group">
        <button type="submit" class="btn btn-success">Validez!</button>
    </div>
  </form>      


et ici mon controller symfony :



 public function index(QuestionRepository $repo, Request $request)
    {
        $questions= $repo->findAll();        
        return $this->render('qcm/index.html.twig', ['questions'=>$questions]);               
    


comment faire ??
Modifié par moko (17 May 2019 - 16:18)
Désolé mais aucun effet Smiley ohwell

j'ai essayé ça sur mon sous-form (propositions)

{% if question.propositions %}
            {% for proposition in question.propositions %}
                <div class="form-group">
                    <input class="form-check-input" type="checkbox" value ="{{ question.id  }}" name="{{ proposition.id|e  }}"
                     >
                    <label class="form-check-label" for="{{proposition.id}}">{{proposition.choix}}</label>
                </div>                   
            <br>
            {% endfor %}
{% endif %}


Mais le form passe à tous les coups Smiley fache
Modifié par moko (19 May 2019 - 18:14)
Salut

Je verrai ça plus dans l'entité j'y mettrai une contrainte min et max en comptant le nombre de checkbox coché
Modérateur
Tu n'utilises pas les Form Symfony?

Comment valides-tu ton form côté serveur?

Plusieurs checkbox avec au moins une cochée, il n'existe aucune validation automatique côté navigateur, il faut le coder en javascript ou utiliser une librairie javascript qui le gère.
En js tu peux faire cela Smiley smile

Tu le fais sur l’événement submit, comme ça si c'est pas bon, tu peux stopper la propagation!

$(".form-group").each(function(index,value){
   var checkbox = $(this).find(".form-check-input");
  var checkedOrNot = false;
   $(checkbox).each(function(index,value){
        if($(this).is(":checked")){
            checkedOrNot  = true;
         }
   });
   if(checkedOrNot){
       //Au moins une checkbox est checker pour un groupe.
   }else{
      alert("Veuillez cochez au moins une case");
      //stop propagation machin truc.  
   }
});


Bon j'ai codé à l'arrache en 2 sec, donc normalement la deuxième boucle ne fonctionne pas sur .each(), faudrait faire une boucle normal.
Modifié par JENCAL (20 May 2019 - 11:45)
kustolovic a écrit :
Tu n'utilises pas les Form Symfony?

Comment valides-tu ton form côté serveur?

Plusieurs checkbox avec au moins une cochée, il n'existe aucune validation automatique côté navigateur, il faut le coder en javascript ou utiliser une librairie javascript qui le gère.


Non effectivement pas de Form builder car il s'agit de formulaire imbriqués, j'ai préféré aller au plus simple au début. je valide le Form via mon controller :


public function traitement(Request $request, ObjectManager $manager){
    
    $quest = $request->request->all();  
    foreach($quest as $prop=>$qst){
        $reponse= new Reponse();
        $reponse->setQuestionId($qst);
        $reponse->setIdProposition($prop);
        $reponse->setCreatedAt(new \DateTime());
        $manager->persist($reponse);
        $manager->flush();
    }

Pour le probleme de check je vois bien JS aussi Smiley smile
Modifié par moko (20 May 2019 - 16:53)
JENCAL a écrit :
En js tu peux faire cela Smiley smile

Tu le fais sur l’événement submit, comme ça si c'est pas bon, tu peux stopper la propagation!

$(".form-group").each(function(index,value){
   var checkbox = $(this).find(".form-check-input");
  var checkedOrNot = false;
   $(checkbox).each(function(index,value){
        if($(this).is(":checked")){
            checkedOrNot  = true;
         }
   });
   if(checkedOrNot){
       //Au moins une checkbox est checker pour un groupe.
   }else{
      alert("Veuillez cochez au moins une case");
      //stop propagation machin truc.  
   }
});


Bon j'ai codé à l'arrache en 2 sec, donc normalement la deuxième boucle ne fonctionne pas sur .each(), faudrait faire une boucle normal.


Merci JENCAL, tu vas me faire gagner du temps Smiley smile
Modérateur
Ok pour les forms manuels, mais il faut en effet tout valider à la main alors.

a écrit :
je valide le Form via mon controller

Enfin là dans le code tu ne valide pas qu'au moins une checkbox soit cochée
kustolovic a écrit :
Ok pour les forms manuels, mais il faut en effet tout valider à la main alors.

je valide le Form via mon controller

Enfin là dans le code tu ne valide pas qu'au moins une checkbox soit cochée

Oui tu as raison, c'est une confusion de ma part entre validation et soumission Smiley smile