Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

limiter les choix dans un menu déroulante en fonction d'une réponse

More
8 years 9 months ago #121759 by walid
Bonjour à tous.
je suis novice sur limesurvey .

Version 2.06+ Build 150612

dans un questionnaire j'ai deux questions successives.

1- Région (choix entre 15 régions pour l'ensemble du pays)
2- Province (choix entre 60 provinces pour l'ensemble du pays)

pour la question 2, je voudrais limiter les choix possibles en fonction de la réponse à la question 1 ce qui ramènerait le nombre des choix possibles à 4 provinces pour la région sélectionnée.

j'ai pensé à une méthode qui me semble un peu tirée par les cheveux: créer 15 questions "province" liées chacune à une condition de réponse à la question "région".

existe-t-il un moyen plus "élégant" de faire cela?

merci d'avance
The topic has been locked.
  • Nickko
  • Nickko's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
8 years 9 months ago #121760 by Nickko
Peut-être avec les filtres, mais je n'ai jamais fait ça personnellement.
Regarde dans le manuel.

Nickko
Head of ergonomics, UX & UI.
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
8 years 9 months ago - 8 years 9 months ago #121795 by DenisChenu
Je ne connais qu'une solution javascript.

Voir ici : demonstration.sondages.pro/survey/index/...3/newtest/Y/lang/fr#

Je sais plus ou est la doc, pas le temps d'en faire une clean. Un peu d'infos dans demonstration.sondages.pro/upload/templa...nade/selectfilter.js

Regarde aussi sur les workarounds dans le manuel.

Denis

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.
Last edit: 8 years 9 months ago by DenisChenu.
The topic has been locked.
More
8 years 9 months ago - 8 years 9 months ago #121808 by walid
Merci.
malheureusement je ne maîtrise pas le javascript. :(
Last edit: 8 years 9 months ago by walid.
The topic has been locked.
More
8 years 7 months ago #122979 by alexdp
Bonjour à toutes et à tous,

Après plusieurs tentatives infructueuses d'implantation de l'élégante solution proposée par M. Denis Chenu, j'en appel à vous pour m'aider à limiter l'affichage d'une liste déroulante en tenant compte de la réponse à une question précédente. La documentation disponible est éparse et les instructions sont hors de portée pour un 'méga nul' comme moi. M. Chenu précise, avec raison d'ailleurs, qu'il n'a pas de temps à mettre pour mettre en place la documentation. Si on m'aide à résoudre mon problème, je m'engage à produire un petit tuto, très explicite, qui règlera le problème une fois pour toute. Voilà pour le préambule. Passons à mon problème.

Ce que j'ai en main :
  1. Le paramétrage correct du questionnaire afin que le javascript puisse s'exécuter : Paramètres généraux - Sécurité - Filter HTML for XSS = NON
  2. L'excellent javascript nommé selectfilter.js fourni par M. Chenu (License libre sous MIT) qui y a programmé la fonction : selectFilterByCode(qID,filterqID)
  3. Une question (Question 1) avec menu déroulant. La réponse à cette question source servira d'élément de filtre pour la la prochaine question (Question 2). Le code des choix est A, B, C, D...
  4. Une question (Question 2) avec menu déroulant dont l'affichage des choix est réglé en fonction de la réponse à la question 1. Le code des choix est A01, A02, B01, B02, B03, C01 ..
  5. Un petit javascript qui, placé dans la question 2, invoque la fonction selectFilterByCode(qID,filterqID)
  6. Un peu d'information qui indique où mettre le javascript, où mettre le petit code qui invoque la fonction

Mes deux principaux problèmes sont : où placer le javascript qui contient la fonction et surtout quels sont les arguments à mettre dans la fonction appelante ?

Pour l'endroit où mettre le javascript, on parle de template.js
Après avoir fait une recherche dans le répertoire limesurvey de mon serveur Centos, j'ai trouvé autant de template.js qu'il y a de modèles. Quoi qu'il en soit, j'aimerais intégrer la fonction dans le script qui l'appelle comme ceci :

Choisissez un élément.
<script type="text/javascript" charset="utf-8">
/*
Copyright 2012 Denis Chenu for < www.sondages.pro >
...
function selectFilterByCode(qID,filterqID){
$(document).ready(function(){
var idSelectFilter = $("#question"+qID).find("select").attr('id');
$("#"+idSelectFilter).hide();
var idSelectFiltering = $("#question"+filterqID).find("select").attr('id');
if(typeof idSelectFilter === 'undefined' || typeof idSelectFiltering === 'undefined' )
{
return false;
}
else
{
var idNewSelectFilter = 'select'+qID
var NewSelectElement = "<select id='"+idNewSelectFilter+"'><option value=''>"+$("#"+idSelectFilter+" option[value='']:first").text()+"</option></select>";
$("#"+idSelectFilter).after(NewSelectElement);
//$("#"+idNewSelectFilter).width($("#"+idSelectFilter).width());
$("#"+idSelectFiltering).change(function(){
$('#'+idSelectFilter).val('');
$('#'+idSelectFilter).trigger('change');
$('#'+idNewSelectFilter).val('');
var valuefilter=$(this).val();
$('#'+idNewSelectFilter+' option').not(':first').remove();
$('#'+idSelectFilter+' option').each(function(){
if($(this).attr('value').indexOf(valuefilter)==0){
$(this).clone().appendTo('#'+idNewSelectFilter);
}
});
});

$("#"+idNewSelectFilter).change(function(){
$('#'+idSelectFilter).val($(this).val());
$('#'+idSelectFilter).trigger('change');
});

if($("#"+idSelectFiltering).val()!=''){
var valuefilter=$("#"+idSelectFiltering).val();
$('#'+idSelectFilter+' option').each(function(){
if($(this).attr('value').indexOf(valuefilter)==0){
$(this).clone().appendTo('#'+idNewSelectFilter);
}
});
if($("#"+idSelectFilter).val()!=''){
$('#'+idNewSelectFilter).val($("#"+idSelectFilter).val());
}
}
}
});
}
selectFilterByCode([QID 2],[QID 1]);
</script>


Pour les arguments à préciser dans la fonction selectFilterByCode(qID,filterqID) soit qID et filterqID, je ne parviens pas à déterminer ce que je dois écrire. Dans un démo fourni par M. Chenu j'ai trouvé
"
Choisissez plus précisément
<script type="text/javascript" charset="utf-8">
selectFilterByCode(7073,7072);
</script>
"
Mais d'où viennent ces deux nombres dans le sondage ?
Que dois-je préciser comme arguments ?

Dans les remarques fournies dans le fichier selectfilter.js il y a :
/* Function to filter a select by another select
In the same page
var qID : the number of question to filter
var filterqID : the number of question filtering
*/

Si je traduis "the number of question to filter" j'obtiens "le numéro de la question à filter". J'imagine qu'il s'agit de la Question 2. Dans mon test, le numéro de la question 2 est Q-1. En passant il aurait peut-être été mieux d'écrire question number to filter
Si je traduis "the number of question filtering" j'obtiens "le numéro de la question qui filtre". J'imagine qu'il s'agit de la Question 1. Dans mon test, le numéro de la question 1 est Q-0. Il aurait peut-être été plus approprié d'écrire
filtering question number

J'ai donc écris : selectFilterByCode(Q-1,Q-0)
Malheureusement, ça ne fonctionne pas; ni même si j'inverse les arguments (Q-0,Q1)

Voici un exemple concret de ce que j'aimerais obtenir :

Fichier de logique pour le Questionnaire #[123953]: Test
# Nom [ID] Filtre conditionnel [Validation] (Valeur par défaut) Texte [Aide] (Astuce)
G-0 Groupe Test
[GID 1] 1
Q-0 *questionsource
[QID 1]
Liste (Menu déroulant) [!] 1 Choisissez une catégorie
Attribut de la question Valeur

A[0]-1 A [VALUE: 0] Race de chiens
A[0]-2 B [VALUE: 0] Continents
A[0]-3 C [VALUE: 0] Arc-en-ciel


Q-1 questioncible
[QID 2]
Liste (Menu déroulant) [!] 1 Choisissez un élément.
<script>
/*
Copyright 2012 Denis Chenu for
....
function selectFilterByCode(qID,filterqID){
$(document).ready(function(){
.......
}


selectFilterByCode(Q-1,Q-0);
</script>
Attribut de la question Valeur
statistics_showgraph 1
A[0]-1 A01 [VALUE: 0] Airedale
A[0]-2 A02 [VALUE: 0] Boxer
A[0]-3 A03 [VALUE: 0] Caniche
A[0]-4 A04 [VALUE: 0] Doberman
A[0]-5 B05 [VALUE: 0] Europe
A[0]-6 B06 [VALUE: 0] Asie
A[0]-7 B07 [VALUE: 0] Afrique
A[0]-8 B08 [VALUE: 0] Amérique
A[0]-9 B09 [VALUE: 0] Océanie
A[0]-10 C10 [VALUE: 0] Bleu
A[0]-11 C11 [VALUE: 0] Indigo
A[0]-12 C12 [VALUE: 0] Orange
A[0]-13 C13 [VALUE: 0] Rouge

Merci et au plaisir de lire vos réponses.

Alexdp
The topic has been locked.
Moderators: Nickko

Lime-years ahead

Online-surveys for every purse and purpose