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

Langage PHP Discussion :

Bouton radio dans un sondage


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Giantrick
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    300
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 300
    Par défaut Bouton radio dans un sondage
    Bonjour,

    Voilà, je bloque sur un bout de mon programme pour créer un sondage sur mon site.

    Le principe est le suivant :
    Je propose une liste de réponses (quatre) que l'internaute devra classer par ordre de préférence.

    Mon problème est que je ne sais pas comment faire pour que l'utilisateur ne puisse choisir qu'une réponse par chiffre ou dans l'autre sens, qu'un chiffre par réponse.

    Voici le résultat visuel de mon affichage :

    ceci est la présentation idéale


    Voici ce que mon code ci-dessous permet (ce n'est pas possible de laisser cette solution car on pourrait fausser les résultats.)



    Mon code actuel est le suivant :

    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
     
    //recherche des propositions de réponse
    	$query_affichage3 = "SELECT * FROM formulaire_proposition_reponse WHERE id_formulaire_question='$formulaire_question_id' AND date_fin>'$datejour' ORDER BY hierarchie";								
    	$res_affichage3 = mysql_query($query_affichage3);
    	$var_affichage_count3 = mysql_num_rows($res_affichage3);
    	//affichage d'un tableau pour l'affichage des réponses
    	// la première colonne pour les propositions de réponse et une colonne par nombre de réponse afin de les ordonner
    	echo"<table class='tab_reponse_ordre'><tr><td>&nbsp;</td>";
    	$hr_ordre=0;
    	while($hr_ordre<$var_affichage_count3)
    	{
    	$hr_ordre++;	
    	echo"<td>$hr_ordre</td>";	
    	}
    	$hr_ordre=0;
    	echo"</tr>";
    	while($var_affichage3 = mysql_fetch_array($res_affichage3))
    		{
    $formulaire_proposition_id=$var_affichage3['id_formulaire_proposition_reponse_origine'];
    		$proposition_texte=$var_affichage3['texte'];
    		$hr=$var_affichage3['hierarchie'];
    		//echo"$hr : $formulaire_question_id<br>";
    		$reponse_ordre=$formulaire_proposition_id. "#%#" . $formulaire_question_id;
    		echo"<tr><td>$proposition_texte</td>";
    		while($hr_ordre<$var_affichage_count3)
    			{
    			$hr_ordre++;	
    			echo"<td><input type=radio name='$hr_ordre' value='$reponse_ordre'></td>";	
    			}
    		$hr_ordre=0;	
    		echo"</tr>";	
    		}
    Le problème est que j'ai la possibilité de limiter le choix de l'utilisateur soit par ligne soit par colonne. In fine, je devrais pourvoir faire un mixte des deux pour n'avoir qu'une réponse par ligne et qu'une par colonne.

    Dois je faire appel à de l'ajax, du javascript, du DHTML ou une boucle automatique en PHP ?

    Merci d'avance de votre aide.

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    pas évident comme problème... bon voici où j'en suis arrivé perso (utilisation obligatoire du JavaScript donc bof bof niveau accessibilité :s)

    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
    <?php
    $questions = array("blabla 1", "bibi 2", "bubu 3", "toto 4");
    ?>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="myPoll">
    	<table>
    	<tr><th>QUESTION</th><th>1</th><th>2</th><th>3</th><th>4</th></tr>
    	<?php
    	for ($j = 0; $j < count($questions); $j++) {
    		echo '<tr><td>'.$questions[$j].'</td>';
    		for ($i = 1; $i <= 4; $i++) {
    			echo '<td><input type="radio" name="reponse['.$j.']" value="'.$i.'" onchange="checkPoll(this);"/></td>';
    		}
    		echo '</tr>';
    	}
    	?>
    	<tr><td colspan="5" style="text-align:center;"><input type="submit" /></td></tr>
    	</table>
    </form>
    <script type="text/javascript">
    function checkPoll(elmt) {
    	var myPoll = document.forms['myPoll'];
    	var count = 0;
    	for (var i = 0; i < myPoll.elements.length; i++) {
    		if (myPoll.elements[i].type == 'radio') {
    			if (myPoll.elements[i].value == elmt.value && myPoll.elements[i].checked) {
    				count++;
    			}
    			if (count > 1) {
    				myPoll.elements[i].checked = false;
    			}
    		}
    	}
    }
    </script>

  3. #3
    Membre éclairé Avatar de Giantrick
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    300
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 300
    Par défaut
    Merci darkstar123456,

    C'est vrai que le javascript n'est peut être pas la meilleure solution, mais cela fonctionne...

    J'ai intégrer ton code au mien et cela fonctionne pour la première question avec choix par ordre.

    Mon problème est que j'ai plusieurs questions à réponse par ordre.
    La première question (ceci est une question par ordre 21: ) prend en compte le javascript mais la seconde question (ceci est une question par ordre) n'en tiens plus compte.





    Voici mon 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
     
     
    //recherche des propositions de réponse
    	$query_affichage3 = "SELECT * FROM formulaire_proposition_reponse WHERE id_formulaire_question='$formulaire_question_id' AND date_fin>'$datejour' ORDER BY hierarchie";								
    	$res_affichage3 = mysql_query($query_affichage3);
    	$var_affichage_count3 = mysql_num_rows($res_affichage3);
    	//affichage d'un tableau pour l'affichage des réponses
    	// la première colonne pour les propositions de réponse et une colonne par nombre de réponse afin de les ordonner
    	echo"<table class='tab_reponse_ordre'><tr><td>&nbsp;</td>";
    	$hr_ordre_nb=0;
    	while($hr_ordre_nb<$var_affichage_count3)
    	{
    	$hr_ordre_nb++;	
    	echo"<td class='text_black_12_center'>$hr_ordre_nb</td>";	
    	}
    	$hr_ordre=0;
    	echo"</tr>";
    	?>	
    	<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="myPoll">
    	<?php	
    	while($var_affichage3 = mysql_fetch_array($res_affichage3))
    		{
    		//recherche des questions que l'on va mettre dans un tableau	
    		$formulaire_proposition_id=$var_affichage3['id_formulaire_proposition_reponse_origine'];
    		$proposition_texte=$var_affichage3['texte'];
    		$hr=$var_affichage3['hierarchie'];
    		//echo"$hr : $formulaire_question_id<br>";
    		//$reponse_ordre=$formulaire_proposition_id. "#%#" . $formulaire_question_id;
    		echo"<tr><td class='text_black_12_right'>$proposition_texte</td>";
     
    		while($hr_ordre<$var_affichage_count3)
    			{
    			$hr_ordre++;	
    			echo "<td class='text_black_12_center'><input type='radio' name='reponse[".$hr."]' value='".$hr_ordre."' onchange='checkPoll(this);'/></td>";	
    			}
    		$hr_ordre=0;	
    		echo"</tr>";	
    		}		
    	echo"</form>";
    Je pense que c'est simplement un souci de boucle avec le javascript. Il faut peut être mettre à zéro certaines variables... ??

    Le script "javascript" est en en-tête de page sur le même fichier.

    Merci pour ta réponse.

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Voilà une petite mise à jour du 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
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="myPoll">
    <?php
    $nbQuestions = 3;
    $questions = array("blabla 1", "bibi 2", "bubu 3", "toto 4");
    for($k = 0; $k < $nbQuestions; $k++) {
    ?>
    	<table>
    	<tr><th>QUESTION</th><th>1</th><th>2</th><th>3</th><th>4</th></tr>
    	<?php
    	for ($j = 0; $j < count($questions); $j++) {
    		echo '<tr><td>'.$questions[$j].'</td>';
    		for ($i = 1; $i <= 4; $i++) {
    			echo '<td><input type="radio" name="reponse['.$k.']['.$j.']" value="'.$i.'" onchange="checkPoll(this);"/></td>';
    		}
    		echo '</tr>';
    	}
    	?>
    	<tr><td colspan="5" style="text-align:center;"><input type="submit" /></td></tr>
    	</table>
    <?php
    }
    ?>
    </form>
    <script type="text/javascript">
    function checkPoll(elmt) {
    	var myPoll = document.forms['myPoll'];
    	var count = 0;
    	for (var i = 0; i < myPoll.elements.length; i++) {
    		if (myPoll.elements[i].type == 'radio') {
    			if (myPoll.elements[i].value == elmt.value && myPoll.elements[i].checked) {
    				if (myPoll.elements[i].name.charAt(8) == elmt.name.charAt(8)) {
    					count++;
    				}
    			}
    			if (count > 1) {
    				myPoll.elements[i].checked = false;
    				return;
    			}
    		}
    	}
    }
    </script>
    CHANGEMENTS :
    modification des noms des inputs : reponse[numero_question][numero_proposition]

    Du coup dans le JavaScript, j'ai fait un truc un peu sale : je vérifie le numéro de la question avec un charAt() (je sais pas si on peut faire mieux, j'suis pô très doué en JS).
    De plus, j'ai rajouté un return; dans le cas où j'interdit de check la radiobox car sinon ça remettait à 0 toutes les radios :s

    J'espère que ceci fonctionnera (chez moi ça marche)

  5. #5
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    hmmm j'ai repensé un peu tout ça.... je repars sur la même base, je garde le charAt() pcq je ne connais toujours rien d'autre

    MAIS j'ai modifié pour avoir un comportement qui corresponde beaucoup aux input de type radio !!!

    TADAAAAAM voici le code, ensuite les explications :
    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
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="myPoll">
    <?php
    $nbQuestions = 3;
    $questions = array("blabla 1", "bibi 2", "bubu 3", "toto 4");
    for($k = 0; $k < $nbQuestions; $k++) {
    ?>
    	<table>
    	<tr><th>QUESTION</th><th>1</th><th>2</th><th>3</th><th>4</th></tr>
    	<?php
    	for ($j = 0; $j < count($questions); $j++) {
    		echo '<tr><td>'.$questions[$j].'</td>';
    		for ($i = 1; $i <= 4; $i++) {
    			echo '<td><input type="radio" name="reponse['.$k.']['.$j.']" value="'.$i.'" onchange="checkPoll(this);"/></td>';
    		}
    		echo '</tr>';
    	}
    	?>
    	<tr><td colspan="5" style="text-align:center;"><input type="submit" /></td></tr>
    	</table>
    <?php
    }
    ?>
    </form>
    <script type="text/javascript">
    function checkPoll(elmt) {
    	var myPoll = document.forms['myPoll'];
    	var count = 0;
    	for (var i = 0; i < myPoll.elements.length; i++) {
    		if (myPoll.elements[i].type == 'radio' && myPoll.elements[i].name.charAt(8) == elmt.name.charAt(8)) {
    			if (myPoll.elements[i].value == elmt.value) {
    				myPoll.elements[i].checked = false;
    			}
    			elmt.checked = true;
    		}
    	}
    }
    </script>
    EXPLICATIONS

    Waaah j'suis fier de mwa, même si j'aurais pu y penser plus tot... j'étais vraiment fatigué hier faut m'excuser (bon ok, j'arrête avec ma vie )

    Donc voilà ce qu'il se passe maintenant : plutot que de vérifier si la valeur existe déjà et d'interdire le check, je remet tout à 0 pour la question qui a la valeur (et apres pour être certain, je recoche l'élément clické)

    Ainsi donc, on a le même fonctionnement d'un input type radio normal : le nouveau click prend le dessus sur l'ancien...

    Attention ici, un check d'un bouton peut prendre le dessus sur 2 anciens check au lieu d'un (forcément )


    PS : j'ai préféré faire un nouveau post, ainsi si l'autre code convient mieux, les 2 sont là ^^

  6. #6
    Membre éclairé Avatar de Giantrick
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    300
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 300
    Par défaut
    J'ai testé ton code et il fonctionne nickel.

    Par contre, lorsque je l'insert dans mon code, il ne fonctionne pas en l'état.... je fais de nouveau test ce soir et je reviens pour donner mes derniers commentaires et questions à ce sujet...

    J'ai bien remplacé tes variables k, j et i par les miennes afin de prendre en compte :

    k = le numéro de ma question
    j = le numéro de la proposition de réponse
    i = le numéro d'ordre.

    Juste une question : dans le code JS, pourquoi tu as mis (8) après ton charArt ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (myPoll.elements[i].type == 'radio' && myPoll.elements[i].name.charAt(8) == elmt.name.charAt(8)) {
    Merci encore, mais grâce à toi, c'est sur la bonne voie.... ce n'est qu'une question d'adaptation de ton code à mon programme....

    ps : En attendant de faire mieux, si cela fonctionne c'est ce qui m'importe... de plus, je n'aurais pas trouvé la solution tout seul car, pire que toi, je ne sais pas programmer en JS du tout, juste le comprendre un peu.

    A ce soir

Discussions similaires

  1. [VB.NET] Probleme de bouton radio dans un datagrid
    Par tafamilk dans le forum ASP.NET
    Réponses: 1
    Dernier message: 19/10/2006, 11h55
  2. Alignement boutons radio dans un formulaire en CSS
    Par totijax dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 06/09/2006, 11h02
  3. Comment envoyer la valeur d'un bouton radio dans MySQL
    Par michka999 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 18/08/2006, 19h08
  4. Réponses: 11
    Dernier message: 27/03/2006, 10h25
  5. [C#] Lier des boutons radio dans une application mobile
    Par Loïc56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/04/2005, 14h00

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