5568 sujets

Sémantique web et HTML

Bonjour,

Je suis en train de travailler sur un module billetterie.
Actuellement j'ai un <select> qui me récupère sur une base de données tous les types des billets que je peux vendre.
L'utilisateur n'ayant qu'à choisir parmi la liste proposée.
Ce que je voudrais faire c'est qu'en fonction du type de billet choisi par l'utilisateur on est un champ à remplir ou non.
Par exemple l'utilisateur choisit un billet "Promo", il faut que le champ : "code promo" soit accessible. Si par contre il choisit un billet ordinaire celui doit être "disable".
J'ai pu trouver des informations sur cette idée pour des boutons radio avec la valeur "checked" mais j'ai lu qu'on ne pouvait pas s'en servir pour un <select>.
De plus je remplis mon champ <option> du select via une boucle php :
	while($a=mysql_fetch_object($r))
		{
		$Nom=$a->Nom;
		$Description=$a->Description;
		$Nombre_Place=$a->Nombre_Place;
		echo"	
				<option id='$id' value='$Nom'>$Nom</option>";
		}
		echo"</select>";


Donc je ne peux pas mettre la valeur "checked" directement dans ma ligne <option> si non ils l'auront tous.
Voilà je suis un perdu sur comment appliquer mon idée...
Salut,

si j'ai bien compris voici un exemple (un peu compliqué mais cela permet de le faire fonctionner que le JavaScript soit ou non activé) :
<?php
$types = array(	// j'utilise un array pour l'exemple mais il s'agira en fait d'une boucle while après requête SQL
	'promo'			=>	'Promo',
	'plein_tarif'	=>	'Plein Tarif',
	'vip'			=>	'V.I.P'
);

// Initialisation ou récupération des variables
$type_billet = !empty($_POST['type_billet']) ? trim($_POST['type_billet']) : '';

$erreurs = array();

if($_SERVER['REQUEST_METHOD']=='POST') {
	if(!isset($_POST['resetSelect'])) {	// Si on n'a pas demandé la modification
		// est-ce qu'un code a été soumis ?
		$code_soumis = false;
		//$type_billet = '';
		foreach($types as $cle => $valeur) {
			if(isset($_POST[$cle])) {
				$code_soumis = true;
				$type_billet = $cle;
				break;
			}
		}
	}
	// Si un code a été soumis est-ce qu'il est renseigné ?
	if($code_soumis) {
		$code = trim($_POST[$type_billet]);
		if(!empty($code)) {
			// C'est tout bon : on peut récupérer $type_billet et $code
			echo '<p>Type de Billet : '.$type_billet.'</p>';
			echo '<p>Code : '.$code.'</p>';
			// Traitement
			// header('Location: confirmation.php');
		} else {
			$erreurs[] = 'Le Code est obligatoire.';
		}
	} else { // sinon...
		// type billet obligatoire si on n'a pas demandé la modification
		if(!isset($_POST['resetSelect']) && empty($type_billet)) {
			$erreurs[] = 'Le Type de Billet est obligatoire.';
		}
	}
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>

<style type="text/css" media="screen">
.alerte {
	color: #FF0033;
	font-weight: bold;
}
</style>
</head>
<body>
<?php
if(!empty($erreurs)) {
	foreach($erreurs as $erreur) {
		echo '<p class="alerte">'.$erreur."</p>\n";
	}
}
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
	<p>
		<label for="type_billet">Type de Billet </label>
		<select name="type_billet" id="type_billet"<?php if(!empty($type_billet)) echo ' disabled="disabled"'; ?>>
			<option value="">Sélectionner...</option>
<?php
foreach($types as $cle => $valeur) {
	$selected = ($cle == $type_billet) ? ' selected="selected"' : '';
	echo "\t\t\t".'<option value="'.$cle.'"'.$selected.'>'.$valeur.'</option>'."\n";
}
?>		
		</select>

	</p>
	<div id="codes">
<?php
// on affiche les éléments INPUT correspondant en display:none sauf pour celui sélectionné s'il existe
foreach($types as $cle => $valeur) {
	$visible = ($cle == $type_billet) ? '' : ' style="display:none;"';
	$disabled = ($cle == $type_billet) ? '' : ' disabled="disabled"';
	echo '<p id="'.$cle.'"'.$visible.'>';
?>
		<label for="<?php echo $cle; ?>_input">Code <?php echo $types[$cle]; ?> </label>
		<input type="text" name="<?php echo $cle; ?>" id="<?php echo $cle; ?>_input"<?php echo $disabled; ?> />
	</p>
<?php } ?>
	</div>
	<p>
		<input name="submit" type="submit" />
<?php
// Si on a déjà choisi un type le SELECT est disabled : on permet de le modifier
if(!empty($type_billet)) { ?>
		<input type="submit" name="resetSelect" id="resetSelect" value="Modifier le Type" />
<?php } ?>		
	</p>
</form>
<script type="text/javascript">
	$("#type_billet").attr("disabled", false);
	$("#resetSelect:visible").hide();
	$("#type_billet").change(function () {
		// On désactive tous les INPUT
		$("#codes input").attr("disabled", true);
		// On cache tous les Paragraphes
		$("#codes p:visible").hide();
		$("#type_billet option:selected").each(function () {
			if($(this).val()) {
				oINPUT = document.getElementById($(this).val()+'_input');
				oP = document.getElementById($(this).val());
				$(oINPUT).attr("disabled", false);
				$(oP).show();
			}
		});
	});
</script>
</body>
</html>

Modifié par Heyoan (06 Mar 2010 - 13:29)
Merci Heyoan !!
Effectivement le code est plutôt complexe ...
Pour le moment je me suis penché sur la première partie que je veux modifier.
En fait je récupère mes types de billet dans une base MySQL.
J'ai trouvé ceci pour récupérer dans ma table et fournir les valeurs à la variables $types :*

	$requete1 = mysql_query('SELECT Nom FROM Billets');
	$tableau1 = mysql_fetch_assoc($requete1);
	$types = $tableau1;


Cette méthode marche mais ça ne me prend que la première valeur.
J'ai essayé de faire une boucle mais ça ne marche plus.
J'avais pensé à :

	while( $tableau1 = mysql_fetch_assoc($requete1) )
	{
	$types[$i] = $tableau1;
	$i++;
	}


Mais là ce n'est plus un array. Et j'obtiens comme valeur : array ...
J'ai aussi détecté une modification à faire pour que ça me convienne mais que je n'ai pas encore eu le temps de me préoccuper : tous mes types billets n'ont pas besoin de code promo, hors d'après ce que j'ai vu dans ce code ça l'afficher pour tous les types de billets nan ?

Encore merci pour ton aide Smiley smile