par
Kaoteknik » 01 janv. 2008, 13:22
S'il s'agit de générer un affichage multipage, je te recommande de lire ce sujet qui devrait t'aider :
http://www.phpfrance.com/forums/voir_sujet-8874.php
Edit : Pour aller plus loin j'ai récemment repris le code de Cyrano pour le réadapter en y adjoignant un formulaire de tri, le tout organisé sous forme de classes d'objets. Etant donné que je débute en POO mes scripts sont susceptibles d'être améliorés en de nombreux points, mais en l'état ça fonctionne néanmoins.
Pour commencer j'ai une classe "class_form_tri.php" qui génère un formulaire de tri suivant les valeurs passées en argument dans le script "index.php".
<?php
class formulaire_tri {
function form_tri ($param_chxppage, $param_ASCDESC, $param_table, $param_champs) {
// Début du formulaire
echo "<form method=\"GET\" action=\"". $PHP_SELF ."\">";
// Si le paramètre Nombre de Choix est transmis
if (isset($param_chxppage) && !empty($param_chxppage)) {
// Début du menu déroulant correspondant
echo " Nombre de résultats par page : <select name=\"nb_rst\">";
// Pour chaque nombre du tableau $param_nb_choix
foreach ($param_chxppage as $nb) {
// Affichage de l'option correspondante
echo "<option value=\"". $nb ."\">". $nb ."</option>";
}
// Fin du menu déroulant
echo " </select> --- ";
}
// Si le paramètre de tri Ascendant et Descendant existe et qu'il a pour valeur True
if (isset($param_ASCDESC) && $param_ASCDESC == true) {
// Affichage du menu déroulant correspondant
echo " Trier par ordre : <select name=\"opt1\">".
" <option value=\"ASC\">Croissant</option>".
" <option value=\"DESC\">Décroissant</option>".
" </select> ";
}
// Si le nom des champs ou de la table sont transmis
if (isset($param_champs) || isset($param_table)) {
// Si le paramètre de tri ASC/DESC est défini
if (isset($param_ASCDESC) && $param_ASCDESC == true) {
// Affichage du texte " et par "
$text = " et par ";
}
// Sinon
else {
// Affichage du texte "Trier par "
$text = "Trier par ";
}
// Début du menu déroulant
echo $text."<select name=\"opt2\">";
// Si les champs de la table sont transmis en paramètre
if (!empty($param_champs)) {
// On sépare chaque nom de champ et on ajoute des majuscules à la première lettre de chaque mot
$separation = explode (', ', $param_champs);
// Pour chaque élément du tableau $separation
foreach ($separation as $element) {
if ($element == "numéros d'enregistrements"){
$format_elem = "id";
}
else {
$format_elem = $element;
}
// Remplacement du caractère apostrophe (') par un apostrophe suivi d'un caractère d'espacement (' )
$element = str_replace ('\'', '\' ', $element);
// Remplacement de la première lettre de chaque mot par sont équivalent en majuscule
$element = ucwords($element);
// Remplacement du caractère apostrophe suivi d'un caractère d'espacement (' ) par une apostrophe simple (')
$element = str_replace ('\' ', '\'', $element);
// On crée l'option du menu déroulant correspondante
echo " <option value=\"". $format_elem ."\">". $element ."</option>";
}
}
// ... Ou alors si la le nom de la table est transmis en paramètre
elseif (!empty($param_table)) {
// On liste les champs de la table
$requete = "DESCRIBE ". $param_table;
$exec = mysql_query($requete);
while ($result = mysql_fetch_array($exec)) {
// On récupère le contenu de chaque élément du tableau $result avant son traitement
$result_origin = $result['Field'];
// Si la chaîne contient le mot "id" précédé ou suivi de n'importe quel caractère...
if (preg_match('#^[.]*id[.]*$#i', $result['Field'])) {
// ... on la remplace par la chaîne "numéros d'enregistrement"
$result['Field'] = "numéros d'enregistrement";
}
// Remplacement du caractère underscore (_) par un caractère d'espacement
$result['Field'] = str_replace ('_', ' ', $result['Field']);
// Remplacement du caractère apostrophe (') par un apostrophe suivi d'un caractère d'espacement (' )
$result['Field'] = str_replace ('\'', '\' ', $result['Field']);
// Remplacement de la première lettre de chaque mot par sont équivalent en majuscule
$result['Field'] = ucwords ($result['Field']);
// Remplacement du caractère apostrophe suivi d'un caractère d'espacement (' ) par une apostrophe simple (')
$result['Field'] = str_replace ('\' ', '\'', $result['Field']);
// Affichage des options du menu déroulant
echo " <option value=\"". $result_origin ."\">". $result['Field'] ."</option>";
}
}
// Fin du menu déroulant
echo " </select>";
}
// Affichage du bouton de validation et fin du formulaire
echo " <input type=\"submit\" name=\"trier\" value=\"Trier\" />".
"</form>";
}
}
?>
Vient ensuite la classe qui génère l'affichage multipage :
<?php
class multipage {
function multi ($param_table) {
$enregistrements_par_page = isset($_GET['nb_rst']) ? $_GET['nb_rst'] : 10;
$ordASCDESC = isset ($_GET['opt1']) ? $_GET['opt1'] : "DESC";
$elem = isset ($_GET['opt2']) ? $_GET['opt2'] : "id";
$url = $PHP_SELF."?page=";
$page_courante = isset($_GET['page']) ? $_GET['page'] : 0;
$page_affichee = ($page_courante + 1);
$requete1 = "SELECT COUNT(*) FROM ". $param_table;
$exec1 = mysql_query($requete1);
$nb_enregistrements = mysql_result($exec1, 0);
$nb_pages = ceil($nb_enregistrements / $enregistrements_par_page);
if($nb_pages > 0) {
$navigation = "";
if($nb_pages > 1) {
if($page_courante > 0) {
for($i = 0; $i < $page_courante; $i++) {
if (isset ($_GET['nb_rst'])) {
$rst = "&nb_rst=".$_GET['nb_rst'];
$ord1 = "&opt1=".$_GET['opt1'];
$ord2 = "&opt2=".$_GET['opt2'];
}
$p = $i + 1;
$navigation .= "<a href=\"". $url . $i . $rst . $ord1 . $ord2 ."\" title=\"page ". $p ."\">". $p ."</a> | ";
}
}
$navigation .= "<strong>". $page_affichee ."</strong>";
if(($page_affichee) < $nb_pages) {
$nb_suivantes = $nb_pages - ($page_affichee);
for($j = ($page_affichee); $j < $nb_pages; $j++) {
if (isset ($_GET['nb_rst'])) {
$rst = "&nb_rst=".$_GET['nb_rst'];
$ord1 = "&opt1=".$_GET['opt1'];
$ord2 = "&opt2=".$_GET['opt2'];
}
$p = $j + 1;
$navigation .= " | <a href=\"". $url . $j . $rst . $ord1 . $ord2 ."\" title=\"page ". $p ."\">". $p ."</a>";
}
}
$page_affichee = "Page ". $page_affichee ." sur un total de ". $nb_pages ." pages.";
}
else {
$navigation .= "page 1/1";
}
$debut = $page_courante * $enregistrements_par_page;
$requete2 = "SELECT * FROM ". $param_table ." ORDER BY ". $elem . " ". $ordASCDESC ." LIMIT ". $debut .", ". $enregistrements_par_page .";";
$exec2 = mysql_query($requete2);
while($resultat = mysql_fetch_assoc($exec2)) {
echo "<hr />".
"Titre et sous-titre : <strong>".$resultat['champ1']."</strong> (".$resultat['champ2'].")<br />".
"Date et auteur : ".$resultat['champ3']." (".$resultat['champ4'].")<br />".
"Texte : ".$resultat['champ5'];
}
mysql_free_result($exec1);
mysql_free_result($exec2);
mysql_close();
echo "<hr /><p class=\"situation\">".$page_affichee."</p>";
echo "<hr /><p class=\"situation\">".$navigation."</p>";
}
else {
echo "<hr /><h3>Aucune donnée dans la base</h3>";
}
}
}
?>
Et enfin la page d'index qui appelle les deux classes et leur passe les arguments nécessaires à l'affichage :
<?php
require_once ('configbdd.php');
$connexion = mysql_connect(*****, *****, *****) or die(mysql_error());
mysql_select_db(*****, $connexion) or die(mysql_error());
include ("class_form_tri.php");
include ("class_multipage.php");
$chxppage = range(5, 25, 5);
$triASCDESC = true;
$table = "ma_table";
$champs = "champ1, champ2, champ3, champ4, champ5";
$form = new formulaire_tri();
$form->form_tri($chxppage, $triASCDESC, $table, $champs);
$page = new multipage();
$page->multi($table);
echo $form->form_tri;
echo $page->multipage;
?>
Il suffit de changer dans l'index les valeurs des variables $table, $champs, $triASCDESC et $chxppage afin de les adapter à tes besoins.
$chxppage défini le nombre de résultats par page que la classe formulaire_tri génèrera (5 : la valeur de départ, 25 : la valeur d'arrivée, 5 : le pas entre 5 et 25).
$triASCDESC : si la valeur "true" est affectée à cette variable, il sera possible d'éffectuer un tri Ascendant et Descendant sur les champs de la table, sinon, si la valeur false est affectée ou que cette variable n'est pas définie, ce type de tri ne sera pas possible.
$table : indiquer ici le nom de la table à partir de laquelle tu veux effectuer l'affichage multipage et le tri.
$champs : indiquer le nom des champs de la table (en respectant la casse et en séparant chacun d'eux par une virgule suivie d'un espace) à partir desquels le tri s'effectuera.
Voilà, je vais essayer d'optimiser ces scripts, mais j'ai encore bien du chemin à faire...
S'il s'agit de générer un affichage multipage, je te recommande de lire ce sujet qui devrait t'aider :
http://www.phpfrance.com/forums/voir_sujet-8874.php
Edit : Pour aller plus loin j'ai récemment repris le code de Cyrano pour le réadapter en y adjoignant un formulaire de tri, le tout organisé sous forme de classes d'objets. Etant donné que je débute en POO mes scripts sont susceptibles d'être améliorés en de nombreux points, mais en l'état ça fonctionne néanmoins.
Pour commencer j'ai une classe "class_form_tri.php" qui génère un formulaire de tri suivant les valeurs passées en argument dans le script "index.php".
[php]<?php
class formulaire_tri {
function form_tri ($param_chxppage, $param_ASCDESC, $param_table, $param_champs) {
// Début du formulaire
echo "<form method=\"GET\" action=\"". $PHP_SELF ."\">";
// Si le paramètre Nombre de Choix est transmis
if (isset($param_chxppage) && !empty($param_chxppage)) {
// Début du menu déroulant correspondant
echo " Nombre de résultats par page : <select name=\"nb_rst\">";
// Pour chaque nombre du tableau $param_nb_choix
foreach ($param_chxppage as $nb) {
// Affichage de l'option correspondante
echo "<option value=\"". $nb ."\">". $nb ."</option>";
}
// Fin du menu déroulant
echo " </select> --- ";
}
// Si le paramètre de tri Ascendant et Descendant existe et qu'il a pour valeur True
if (isset($param_ASCDESC) && $param_ASCDESC == true) {
// Affichage du menu déroulant correspondant
echo " Trier par ordre : <select name=\"opt1\">".
" <option value=\"ASC\">Croissant</option>".
" <option value=\"DESC\">Décroissant</option>".
" </select> ";
}
// Si le nom des champs ou de la table sont transmis
if (isset($param_champs) || isset($param_table)) {
// Si le paramètre de tri ASC/DESC est défini
if (isset($param_ASCDESC) && $param_ASCDESC == true) {
// Affichage du texte " et par "
$text = " et par ";
}
// Sinon
else {
// Affichage du texte "Trier par "
$text = "Trier par ";
}
// Début du menu déroulant
echo $text."<select name=\"opt2\">";
// Si les champs de la table sont transmis en paramètre
if (!empty($param_champs)) {
// On sépare chaque nom de champ et on ajoute des majuscules à la première lettre de chaque mot
$separation = explode (', ', $param_champs);
// Pour chaque élément du tableau $separation
foreach ($separation as $element) {
if ($element == "numéros d'enregistrements"){
$format_elem = "id";
}
else {
$format_elem = $element;
}
// Remplacement du caractère apostrophe (') par un apostrophe suivi d'un caractère d'espacement (' )
$element = str_replace ('\'', '\' ', $element);
// Remplacement de la première lettre de chaque mot par sont équivalent en majuscule
$element = ucwords($element);
// Remplacement du caractère apostrophe suivi d'un caractère d'espacement (' ) par une apostrophe simple (')
$element = str_replace ('\' ', '\'', $element);
// On crée l'option du menu déroulant correspondante
echo " <option value=\"". $format_elem ."\">". $element ."</option>";
}
}
// ... Ou alors si la le nom de la table est transmis en paramètre
elseif (!empty($param_table)) {
// On liste les champs de la table
$requete = "DESCRIBE ". $param_table;
$exec = mysql_query($requete);
while ($result = mysql_fetch_array($exec)) {
// On récupère le contenu de chaque élément du tableau $result avant son traitement
$result_origin = $result['Field'];
// Si la chaîne contient le mot "id" précédé ou suivi de n'importe quel caractère...
if (preg_match('#^[.]*id[.]*$#i', $result['Field'])) {
// ... on la remplace par la chaîne "numéros d'enregistrement"
$result['Field'] = "numéros d'enregistrement";
}
// Remplacement du caractère underscore (_) par un caractère d'espacement
$result['Field'] = str_replace ('_', ' ', $result['Field']);
// Remplacement du caractère apostrophe (') par un apostrophe suivi d'un caractère d'espacement (' )
$result['Field'] = str_replace ('\'', '\' ', $result['Field']);
// Remplacement de la première lettre de chaque mot par sont équivalent en majuscule
$result['Field'] = ucwords ($result['Field']);
// Remplacement du caractère apostrophe suivi d'un caractère d'espacement (' ) par une apostrophe simple (')
$result['Field'] = str_replace ('\' ', '\'', $result['Field']);
// Affichage des options du menu déroulant
echo " <option value=\"". $result_origin ."\">". $result['Field'] ."</option>";
}
}
// Fin du menu déroulant
echo " </select>";
}
// Affichage du bouton de validation et fin du formulaire
echo " <input type=\"submit\" name=\"trier\" value=\"Trier\" />".
"</form>";
}
}
?>[/php]
Vient ensuite la classe qui génère l'affichage multipage :
[php]<?php
class multipage {
function multi ($param_table) {
$enregistrements_par_page = isset($_GET['nb_rst']) ? $_GET['nb_rst'] : 10;
$ordASCDESC = isset ($_GET['opt1']) ? $_GET['opt1'] : "DESC";
$elem = isset ($_GET['opt2']) ? $_GET['opt2'] : "id";
$url = $PHP_SELF."?page=";
$page_courante = isset($_GET['page']) ? $_GET['page'] : 0;
$page_affichee = ($page_courante + 1);
$requete1 = "SELECT COUNT(*) FROM ". $param_table;
$exec1 = mysql_query($requete1);
$nb_enregistrements = mysql_result($exec1, 0);
$nb_pages = ceil($nb_enregistrements / $enregistrements_par_page);
if($nb_pages > 0) {
$navigation = "";
if($nb_pages > 1) {
if($page_courante > 0) {
for($i = 0; $i < $page_courante; $i++) {
if (isset ($_GET['nb_rst'])) {
$rst = "&nb_rst=".$_GET['nb_rst'];
$ord1 = "&opt1=".$_GET['opt1'];
$ord2 = "&opt2=".$_GET['opt2'];
}
$p = $i + 1;
$navigation .= "<a href=\"". $url . $i . $rst . $ord1 . $ord2 ."\" title=\"page ". $p ."\">". $p ."</a> | ";
}
}
$navigation .= "<strong>". $page_affichee ."</strong>";
if(($page_affichee) < $nb_pages) {
$nb_suivantes = $nb_pages - ($page_affichee);
for($j = ($page_affichee); $j < $nb_pages; $j++) {
if (isset ($_GET['nb_rst'])) {
$rst = "&nb_rst=".$_GET['nb_rst'];
$ord1 = "&opt1=".$_GET['opt1'];
$ord2 = "&opt2=".$_GET['opt2'];
}
$p = $j + 1;
$navigation .= " | <a href=\"". $url . $j . $rst . $ord1 . $ord2 ."\" title=\"page ". $p ."\">". $p ."</a>";
}
}
$page_affichee = "Page ". $page_affichee ." sur un total de ". $nb_pages ." pages.";
}
else {
$navigation .= "page 1/1";
}
$debut = $page_courante * $enregistrements_par_page;
$requete2 = "SELECT * FROM ". $param_table ." ORDER BY ". $elem . " ". $ordASCDESC ." LIMIT ". $debut .", ". $enregistrements_par_page .";";
$exec2 = mysql_query($requete2);
while($resultat = mysql_fetch_assoc($exec2)) {
echo "<hr />".
"Titre et sous-titre : <strong>".$resultat['champ1']."</strong> (".$resultat['champ2'].")<br />".
"Date et auteur : ".$resultat['champ3']." (".$resultat['champ4'].")<br />".
"Texte : ".$resultat['champ5'];
}
mysql_free_result($exec1);
mysql_free_result($exec2);
mysql_close();
echo "<hr /><p class=\"situation\">".$page_affichee."</p>";
echo "<hr /><p class=\"situation\">".$navigation."</p>";
}
else {
echo "<hr /><h3>Aucune donnée dans la base</h3>";
}
}
}
?>[/php]
Et enfin la page d'index qui appelle les deux classes et leur passe les arguments nécessaires à l'affichage :
[php]<?php
require_once ('configbdd.php');
$connexion = mysql_connect(*****, *****, *****) or die(mysql_error());
mysql_select_db(*****, $connexion) or die(mysql_error());
include ("class_form_tri.php");
include ("class_multipage.php");
$chxppage = range(5, 25, 5);
$triASCDESC = true;
$table = "ma_table";
$champs = "champ1, champ2, champ3, champ4, champ5";
$form = new formulaire_tri();
$form->form_tri($chxppage, $triASCDESC, $table, $champs);
$page = new multipage();
$page->multi($table);
echo $form->form_tri;
echo $page->multipage;
?>[/php]
Il suffit de changer dans l'index les valeurs des variables $table, $champs, $triASCDESC et $chxppage afin de les adapter à tes besoins.
$chxppage défini le nombre de résultats par page que la classe formulaire_tri génèrera (5 : la valeur de départ, 25 : la valeur d'arrivée, 5 : le pas entre 5 et 25).
$triASCDESC : si la valeur "true" est affectée à cette variable, il sera possible d'éffectuer un tri Ascendant et Descendant sur les champs de la table, sinon, si la valeur false est affectée ou que cette variable n'est pas définie, ce type de tri ne sera pas possible.
$table : indiquer ici le nom de la table à partir de laquelle tu veux effectuer l'affichage multipage et le tri.
$champs : indiquer le nom des champs de la table (en respectant la casse et en séparant chacun d'eux par une virgule suivie d'un espace) à partir desquels le tri s'effectuera.
Voilà, je vais essayer d'optimiser ces scripts, mais j'ai encore bien du chemin à faire...