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 à 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és</option>
</select>
</div>
</form>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é</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é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;
}//////////////////////
// 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é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.