Un bloc de pagination classe en PHP
Posté : 19 févr. 2008, 19:32
Aujourd'hui je vous propose une petite classe très pratique et très adaptable pour générer des blocs de pagination en HTML.
Imaginons un blog avec 30 messages. Ce serait très pénible pour le visiteur que tous les messages soient affichés sur une même page. On décide donc de n'afficher que 5 messages par page et on va utiliser la classe WdPager pour nous créer notre bloc de pagination :
class WdPager
{
public $add_arrows = true;
public $reverse_arrows = false;
public $separator = '<span class="separator">,</span>';
public $gap = '<span class="gap"> ... </span>';
public $base_url = '?page=';
private $count;
private $limit;
private $on_page;
public function __construct($count, $limit=5, $on_page=0)
{
$this->count = $count;
$this->limit = $limit;
$this->on_page = $on_page;
}
public function getURL($n)
{
return $this->base_url . $n;
}
public function getLink($n, $label=NULL, $class=NULL)
{
$rc = '<a href="' . $this->getURL($n) . '"';
if ($class)
{
$rc .= ' class="' . $class . '"';
}
$rc .= '>';
$rc .= $label ? $label : ($n + 1);
$rc .= '</a>';
return $rc;
}
public function getPosition($n)
{
return '<strong>' . $n . '</strong>';
}
public function __toString()
{
$pages = ceil($this->count / $this->limit);
if ($pages == 1)
{
return;
}
$on_page = $this->on_page + 1;
$rc = NULL;
if ($pages > 10)
{
$init_page_max = min($pages, 3);
for ($i = 1 ; $i < $init_page_max + 1 ; $i++)
{
if ($i == $on_page)
{
$rc .= $this->getPosition($i);
}
else
{
$rc .= $this->getLink($i - 1);
}
if ($i < $init_page_max)
{
$rc .= $this->separator;
}
}
if ($pages > 3)
{
if (($on_page > 1) && ($on_page < $pages))
{
$rc .= ($on_page > 5) ? $this->gap : $this->separator;
$init_page_min = ($on_page > 4) ? $on_page : 5;
$init_page_max = ($on_page < $pages - 4) ? $on_page : $pages - 4;
for ($i = $init_page_min - 1; $i < $init_page_max + 2; $i++)
{
$rc .= ($i == $on_page) ? $this->getPosition($i) : $this->getLink($i - 1);
if ($i < $init_page_max + 1)
{
$rc .= $this->separator;
}
}
$rc .= ($on_page < $pages - 4) ? $this->gap : $this->separator;
}
else
{
$rc .= $this->gap;
}
for($i = $pages - 2 ; $i < $pages + 1 ; $i++)
{
$rc .= ($i == $on_page) ? $this->getPosition($i) : $this->getLink($i - 1);
if ($i < $pages)
{
$rc .= $this->separator;
}
}
}
}
else
{
for ($i = 1 ; $i < $pages + 1 ; $i++)
{
$rc .= ($i == $on_page) ? $this->getPosition($i) : $this->getLink($i - 1);
if ($i < $pages)
{
$rc .= $this->separator;
}
}
}
if ($this->add_arrows)
{
#
# add next (>) link
#
if ($this->reverse_arrows ? ($on_page > 1) : ($on_page < $pages))
{
$rc .= $this->getLink($this->reverse_arrows ? $on_page - 2 : $on_page, '>', 'next');
}
#
# add prev (<) link
#
if ($this->reverse_arrows ? ($on_page < $pages) : ($on_page > 1))
{
$rc = $this->getLink($this->reverse_arrows ? $on_page : $on_page - 2, '<', 'previous') . $rc;
}
}
return $rc;
}
}
ExempleImaginons un blog avec 30 messages. Ce serait très pénible pour le visiteur que tous les messages soient affichés sur une même page. On décide donc de n'afficher que 5 messages par page et on va utiliser la classe WdPager pour nous créer notre bloc de pagination :
$pager = new WdPager(30, 5);
echo $pager
En savoir plus...