Double filtre en AJAX

VaN
Mammouth du PHP | 1107 Messages

28 mars 2008, 18:03

Bonjour,

je suis en train de mettre en place un système de filtre sur un tableau de résultats extrait d'une base de données.

J'ai deux filtres, que voici :

Code : Tout sélectionner

<form action="" name="formFiltres" method="post"> <div id="itemsPerPage"> Afficher : <select name="itemsDisplayed" onchange="addFiltre('<?php echo $_SESSION['filtre']; ?>', <?php echo $_SESSION['user_id']; ?>, <?php echo $firstItem; ?>, this.value, 'updItems', <?php echo $concoursToDisplayStatut; ?>);"> <option value="10" <?php if($_SESSION['itemsDisplayed'] == 10) echo 'selected="selected"'; ?> >10</option> <option value="20" <?php if($_SESSION['itemsDisplayed'] == 20) echo 'selected="selected"'; ?>>20</option> <option value="50" <?php if($_SESSION['itemsDisplayed'] == 50) echo 'selected="selected"'; ?>>50</option> <option value="100" <?php if($_SESSION['itemsDisplayed'] == 100) echo 'selected="selected"'; ?>>100</option> </select> </div> <div id="filtres"> Filtres : <select name="filtre" id="filtre" onchange="addFiltre(this.value, <?php echo $_SESSION['user_id']; ?>, <?php echo $firstItem; ?>, <?php echo $_SESSION['itemsDisplayed']; ?>, 'updFiltre', <?php echo $concoursToDisplayStatut; ?>);"> <option value="tous">Tous</option> <option value="new">Nouveaux</option> <option value="toDo">Concours &agrave; faire</option> <option value="today">Concours du jour</option> <option value="journalier">Concours journaliers</option> <option value="prioritaire">Concours prioritaires</option> <option value="instantgagnant">Instant gagnant</option> <option value="done">Concours faits</option> <option value="ignored">Concours ignor&eacute;s</option> </select> </div> </form>
Juste avant ces filtres, je crée une variable $_SESSION['filtre'], pour donner une valeur par défaut aux fonctions JS :
if(!isset($_SESSION['filtre']))
	$_SESSION['filtre'] = 'tous';
Indépendemment l'un de l'autre, ils marchent très bien. Le problème survient lorsque je souhaite appliquer un filtre de chaque à la suite, sur ma liste. Lorsque je tente d'appliquer un "double filtre" (un de chaque), il me reprend la valeur 'Tous' du <select id="filtre">, au lieu de prendre en compte le filtre enregistré en $_SESSION, dans mon fichier AJAX (copié plus bas).

Voici la fonction JS qui s'execute au onChange de chaque SELECT :

Code : Tout sélectionner

function addFiltre(filtre, user_id, firstItem, itemsDisplayed, updAction, concoursStatut) { table = creerXHR('ajax.php?ajax=addFiltre&filtre='+ filtre +'&user_id='+ user_id +'&firstItem='+ firstItem +'&itemsDisplayed='+ itemsDisplayed +'&updAction='+ updAction +'&concoursStatut='+ concoursStatut); // document.getElementById('sql').innerHTML = sql; // On recréé le debut et la fin de la table, qu'on va concaténer sur le milieu de la table généré par l'ajax table_start = '<table width="100%" id="sortTable">'; table_start += ' <thead>'; table_start += ' <tr>'; table_start += ' <th width="40">A faire</th>'; table_start += ' <th width="25">Fait</th>'; table_start += ' <th width="40">Ignor&eacute;</th>'; table_start += ' <th>Site</th>'; table_start += ' <th width="80">Date limite</th>'; table_start += ' <th width="100">Type</th>'; table_start += ' <th width="100">Rating</th>'; table_start += ' <td>Lots</td>'; table_start += ' <td>D&eacute;tails</td>'; table_start += ' </tr>'; table_start += ' </thead>'; table_start += ' <tbody>'; table_end = ' </tbody>'; table_end += '</table>'; table = table_start + table + table_end; document.getElementById('list').innerHTML = table; //longueurCible = document.getElementById('list').firstChild.length; //document.getElementById('list').firstChild.replaceData(0, longueurCible, table); pagination = creerXHR('ajax.php?ajax=changePagination&filtre='+ filtre +'&user_id='+ user_id +'&firstItem='+ firstItem +'&itemsDisplayed='+ itemsDisplayed +'&concoursStatut='+ concoursStatut); document.getElementById('pagination').innerHTML = pagination; }
Et le fichier AJAX, qui génère la nouvelle liste :
//////////////////////
// AJAX : addFiltre //
//////////////////////

if(isset($_GET['ajax']) && $_GET['ajax'] == 'addFiltre') {

	$_SESSION['filtre'] = $_GET['filtre'];
	$_SESSION['itemsDisplayed'] = $_GET['itemsDisplayed'];
	
	$itemsPerPage = $_SESSION['itemsDisplayed'];
	$firstItem = $_GET['firstItem'];
	
	// D'abord, on fait un UPDATE sur la TABLE USERS, pour stocker la nouvelle config.
	if($_GET['updAction'] == 'updItems') {
		$sqlConfig = 	"UPDATE ".$prefixe."users
						SET user_itemsDisplayed ='".$itemsPerPage."'
						WHERE user_id = '".$_GET['user_id']."'";
		$queryConfig = mysql_query($sqlConfig) or die(mysql_error());
	}
	
	switch($_GET['filtre']) {
		case 'tous':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					LIMIT ".$firstItem.", ".$itemsPerPage;
			break;
		
		case 'new':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots 
					FROM ".$prefixe."concours
					LEFT JOIN ".$prefixe."assoc ON concours_id = assoc_concours_id
					JOIN ".$prefixe."concours_type ON concours_type = concours_type_id 
					JOIN ".$prefixe."sites ON concours_site_id = site_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND concours_id NOT IN(SELECT DISTINCT assoc_concours_id FROM ".$prefixe."assoc WHERE assoc_user_id = ".$_GET['user_id']." )";
			break;
		
		case 'toDo':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites, ".$prefixe."assoc
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_id = assoc_concours_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND assoc_user_id = '".$_GET['user_id']."'
					AND assoc_statut = 'todo'
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
		
		case 'today':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND (concours_end_date = '".date('Y-m-d 00:00:00')."' OR concours_participation = 2)
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
		
		case 'journalier':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND concours_participation = 2
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
					
		case 'prioritaire':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND concours_rating > 3
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
		
		case 'instantgagnant':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND concours_type = 2 
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
		
		case 'done':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites, ".$prefixe."assoc
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_id = assoc_concours_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND assoc_user_id = '".$_GET['user_id']."'
					AND assoc_statut = 'done'
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
		
		case 'ignored':
			$sql = 	"SELECT concours_id, site_name, concours_end_date, concours_type_title, concours_rating, concours_lots
					FROM ".$prefixe."concours, ".$prefixe."concours_type, ".$prefixe."sites, ".$prefixe."assoc
					WHERE concours_type = concours_type_id
					AND concours_site_id = site_id
					AND concours_id = assoc_concours_id
					AND concours_activated = '".$_GET['concoursStatut']."'
					AND assoc_user_id = '".$_GET['user_id']."'
					AND assoc_statut = 'ignored'
					LIMIT ".$firstItem.", ".$itemsPerPage; 
			break;
	}
	$query = mysql_query($sql) or die(mysql_error());
	// Si il y'a des données à extraire sur ce filtre, on créé la table
	if(mysql_num_rows($query) > 0) {
		$table = '';
		while($result = mysql_fetch_assoc($query)) {
		
			$table .= '<tr><td>';
			
			$sqlAssoc = "SELECT assoc_statut 
						FROM ".$prefixe."assoc 
						WHERE assoc_user_id = '".$_GET['user_id']."' 
						AND assoc_concours_id = '".$result['concours_id']."'";
			$queryAssoc = mysql_query($sqlAssoc) or die(mysql_error());
			$resultAssoc = mysql_fetch_assoc($queryAssoc);
			  
			// on regarde si la checkbox TODO doit etre cochée ou pas
			if($resultAssoc['assoc_statut'] == 'todo')
				$checked = 'checked="checked"';
			else
				$checked = '';
		
			$table .= '<input type="radio" name="'.$result['concours_id'].'" '.$checked.' 
			onchange="checkBox('.$_GET['user_id'].', '.$result['concours_id'].', \'todo\');" /></td><td>';
			
			// on regarde si la checkbox DONE doit etre cochée ou pas
			if($resultAssoc['assoc_statut'] == 'done')
				$checked = 'checked="checked"';
			else
				$checked = '';
		
			$table .= '<input type="radio" name="'.$result['concours_id'].'" '.$checked.' 
			onchange="checkBox('.$_GET['user_id'].', '.$result['concours_id'].', \'done\');" /></td><td>';
		
			// on regarde si la checkbox IGNORED doit etre cochée ou pas
			if($resultAssoc['assoc_statut'] == 'ignored')
				$checked = 'checked="checked"';
			else
				$checked = '';	
				
			$table .= '<input type="radio" name="'.$result['concours_id'].'" '.$checked.'
			onchange="checkBox('.$_GET['user_id'].', '.$result['concours_id'].', \'ignored\');" /></td>
			<td onclick="document.location.href=\'index.php?p=concours&id='.$result['concours_id'].'\';">'.$result['site_name'].'</td>
			<td onclick="document.location.href=\'index.php?p=concours&id='.$result['concours_id'].'\';">'.changeDate($result['concours_end_date'], 'sql2fr').'</td>
			<td onclick="document.location.href=\'index.php?p=concours&id='.$result['concours_id'].'\';">'.$result['concours_type_title'].'</td>
			<td onclick="document.location.href=\'index.php?p=concours&id='.$result['concours_id'].'\';">';
		
			for ($i = 0; $i < $result['concours_rating']; $i++) {
				$table .= '<img src="img/picto_star.gif" alt="Note" style="margin:0px;" />';
			}
			
			$table .= '<td>
          	<img src="img/picto_cadeau.png" alt="Note" style="margin:0px;" 
          	onmouseover="Tip(\''.$result['concours_lots'].'\', TITLE, \'Lots :\', TITLEBGCOLOR, \'#604729\', BORDERCOLOR, \'#604729\', TITLEFONTSIZE, \'14px\', 
          	FADEIN, 500, FADEOUT, 500, PADDING, 5, WIDTH, 300)" 
          	onmouseout="UnTip()" />
          	</td>';
			
			$table .= '<td onclick="document.location.href=\'index.php?p=concours&id='.$result['concours_id'].'\';">
          	<img src="img/picto_details.gif" alt="D&eacute;tails" />
          	</td>';
			
			$table .= '</td></tr>';
			
		}
		$table .='<tr><td colspan="9">'.$_SESSION['filtre'].'</td></tr>';
	}
	// Sinon, on renvoie une table vide
	else
		$table = '';
		
	echo $table;
}
Au début de ce script, je modifie $_SESSION['filtre'], mais j'ai l'impression que c'est la que ça cloche. Vu que la page n'est pas rechargée, est ce que cette modification d'une variable de session n'est pas prise en compte ?

En test, j'ai ajouté
$table .='<tr><td colspan="9">'.$_SESSION['filtre'].'</td></tr>';
sur la fin de la table générée par AJAX, et lorsque j'applique un filtre du SELECT du nombre d'items par page après un filtre du type de concours à afficher, $_SESSION['filtre'] vaut toujours 'tous', au lieu de valoir le nouveau filtre de type de concours.