Page 1 sur 1

pagination + filtre

Posté : 13 févr. 2007, 13:28
par Invité
Bonjour à tous!

Je reviens vers vous avec un nouveau problème.
J'ai fait une page annuaire sur les campings dont les enregistrements sont récupérés depuis une base de données.
Ayant environ 18 enregistrements, j'ai décidé de n'en afficher que 8 par pages et de mettre en place un système de pagination pour aller sur les autres pages.
Jusque là aucun souci!!
Je laisse à la disposition du futur visiteur de pouvoir filtrer les enregistrements par ville et par nombre d'étoile.
Ayant par exemple une dizaine de camping appartenant à la même ville, une fois le filtre de cette ville activé, il faut encore que l'on puisse aller à la page suivante pour visionner les 4 autres campings de cette ville.

Et c'est là que mon problème intervient!!
En effet, je choisi de filtrer les 18 campings en prenant la ville "trucville" qui contient 12 résultats à elle seule.
Je visionne donc 8 résultats pour le filtre "trucville" sur la premiere page et j'ai donc la possibilité de faire "suivant" pour voir les 4 derniers résultats pour cette ville.
Au lieu d'afficher les 4 derniers résultats en appuyant sur "suivant" il me réaffiche la page suivante comme si aucun filtre n'avait été pris en compte cad avec les 18 enregistrements.
D'ailleurs la selection "trucville" dans ma liste de choix par ville disparait et redevient "afficher toutes les villes".
Comment faire pour qu'une fois un filtre activé, que ce soit une ville ou un nombre d'étoile, et si plusieurs pages sont disponibles, la pagination concerne bien les résultats du filtre.
De plus, si je réalise un filtre pour une ville qui ne contient que 2 résultats, on me propose aussi de faire "suivant", preuve que ce dernier ne concernerait que la pagination pour les 18 enregistrements indépendamment des filtres.
Je vous transmet le code de ma pagination:
if (isset($_GET['totalRows_rs_camping'])) {
  $totalRows_rs_camping = $_GET['totalRows_rs_camping'];
} else {
  $all_rs_camping = mysql_query($query_rs_camping);
  $totalRows_rs_camping = mysql_num_rows($all_rs_camping);
}
$totalPages_rs_camping = ceil($totalRows_rs_camping/$maxRows_rs_camping)-1;

$queryString_rs_camping = "";
if (!empty($_SERVER['QUERY_STRING'])) {
  $params = explode("&", $_SERVER['QUERY_STRING']);
  $newParams = array();
  foreach ($params as $param) {
    if (stristr($param, "pageNum_rs_camping") == false && 
        stristr($param, "totalRows_rs_camping") == false) {
      array_push($newParams, $param);
    }
  }
  if (count($newParams) != 0) {
    $queryString_rs_camping = "&" . htmlentities(implode("&", $newParams));
  }
}
$queryString_rs_camping = sprintf("&totalRows_rs_camping=%d%s", $totalRows_rs_camping, $queryString_rs_camping);
et le code au niveau des boutons "suivant" "précédent" et autres (généré par dreamweaver8 car je débute en php):
<table border="0" width="50%" align="center">
            <tr>
              <td width="23%" align="center"><?php if ($pageNum_rs_camping > 0) { // Show if not first page ?>
                    <a href="<?php printf("%s?pageNum_rs_camping=%d%s", $currentPage, 0, $queryString_rs_camping); ?>">Premier</a>
                    <?php } // Show if not first page ?>              </td>
              <td width="31%" align="center"><?php if ($pageNum_rs_camping > 0) { // Show if not first page ?>
                    <a href="<?php printf("%s?pageNum_rs_camping=%d%s", $currentPage, max(0, $pageNum_rs_camping - 1), $queryString_rs_camping); ?>">Précédent</a>
                    <?php } // Show if not first page ?>              </td>
              <td width="23%" align="center"><?php if ($pageNum_rs_camping < $totalPages_rs_camping) { // Show if not last page ?>
                    <a href="<?php printf("%s?pageNum_rs_camping=%d%s", $currentPage, min($totalPages_rs_camping, $pageNum_rs_camping + 1), $queryString_rs_camping); ?>">Suivant</a>
                    <?php } // Show if not last page ?>              </td>
              <td width="23%" align="center"><?php if ($pageNum_rs_camping < $totalPages_rs_camping) { // Show if not last page ?>
                    <a href="<?php printf("%s?pageNum_rs_camping=%d%s", $currentPage, $totalPages_rs_camping, $queryString_rs_camping); ?>">Dernier</a>
                    <?php } // Show if not last page ?>              </td>
            </tr>
          </table>
Ma grande question est donc la suivante: Comment faire pour que la pagination prenne en compte l'utilisation des filtres.
Est-ce que cela passerait par des conditions if...else!
Si quelqu'un a une solution ou des pistes de réflexion à me soumettre. Merci d'avance pour toute aide apportée

Posté : 13 févr. 2007, 19:09
par dread
Pour ce qui est de la requête rs_camping, elle se présente comme suit:
mysql_select_db($database_conn_develop, $conn_develop);
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab ORDER BY nom_etab ASC";
$query_limit_rs_camping = sprintf("%s LIMIT %d, %d", $query_rs_camping, $startRow_rs_camping, $maxRows_rs_camping);
$rs_camping = mysql_query($query_limit_rs_camping, $conn_develop) or die(mysql_error());
$row_rs_camping = mysql_fetch_assoc($rs_camping);
elle est ensuite retravaillée en fonction de conditions liées à la possibilité de filtrer les résultats par ville et par étoile:
mysql_select_db($database_conn_develop, $conn_develop);


if (($_POST['ville']) == ''){ $_POST['ville'] = 'toutes';}
if (($_POST['etoile']) == ''){ $_POST['etoile'] = 'toutes';}

if ((($_POST['ville'])!='toutes') && (($_POST['etoile'])=='toutes')){
	$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."' ORDER BY nom_etab ASC";
}
else{
	if ((($_POST['etoile'])!='toutes') && (($_POST['ville'])=='toutes')){
		$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND nb_etoile_camping='".$_POST['etoile']."' ORDER BY nom_etab ASC";
	}
	else{
		if (($_POST['ville']=='toutes') && ($_POST['etoile']=='toutes')){
			$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab ORDER BY nom_etab ASC";
		}
		else{
			$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."' AND nb_etoile_camping='".$_POST['etoile']."' ORDER BY nom_etab ASC";
		}
	}
}

J'ai pensé qu'il fallait mieux que je la mette pour essayer d'y voir plus clair.