begin process at 2012 05 27 22:10:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASS DE PAGINATION

CLASS DE PAGINATION


 Information sur la source

Note :
7,8 / 10 - par 5 personnes
7,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :pagination, php5, class, objet, page Niveau :Débutant Date de création :28/12/2006 Date de mise à jour :16/05/2007 14:51:57 Vu :8 389

Auteur : NainPuissant

Ecrire un message privé
Commentaire sur cette source (32)
Ajouter un commentaire et/ou une note

 Description

J'avais déjà fais une source d'une fonction de pagination (http://www.phpcs.com/code.aspx?ID=40509) et donc voilà une Class que j'ai amélioré (enfin j'espère XD) et rajouté quelques petits trucs ici et là.

Source

  • <?php
  • class Pagination
  • {
  • private $nb_datas;
  • private $nb_pages;
  • private $current_page = 1;
  • private $start_offset = 0;
  • private $link;
  • private $next_page;
  • private $previous_page;
  • private $first_page;
  • private $last_page;
  • /**
  • * @var nombre de données sur une seule page
  • * @access private
  • */
  • private $data_per_page = 10;
  • /**
  • * @var nombre de liens s'affichant sur les cotés de la page courante
  • * @access private
  • */
  • private $nb_link_per_page = 5;
  • /**
  • * @var url de la page actuelle
  • * @access private
  • */
  • private $url = '';
  • /**
  • * @var activation de l'url rewriting
  • * @access private
  • */
  • private $url_rewriting = false;
  • /**
  • * @var nom de la variable $_GET
  • * @access private
  • */
  • private $var_page = 'page';
  • /**
  • * @var separateur qui sépare (logique haha...) les liens entre eux
  • * @access private
  • */
  • private $separator = '|';
  • /**
  • * @var nombre d'espace avant le separateur
  • * @access private
  • */
  • private $space_before = 1;
  • /**
  • * @var nombre d'espace après le separateur
  • * @access private
  • */
  • private $space_after = 1;
  • /**
  • * @var options disponibles
  • * @access private
  • */
  • private $options = array(
  • 'nb_datas',
  • 'data_per_page',
  • 'nb_link_per_page',
  • 'url',
  • 'url_rewriting',
  • 'var_page',
  • 'space_before',
  • 'space_after',
  • 'separator'
  • );
  • /**
  • * Constructeur de la class avec en argument les options choisis
  • */
  • public function __construct($options = null)
  • {
  • $this->generateOptions($options);
  • $this->generatePages();
  • $this->generateLink();
  • }
  • /**
  • * Génère les options
  • */
  • private function generateOptions($options)
  • {
  • foreach ($options as $key => $value)
  • {
  • if (in_array($key, $this->options) && !is_null($value))
  • {
  • $this->$key = $value;
  • }
  • }
  • }
  • /**
  • * Génère le nombre de pages, la page courante et le premiers offset
  • */
  • private function generatePages()
  • {
  • $this->nb_pages = ceil($this->nb_datas / $this->data_per_page);
  • $this->current_page = !empty($_GET[$this->var_page]) && is_numeric($_GET[$this->var_page]) && $_GET[$this->var_page] < $this->nb_pages + 1 ? $_GET[$this->var_page] : 1;
  • $this->start_offset = ($this->current_page - 1) * $this->data_per_page;
  • }
  • /**
  • * Génère les liens
  • */
  • private function generateLink()
  • {
  • if ($this->url_rewriting)
  • {
  • $this->link = $this->url;
  • $this->next_page = sprintf($this->url, $this->current_page + 1);
  • $this->previous_page = sprintf($this->url, $this->current_page - 1);
  • $this->first_page = sprintf($this->url, 1);
  • $this->last_page = sprintf($this->url, $this->nb_pages);
  • }
  • else
  • {
  • $this->link = strstr($this->url, '?') ? '&' : '?';
  • $this->link .= $this->var_page . '=';
  • $this->next_page = $this->link . ($this->current_page + 1);
  • $this->previous_page = $this->link . ($this->current_page - 1);
  • $this->first_page = $this->link . 1;
  • $this->last_page = $this->link . $this->nb_pages;
  • }
  • }
  • /**
  • * Retourne le lien de la première page si la page courante est supérieur à 3 et celui de la page précédente
  • *
  • * @return string
  • */
  • public function getFirstLinks()
  • {
  • $display = '';
  • if ($this->current_page != 1)
  • {
  • if ($this->current_page >= 3)
  • {
  • $display .= ' <a href="' . $this->first_page . '"><<</a> ';
  • }
  • $display .= ' <a href="' . $this->previous_page . '" ><</a> ';
  • return $display;
  • }
  • }
  • /**
  • * Retourne le lien de la page suivante et celui de la dernière page si la page courante n'est pas égale au nombre de pages
  • *
  • * @return string
  • */
  • public function getLastLinks()
  • {
  • $display = '';
  • if ($this->current_page != $this->nb_pages)
  • {
  • $display .= ' <a href="' . $this->next_page . '" >></a> ';
  • if ($this->current_page <= $this->nb_pages - 2)
  • {
  • $display .= ' <a href="' . $this->last_page . '">>></a> ';
  • }
  • return $display;
  • }
  • }
  • /**
  • * Retourne la liste des liens avec le séparateur si il n'est pas vide : 0 | 1 | 2 | 3 | 4
  • *
  • * @return string
  • */
  • public function getLinks()
  • {
  • $display = '';
  • for ($i = 1; $i <= $this->nb_pages; $i++)
  • {
  • if ($i - 1 < ($this->current_page + $this->nb_link_per_page) && $i + 1 > ($this->current_page - $this->nb_link_per_page))
  • {
  • if ($i == $this->current_page)
  • {
  • $display .= '<span>' . $i . '</span>';
  • }
  • else
  • {
  • if ($this->url_rewriting)
  • {
  • $url = sprintf($this->link, $i);
  • }
  • else
  • {
  • $url = $this->link . $i;
  • }
  • $display .= '<a href="' . $url . '">' . $i . '</a>';
  • }
  • if ($i != $this->current_page + $this->nb_link_per_page && $i != $this->nb_pages)
  • {
  • for ($j = 0; $j <= $this->space_before; $j++)
  • {
  • $display .= ' ';
  • }
  • $display .= $this->separator;
  • for ($j = 0; $j <= $this->space_after; $j++)
  • {
  • $display .= ' ';
  • }
  • }
  • }
  • }
  • return $display;
  • }
  • public function __get($name)
  • {
  • if (property_exists($this, $name))
  • {
  • return $this->$name;
  • }
  • }
  • public function __set($name, $value)
  • {
  • if (property_exists($this, $name))
  • {
  • $this->$name = $value;
  • }
  • }
  • }
  • ?>
  • <p>Petit exemple :</p>
  • <?php
  • /* Avec un array
  • $datas = array();
  • for ($i = 1; $i <= 10000; $i++)
  • {
  • $datas[] = 'niah_' . $i;
  • }
  • */
  • // Avec une base de donnée
  • $connect = mysql_connect('localhost', 'root', '');
  • mysql_select_db('test', $connect);
  • $query_count = mysql_query('SELECT COUNT(id) AS nb FROM news');
  • $count = mysql_result($query_count, 0);
  • //
  • $options = array(
  • 'nb_datas' => $count, // Avec une base de donnée
  • // 'nb_datas' => count($datas), // Avec un array
  • 'data_per_page' => 20,
  • 'nb_link_per_page' => 10,
  • 'url' => $_SERVER['PHP_SELF'], // Sans url rewriting
  • // 'url' => 'index-%d.html', // Avec url rewriting
  • // 'url_rewriting' => true, // Avec url rewriting
  • 'var_page' => 'p'
  • );
  • $pagination = new Pagination($options);
  • $pagination->separator = '-';
  • /* Avec un array
  • $datas = array_slice($datas, $pagination->start_offset, $pagination->data_per_page);
  • foreach ($datas as $data)
  • {
  • echo $data . '<br />';
  • }
  • */
  • // Avec une base de donnée
  • $query = mysql_query('SELECT id, title, content FROM news LIMIT ' . $pagination->start_offset . ', ' . $pagination->data_per_page);
  • while ($row = mysql_fetch_assoc($query))
  • {
  • echo $row['id'] . '<br />';
  • }
  • //
  • echo '<br />Pages (' . $pagination->nb_pages . ' pages pour ' . $pagination->nb_datas . ' résultats) : ' . $pagination->getFirstLinks() . $pagination->getLinks() . $pagination->getLastLinks();
  • ?>
<?php
class Pagination
{
	private $nb_datas;
	private $nb_pages;
	private $current_page = 1;
	private $start_offset = 0;
	
	private $link;
	private $next_page;
	private $previous_page;
	private $first_page;
	private $last_page;
	
	/**
	 * @var nombre de données sur une seule page
	 * @access private
	 */
	private $data_per_page = 10;

	/**
	 * @var nombre de liens s'affichant sur les cotés de la page courante
	 * @access private
	 */
	private $nb_link_per_page = 5;

	/**
	 * @var url de la page actuelle
	 * @access private
	 */
	private $url = '';

	/**
	 * @var activation de l'url rewriting
	 * @access private
	 */
	private $url_rewriting = false;

	/**
	 * @var nom de la variable $_GET
	 * @access private
	 */
	private $var_page = 'page';

	/**
	 * @var separateur qui sépare (logique haha...) les liens entre eux
	 * @access private
	 */
	private $separator = '|';

	/**
	 * @var nombre d'espace avant le separateur
	 * @access private
	 */
	private $space_before = 1;

	/**
	 * @var nombre d'espace après le separateur
	 * @access private
	 */
	private $space_after = 1;

	/**
	 * @var options disponibles
	 * @access private
	 */
	private $options = array(
		'nb_datas',
		'data_per_page',
		'nb_link_per_page',
		'url',
		'url_rewriting',
		'var_page',
		'space_before',
		'space_after',
		'separator'
	);

	/**
	 * Constructeur de la class avec en argument les options choisis
	 */
	public function __construct($options = null)
	{
		$this->generateOptions($options);
		$this->generatePages();
		$this->generateLink();
	}

	/**
	 * Génère les options
	 */
	private function generateOptions($options)
	{
		foreach ($options as $key => $value)
		{
			if (in_array($key, $this->options) && !is_null($value))
			{
				$this->$key = $value;
			}
		}
	}

	/**
	 * Génère le nombre de pages, la page courante et le premiers offset
	 */
	private function generatePages()
	{
		$this->nb_pages = ceil($this->nb_datas / $this->data_per_page);
		$this->current_page = !empty($_GET[$this->var_page]) && is_numeric($_GET[$this->var_page]) && $_GET[$this->var_page] < $this->nb_pages + 1 ? $_GET[$this->var_page] : 1;
		$this->start_offset = ($this->current_page - 1) * $this->data_per_page;
	}

	/**
	 * Génère les liens
	 */
	private function generateLink()
	{
		if ($this->url_rewriting)
		{
			$this->link = $this->url;

			$this->next_page = sprintf($this->url, $this->current_page + 1);
			$this->previous_page = sprintf($this->url, $this->current_page - 1);
			$this->first_page = sprintf($this->url, 1);
			$this->last_page = sprintf($this->url, $this->nb_pages);
		}
		else
		{
			$this->link = strstr($this->url, '?') ? '&' : '?';
			$this->link .= $this->var_page . '=';

			$this->next_page = $this->link . ($this->current_page + 1);
			$this->previous_page = $this->link . ($this->current_page - 1);
			$this->first_page = $this->link . 1;
			$this->last_page = $this->link . $this->nb_pages;
		}
	}

	/**
	 * Retourne le lien de la première page si la page courante est supérieur à 3 et celui de la page précédente
	 *
	 * @return string
	 */
	public function getFirstLinks()
	{
		$display = '';

		if ($this->current_page != 1)
		{
			if ($this->current_page >= 3)
			{
				$display .= ' <a href="' . $this->first_page . '"><<</a> ';
			}

			$display .= ' <a href="' . $this->previous_page . '" ><</a> ';

			return $display;
		}
	}

	/**
	 * Retourne le lien de la page suivante et celui de la dernière page si la page courante n'est pas égale au nombre de pages
	 *
	 * @return string
	 */
	public function getLastLinks()
	{
		$display = '';

		if ($this->current_page != $this->nb_pages)
		{
			$display .= ' <a href="' . $this->next_page . '" >></a> ';

			if ($this->current_page <= $this->nb_pages - 2)
			{
				$display .= ' <a href="' . $this->last_page . '">>></a> ';
			}

			return $display;
		}
	}

	/**
	 * Retourne la liste des liens avec le séparateur si il n'est pas vide : 0 | 1 | 2 | 3 | 4
	 *
	 * @return string
	 */
	public function getLinks()
	{
		$display = '';

		for ($i = 1; $i <= $this->nb_pages; $i++)
		{
			if ($i - 1 < ($this->current_page + $this->nb_link_per_page) && $i + 1 > ($this->current_page - $this->nb_link_per_page))
			{
				if ($i == $this->current_page)
				{
					$display .= '<span>' . $i . '</span>';
				}
				else
				{
					if ($this->url_rewriting)
					{
						$url = sprintf($this->link, $i);
					}
					else
					{
						$url = $this->link . $i;
					}

					$display .= '<a href="' . $url . '">' . $i . '</a>';
				}

				if ($i != $this->current_page + $this->nb_link_per_page && $i != $this->nb_pages)
				{
					for ($j = 0; $j <= $this->space_before; $j++)
					{
						$display .= ' ';
					}

					$display .= $this->separator;

					for ($j = 0; $j <= $this->space_after; $j++)
					{
						$display .= ' ';
					}
				}
			}
		}

		return $display;
	}

	public function __get($name)
	{
		if (property_exists($this, $name))
		{
			return $this->$name;
		}
	}
	
	public function __set($name, $value)
	{
		if (property_exists($this, $name))
		{
			$this->$name = $value;
		}
	}
}
?>

<p>Petit exemple :</p>

<?php
/* Avec un array
$datas = array();

for ($i = 1; $i <= 10000; $i++)
{
	$datas[] = 'niah_' . $i;
}
*/

// Avec une base de donnée
$connect = mysql_connect('localhost', 'root', '');
mysql_select_db('test', $connect);

$query_count = mysql_query('SELECT COUNT(id) AS nb FROM news');
$count = mysql_result($query_count, 0);
//

$options = array(
	'nb_datas' => $count, // Avec une base de donnée
	// 'nb_datas' => count($datas), // Avec un array
	'data_per_page' => 20,
	'nb_link_per_page' => 10,
	'url' => $_SERVER['PHP_SELF'], // Sans url rewriting
	// 'url' => 'index-%d.html', // Avec url rewriting
	// 'url_rewriting' => true, // Avec url rewriting
	'var_page' => 'p'
);

$pagination = new Pagination($options);
$pagination->separator = '-';

/* Avec un array
$datas = array_slice($datas, $pagination->start_offset, $pagination->data_per_page);

foreach ($datas as $data)
{
	echo $data . '<br />';
}
*/

// Avec une base de donnée
$query = mysql_query('SELECT id, title, content FROM news LIMIT ' . $pagination->start_offset . ', ' . $pagination->data_per_page);

while ($row = mysql_fetch_assoc($query))
{
	echo $row['id'] . '<br />';
}
//

echo '<br />Pages (' . $pagination->nb_pages . ' pages pour ' . $pagination->nb_datas . ' résultats) : ' . $pagination->getFirstLinks() . $pagination->getLinks() . $pagination->getLastLinks();
?>



 Historique

28 décembre 2006 12:32:31 :
Ajout de la documentation ainsi que d'un exemple
28 décembre 2006 14:56:45 :
Rajout de mots clés :p
02 janvier 2007 17:49:41 :
Après avoir lu les commentaires j'ai mis à jour ma source... a vous de me dire si cela vous convient mieux =)
08 février 2007 10:43:22 :
Correction de bugs et mise à jour de l'exemple avec une base de donnée
16 mai 2007 14:51:57 :
Petit bug pour l'url rewriting (les liens suivant, précédent... ne fonctionnaient pas) réglé

 Sources du même auteur

PHP5 - CLASSE DE VÉRIFICATION DE FORMULAIRE SIMPLE
FONCTION DE PAGINATION SIMPLE

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [POO] MENU XHTML HORIZONTAL EXTENSIBLE (MENUEXTENSIBLEX.PHP) par Dariumis
Source avec Zip Source avec une capture [POO] OBJET CONVERTISSANT UN NOMBRE DE SECONDES EN DIFFÉRENT... par Dariumis
CLASS RECHERCHE PHP5 POO par mtrix000
CLASS PAGINATION PHP5 POO par mtrix000
PHP5 - CLASSE DE PAGINATION MODULABLE par FhX

Commentaires et avis

Commentaire de malalam le 28/12/2006 14:43:42 administrateur CS

Merci de remplir les mots clefs!

Commentaire de malalam le 28/12/2006 22:32:25 administrateur CS

Merci :-)

Commentaire de Naixn le 29/12/2006 11:17:29

Juste une petite remarque, mais qui n'a rien de "tu devrais faire comme ça", c'est juste que je dis comment j'aurais vu la chose :

Pour moi, le constructeur n'est pas celui qui doit faire toutes les assignations etc.
Je préfère que le constructeur appelle plusieurs petites fonctions qui feront leur petit truc dans leur coin, mais globalement, le constructeur ne FAIT pas. Il organise et appelle, c'est tout.

Encore une fois, je parle juste de ma façon de voir les choses :)

Commentaire de FhX le 29/12/2006 13:21:49

Hu ?
J'avoue ne pas tout comprendre.

Le constructeur est LA méthode de construction de ton instance.
Si tu fais une délégation de la construction, tu vas te retrouver avec quelque chose comme ca :

public function __construct() {
  $this->x();
  $this->y();
  $this->z();
}
public function x();
public function y();
public function z();

L'intérêt ? Aucune. Sauf si tu comptes appeler x,y ou z plus d'une fois. Autrement, c'est une perte de temps. Tu vas appeler x fonctions alors qu'une seule suffit => le constructeur.

Découper c'est bien, mais regrouper les choses qui ne s'éxécutent que lors de l'instanciation est mieux.

Je vais pas faire :
public function __construct($x) {
  $this->setX($x);
}
private function setX($x) {
$this->x = $x;
}

Ca n'a aucun sens !
Autant faire :
public function __construct($x) {
$this->x = $x;
}
J'ai gagné 3 lignes et un appel de méthode. Multiplie ca par 100 000 par exemple (un gros projet) et tu vois toi même la perte de temps !

Voila :)

Commentaire de malalam le 29/12/2006 13:27:40 administrateur CS

Hello,

d'autant plus qu'un constructeur est censé construire l'objet, selon la sémantique. Donc pour moi aussi ça parait logique d'initialiser les propriétés membres qui doivent l'être dans le constructeur. Et effectivement, pourquoi passer par une méthode tierce alors que l'objet a accès directement à ses propriétés ? (même quand on passe par __set () d'ailleurs : dans l'objet, on ne passe par par __set, me semble t il).
Bref j'avoue être surpris aussi par ta préférence. Mais bon, ça reste une préférence :-)

Commentaire de Naixn le 29/12/2006 13:39:23

Non, c'est sûr que dans ton exemple ...
Mais ça dépend de ta façon de coder.
Moi je dis ça pour deux choses :

1/ Esthétique : Quand tu as différentes parties dans ton __construct, du genre assignation, puis calcul, puis affichage de je sais pas quoi, puis lancement, c'est plus compréhensible quand tu met ça sous forme d'appel de méthodes, parcequ'il te suffit de lire le nom des méthodes appelées pour savoir ce que fait le code, sans lire vraiment l'algo utilisé.
genre :
class Machin
{
  public __construct($files, $nb)
  {
    $this->_sha1 = $this->_calculteMyOwnSHA1($file);
    $this->_pages = $this->_calculateNbPages($file, $nb);
    $this->_initBDD('mysql:host=localhost;dbname=test');
    $this->_launch('script');
  }
}
Perso je trouve ça plus clair que de tout faire dans le __construct... :)

2/ Pratique : dans un sens, ça te permet des fois de faire des méthodes que tu vas réutiliser par la suite. Par exemple, du settings d'options, que tu pourrais réutiliser pour changer les settings en cours de route.

Après, je l'ai bien dis, c'est pas parceque je pense ça qu'il faudrait l'appliquer à ce code. Il est assez simple et n'as pas forcément besoin de clarification. C'est juste une question d'habitude :)

Commentaire de FhX le 29/12/2006 13:51:10

Alors on va faire un petit peu d'optimisation de ta class "Machin" :p

class Machin {
public function __construct($file, $nb) {

  // Calcule le hashage SHA-1 du fichier transmis via $file.
  $this->_sha1 = sha1_file($file);

  // Récupération du nombre totale de page. (à faire dans le constructeur, et seulement par lui *SAUF* si tu comptes rajouter des pages entre temps ! (m'étonnerait m'enfin bon :p) )
  $this->_pages = ceil (...);

  // Initialisation de la bdd.
  $this->_initBDD('...'); // Ca tu ne dois pas AVOIR ! Aucune méthode pour initialiser une base de donnée dans une classe autre qu'une classe faite EXCLUSIVEMENT pour ca !
  // Mauvaise utilisation de l'objet dans ce cas ci !

  // Ne sachant pas ce que ca fait, je laisse.
  $this->_launch('script'); // J'en déduis que ca a une fonction spécial, alors on sait jamais :p

}

}

Un peu de commentaire n'a jamais tué personne. Je t'ai sauvé 2 appels de méthodes, donc au moins 10 lignes de codes en moins :)
Surtout la méthode sha1_file(), pas besoin de la réécrire elle existe déja :)

La clarification, c'est le commentaire ! Pas le nom de la méthode :p

Commentaire de Naixn le 29/12/2006 14:17:57

Raaaa tu me prends au mot XD
Nan bon, je vais essayer d'être clair.

La classe présentée ici n'a rien d'idéale. La méthode _calculteMyOwnSHA1 déjà montre bien que pour une raison X ou Y, j'avais envie de refaire sha1. J'aurais pu mettre : _calculateMyOwnFileHash()... C'eût été plus clair.

Pour les commentaires, je suis d'accord que j'ai oublié de les mettres, mais j'en ai pas mis parceque voilà ! (non mais ho).

Pour la BDD c'était pareil, c'est un exemple qui m'est venu en tête... Genre une méthode qui appele PDO, qui faire des requêtes au préalable (genre stockage de l'IP ou je ne sais quoi), qui récupère par exemple la date de dernière connexion, et puis hop on continue.
Ce n'était pas une méthode de gestion de BDD hein. Suis pas fou non plus ;)
Mais la faute me reviens : je n'ai pas été assez clair du tout. Désolé.

En fait, la raison pour laquelle je code comme ça, c'est que j'aime bien avoir une méthode pour une action. Donc même si le rôle du constructeur est de construire, et il a donc un rôle multiple, je préfère sous-diviser les tâches pour appeler des méthodes qui ont un rôle unique.
C'est tout :)

Commentaire de malalam le 29/12/2006 14:25:00 administrateur CS

Bah pourquoi pas. Disons, si tu as des initialisations qui nécessitent des méthodes, car ce sont de véritables "fonctions" complexes, ok, évidemment.
Mais s'il s'agit de faire :
$this -> maChaine = monTrim ($maChaine);

avec
private function monTrim ($sChaine) {
  return trim ($sChaine);
}

c'est clairement un problème pour l'optimisation.
Mais s'il s'agit de faire appel à une méthode complexe, why not, évidemment.
Et plus encore s'il s'agit d'une initialisation qui peut être réutilisée plus tard.

Je pense que c'est dans le sens de mon exemple que FhX l'entendait.

Commentaire de FhX le 29/12/2006 14:28:33

Oui entre autre :)

Pour moi, la sous-division d'une tache en multiples méthodes de classe revient à dire qu'on utilise ses "sous-taches" plus d'une fois.

Si ca n'est pas le cas, autant le mettre dans le bloc concerné et on en parle plus :)


Une méthode, c'est comme une fonction, ca doit réaliser quelque chose qui soit "générale" au maximum. Mais je comprend ton point de vue, il est vrai que quelques fois, ca rend le code plus lisible. (je le sais, je le fais moi même :p )

Commentaire de Naixn le 29/12/2006 14:31:48

Je vois qu'on est tous d'accord.
Faire une méthode pour un return d'appel d'une fonction, c'est idiot... :)

"Mais je comprend ton point de vue, il est vrai que quelques fois, ca rend le code plus lisible. (je le sais, je le fais moi même :p )"
>> C'est pour ça que je disais qu'ici, ça n'était pas vraiment nécessaire, mais quand j'ai vu la taille du construct, même si raisonnable, ça m'est venu à l'idée, donc bon, j'ai dis. XD

Commentaire de guill76 le 31/12/2006 16:55:04

Salut,
Un tout petit truc qui ne mange pas de pain:
Vu que t'as fait plein de methodes getProp, et par commodités pour leur appel tu pourrais faire un petit truc dans le style:
  
public function __get($name)
{
  $getter='get'.$name;
   if(method_exists($this,$getter))
   {
     return $this->$getter();
   }
}
Tu pourrais récupérer comme ça en lecture plus simplement toutes tes propriétés privés ou protégées en utilisant $property = $this->Prop.
Mais bon c'est du chipotage.

Commentaire de malalam le 01/01/2007 09:22:16 administrateur CS

Là, on en revient à ce qu'on disait...
Pourquoi ne pas renvoyer directement ta propriété dans la méthode __get () ?? Plutôt que d'appeler dans __get () une autre méthode qui elle va renvoyer la propriété...?

Commentaire de guill76 le 01/01/2007 14:36:08

Ouais mais les methodes getFirstlinks() ,getLastlinks et getLinks sont plus spécialisés que les autres, donc dans ce cas ci, Il me semble que cela n'allègerait pas grandement le code. Mais pour les autres ,tu as raison.
et pourquoi pas donc.
public function __get($name)
{
   if (property_exists($this,$name)
   {
     return $this->$name;
   }
   $getter='get'.$name;
   if(method_exists($this,$getter))
   {
     return $this->$getter();
   }
}

Commentaire de xmag le 03/01/2007 10:47:55

Salut,

Très bien cette source mais est-ce qu'elle fonctionne si tu dois passer des paramètres en POST de page en page (par exemple tu as un formulaire de recherche et il y a plusieurs pages de réponses à ta requêtes multicritères)?
(Désolée, je n'ai pas regardé à fond le code, c'est juste une question pour ceux qui recherchent ce genre de pagination ;-))

Commentaire de NainPuissant le 03/01/2007 13:39:15

Salut,

Hmm elle ne fonctionne juste par des paramètres en GET mais je pourrais rajouté les paramètres en POST :)

Ps : j'ai modifié la source sans la tester et apparemment elle ne fonctionne pas et a mon boulot je ne peux pas la déboguer comme on a juste php4 >.< enfin désolé :x

Commentaire de guill76 le 03/01/2007 16:03:47

Il manque des parenthèses fermantes lignes 236 et 247.

Commentaire de NainPuissant le 03/01/2007 16:27:15

Et des ; lignes 213 et 220 >.< enfin je corrigerais ça plus tard

Commentaire de kankrelune le 05/01/2007 17:53:58

En fait ta class ne devrait pas se soucier de l'origine de la variable "page"... page devrait pouvoir provenir de $_GET, $_POST, $_COOKIE ou de toute autre source (variable php, résultat de requete sql, etc)... c'est au developpeur de la passer en paramètre sa récupération ne concerne pas ta classe... d'une part parce que ça n'est pas son boulot d'autre part parce que ça simplifie son utilisation... .. .

@ tchaOo°

Commentaire de nizouille le 05/02/2007 20:10:36

Hello,

Pourriez-vous m'indiquer un exemple d'intégration de votre fonction avec un mysql_query, pcq là je patauge pour l'intégrer à mon site.

Merci de votre aide,

Benjamin

Commentaire de NainPuissant le 08/02/2007 10:44:18

Voilà exemple rajouté :)

Commentaire de seulunami le 17/03/2007 14:18:31

très bon travail NainPuissant

Dans ligne 129,
j'ai eu un problem avec le link ,  mon link ete:
clientes.php?tipo=c

j'ai obtenu seulmente le link "&p=..."

j'ai changé pour:

$this->link = $this->url . ( strpos($this->url, '?') !==false   ? '&amp;' : '?' ) ;  

et travail bien, je ne sais pas porqoui
a bientôt

Commentaire de notestablished le 03/04/2007 02:06:22

moi je viens de trouver cette source...elle m'a tout de suite plus parce que je cherche une class comme celle-ci depuis très longtemps ( j'avais laissé tombé puis je viens de reprendre en fait)

mon problème c'est que la source ne marche par..je suis chez free ( pê est-ce cà ? ) mais dès la ligne 4 il me dit qu'il y a une erreur de syntaxe...

merci de m'aider si vous pouvez ou avez le temps

Commentaire de kankrelune le 03/04/2007 02:32:59

Normal c'est du php 5... .. .

@ tchaOo°

Commentaire de Popop56 le 14/05/2007 20:43:31

J'ai un petit problème avec cette classe. Les liens pour aller à la premier page,la dernière page etc (les liens >, >>, <...) ne fonctionne pas. Il me renvoie à la racine du site. J'ai l'url rewriting activé.

Commentaire de NainPuissant le 16/05/2007 14:52:46

@Popop56
Problème régler cela devrait fonctionné désormais ;)

Commentaire de Popop56 le 16/05/2007 16:40:43

Parfait NainPuissant. Cela marche maintenant parfaitement ! Merci pour ce beau code :)

Commentaire de zeguizmo le 14/10/2007 13:59:56 8/10

Bonne remarque de seulunami, la source comme elle est proposée là ne fonctionne pas en mode url rewriting = false.

La modification qu'il propose fonctionne.

Merci pour ton travail NainPuissant, c'est du bon boulot.

A+

Commentaire de hindioumax le 16/11/2007 14:56:03

Excellente source, c'est exactement ce que je recherchais. En url rewriting = false, j'ai du toutefois apporter quelques modif sur la classe. En url rewriting = false, j'avais les même problème d'url (avec seulement le &p= après mon host)

J'ai ajouté aussi un paramètre d'option pour définir une classe css.
Maintenant ca fonctionne impeccable.

Merci encore :)


Pour ceux que ca interresse voici les modifs que j'ai fait (sans url rewriting activé):

dans la classe 'pagination', en haut dans les déclarations :
[code]
* @var définition de la classe css des liens
* @access private
*/ private $classe_css = '';
/**
* @var options disponibles
* @access private
*/ private $options = array(
'nb_datas',
'data_per_page',
'nb_link_per_page',
'url',
'url_rewriting',
'var_page',
'space_before',
'space_after',
'separator',
'classe_css'
);
[/code]

Les fonctions modifiées qui prenne en compte la variable 'classe_css' + correction URL pour la navigation des pages:
[code]
/**
* Génère les liens
*/ private function generateLink()
{
if ($this->url_rewriting)
{
$this->link = $this->url;
$this->next_page = sprintf($this->url, $this->current_page + 1);
$this->previous_page = sprintf($this->url, $this->current_page - 1);
$this->first_page = sprintf($this->url, 1);
$this->last_page = sprintf($this->url, $this->nb_pages);
}
else
{
$this->link = strstr($this->url, '?') ? '&' : '?';
$this->link .= $this->var_page . '=';
      $this->next_page     = $this->url . $this->link . ($this->current_page + 1);
      $this->previous_page = $this->url . $this->link . ($this->current_page - 1);
$this->first_page    = $this->url . $this->link . 1;
      $this->last_page     = $this->url . $this->link . $this->nb_pages;
}
}
/**
* Retourne le lien de la première page si la page courante est supérieur à 3 et celui de la page précédente
*
* @return string
*/ public function getFirstLinks()
{
$display = '';
if ($this->current_page != 1)
{
if ($this->current_page >= 3)
{
$display .= ' <a class="' . $this->classe_css . '" href="' . $this->first_page . '"><<</a> ';
}
$display .= ' <a class="' . $this->classe_css . '" href="' . $this->previous_page . '"><</a> ';
return $display;
}
}
/**
* Retourne le lien de la page suivante et celui de la dernière page si la page courante n'est pas égale au nombre de pages
*
* @return string
*/ public function getLastLinks()
{
$display = '';
if ($this->current_page != $this->nb_pages)
{
$display .= ' <a  class="' . $this->classe_css . '" href="' . $this->next_page . '">></a> ';
if ($this->current_page <= $this->nb_pages - 2)
{
$display .= ' <a class="' . $this->classe_css . '" href="' . $this->last_page . '">>></a> ';
}
return $display;
}
}
/**
* Retourne la liste des liens avec le séparateur si il n'est pas vide : 0 | 1 | 2 | 3 | 4
*
* @return string
*/ public function getLinks()
{
$display = '';
for ($i = 1; $i <= $this->nb_pages; $i++)
{
if ($i - 1 < ($this->current_page + $this->nb_link_per_page) && $i + 1 > ($this->current_page - $this->nb_link_per_page))
{
if ($i == $this->current_page)
{
$display .= '<span>' . $i . '</span>';
}
else
{
if ($this->url_rewriting)
{
$url = sprintf($this->link, $i);
}
else
{
$url = $this->url . $this->link . $i;
}
$display .= '<a class="' . $this->classe_css . '" href="'. $url . '">' . $i . '</a>';
}
if ($i != $this->current_page + $this->nb_link_per_page && $i != $this->nb_pages)
{
for ($j = 0; $j <= $this->space_before; $j++)
{
$display .= ' ';
}
$display .= $this->separator;
for ($j = 0; $j <= $this->space_after; $j++)
{
$display .= ' ';
}
}
}
}
return $display;
}
[/code]

Construction de l'objet :
[code]
$options = array(
'nb_datas' => $count, // Avec une base de donnée
// 'nb_datas' => count($datas), // Avec un array
'data_per_page' => 1,
'nb_link_per_page' => 10,
'url' => 'index.php?p='.$id_page, // Sans url rewriting
// 'url' => 'index-%d.html', // Avec url rewriting
// 'url_rewriting' => true, // Avec url rewriting
'var_page' => 'display',
'classe_css' => 'pagination'
);

$pagination = new Pagination($options);
$pagination->separator = '-';

// etc ...
[/code]

:)

Commentaire de hindioumax le 23/11/2007 09:06:35

Bon j'ai un petit problème en serveur distant (OVH), la classe ne semble pas fonctionner.
Pourtant en local tout fonctionne à merveille.

Erreur PHP:
"Can't access to private property::$separator..."

Apparement la classe n'arrive pas récuperer les variables d'option.

Une aide ? Je me demande si c'est pas une histoire de version de php ...

:(

Commentaire de _klesk le 29/02/2008 17:22:20

@hindioumax :
Si tu est en php4 c'est foutu pour toi ^^, enfin pas sans modif en tous cas.

@NainPuissant

J'ai voulu essayer le space_besore et space_after mais ça ne marche pas, car il faut mettre
for ($j = 0; $j <= $this->space_before; $j++)
{
  $display .= '&nbsp;';
}

$display .= $this->separator;
for ($j = 0; $j <= $this->space_after; $j++)
{
  $display .= '&nbsp;';
}

car pas défaut il ne prend qu'un espace si on ne lui indique pas le non breakable space, (enfin le navigateur).

voila.

mis à part ça j'ai du aussi modifier de façon à pourvoir utiliser mes variable déjà en $_GET car,
soit :

Ça na pas été gérer

Soit :

J'ai pas vu et/ou compris comment faire.

:)

Commentaire de omelhor le 31/12/2011 12:19:44

bonjour,

Je viens de tomber sur cette classe, et je me demandai comment l'utiliser
Est'il possible d'avoir un exemple d'utilisation de cette classe avec l'url rewriting ?
Je suppose qu'il faut utiliser le .htaccess ?

Merci beaucoup

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Pagination de page... [ par AgentSmith ] Salut à tous,Je souhaiterai avoir quelque indicationpour savoir si il y a une possibilité depaginer des pages avec la sortie de la base de donnée. Exe probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d pagination sur une page php [ par hbib ] salut,je souhaiterai savoir comment faire pour faire une pagination sur une page phpen effet jai un tableau qui affiche differente infos de ma base de transferer une variable d'objet de page en page ?? [ par Arkko ] slt ... j'aimerais savoir si y'a un moyen de transferer une variable d'objet d'une page a un autre ???exemple:1.php:&lt;?MaClasse = new Maclasse;?&gt; Pagination avec PHP/MSAccess [ par le_freeman ] Bonjour,je voulais savoir si certains d'entre vous pourraient me dire comment je pourrais faire un affichage page par page de données récupérées via P Pagination avec nombre de pages [ par sebalex ] Salut &#224; tous,Voil&#224;, j'ai une liste r&#233;sultant d'une recherche. Cette liste se limite &#224; 5 r&#233;sultats par page. A pr&#233;sent, j objet php5 surdéfinition de fonctions [ par poiuytrez3 ] Bonjour, j'ai crée un objet php5 avec plusieurs membres privés. J'ai donc crée une fonction function __get($attribut){ return $this->attribut; } e Objet de page en page la serialization ne suffit pas? [ par dracito ] Bonjour, Nous avons programmé un site dont les scripts php utilisent des objets. Notre server local de test ne rencontre pas d'erreur pour nos scripts pagination d'une longue page html sur plusieurs page [ par amer_ezahir ] salut tout le monde le du ALLHTML svp j'ai besoin que vous m'aider &#224; faire un style ou un code html qui permet d'afficher une longue page HTML su


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales