Hallo,
habe einen neuen Paginator-Algorithmus (Alpha Version
). Ist noch nicht ausgereift, aber scheint zu funktionieren. Er erstellt abhängig von der aktuellen Seite ($currentPage) und der Gesamtzahl aller Seiten ($pageCount) einen Array mit Seitenzahlen, die darzustellen sind.
Könnte so aussehen:
1 .. 17 18 [19] 20 21 .. 50
currentPage=19, pageCount=50, smartRange=5 (unterstrichen)
Der erste und letzte Wert sind immer Seite 1 bzw. die letzte Seite.
Wenn möglich wird ".." durch die passende Seitenzahl ersetzt, also z.B.
1 2 [3] 4 5 6 7 .. 50
Ungetestet sind andere Werte für smartRange, sollte aber auch so gehen, solang die Zahl ungerade ist!
Die Rendering-Logik fehlt noch, sollte aber das kleinste Problem darstellen.
habe einen neuen Paginator-Algorithmus (Alpha Version
Könnte so aussehen:
1 .. 17 18 [19] 20 21 .. 50
currentPage=19, pageCount=50, smartRange=5 (unterstrichen)
Der erste und letzte Wert sind immer Seite 1 bzw. die letzte Seite.
Wenn möglich wird ".." durch die passende Seitenzahl ersetzt, also z.B.
1 2 [3] 4 5 6 7 .. 50
Ungetestet sind andere Werte für smartRange, sollte aber auch so gehen, solang die Zahl ungerade ist!
PHP-Code:
<?php
class Util_Paginator
{
const DOT_DOT = '..';
protected $_currentPage;
protected $_pageCount;
protected $_smartRange = 5;
public function __construct($pageCount, $currentPage)
{
$this->_pageCount = $pageCount;
$this->_currentPage = $currentPage;
}
public function render()
{
set_time_limit(3);
if ($this->_pageCount <= 1) {
return $this->_renderPages();
}
$pagesToDisplay = $this->_smartRange + 4;
if ($this->_pageCount <= $pagesToDisplay) {
$pages = range(1, $this->_pageCount);
return $this->_renderPages($pages);
}
$maxRange = $this->_smartRange + 4;
$firstPage = max($this->_currentPage - $maxRange, 1);
$lastPage = min($this->_currentPage + $maxRange, $this->_pageCount);
do {
$dropLeft = ($this->_currentPage - $firstPage) > ($lastPage - $this->_currentPage);
if ($dropLeft) {
++$firstPage;
} else {
--$lastPage;
}
$diff = $lastPage - $firstPage;
} while (($diff + 1) > $pagesToDisplay);
$pages = range($firstPage, $lastPage);
$pages[0] = 1;
if ($pages[1] != 2) {
$pages[1] = self::DOT_DOT;
}
if ($pages[$diff - 1] != ($this->_pageCount - 1)) {
$pages[$diff - 1] = self::DOT_DOT;
}
$pages[$diff] = $this->_pageCount;
return $this->_renderPages($pages);
}
protected function _renderPages(array $pages = array())
{
echo '<pre>', print_r($pages, true), '</pre>';
}
protected function _isValidPage($page)
{
return 1 <= $page && $page <= $this->_pageCount;
}
}
?>

Kommentar