======[PHP] List Navigatior====== ---- {{image class="left" url="images/icons/48/gtk-go-back-rtl.png"}} =====Ausgangslage===== Immer wieder hat man grössere Mengen Daten die auf verschiedene Seiten aufgeteilt werden sollten. Als Beispeil: Wir haben 55 Termine und wollen auf jeder Seite nur 10 Termine sehen. Dazu wollen wir ein ein Navigationsreiter mit den Seitenzahelen, vor und Zurück etc. haben. ---- {{image class="left" url="images/icons/48/application-x-php.png"}} =====Navigation über DB-Daten===== ====Kleines Testspiel==== setPageNr($actPageNr); //Zu Testzwecken geb ich mal das generierte SQL aus, im normalfall kann man damit die Daten abrufen echo $myNav->getActSql(); echo "
"; //Aufbau der Navigation //Erste/Vorhergehende Seite -Links einfügen if(!$myNav->bof()){ $navEntries[] = "<<"; $navEntries[] = "<"; } //Pro Seite einen Link einfügen foreach($myNav->getPageNumbers() as $nr){ if($nr == $actPageNr){ $navEntries[] = "{$nr}"; }else{ $navEntries[] = "{$nr}"; } } //Nächste/Letzte Seite -Links einfügen if(!$myNav->eof()){ $navEntries[] = ">"; $navEntries[] = ">>"; } //Alle Links mit ' | ' getrennt ausgeben echo implode(' | ', $navEntries); ?>
====ListNavigatior==== sql = $sql; $this->itemsPerPage = $itemsPerPage; //Anzahl Datensätze ermitteln $sql = "SELECT COUNT(*) AS count_items FROM ({$this->sql}) AS data_for_count"; $result = mysql_query($sql); $countItems = mysql_result($result, 0, 0); mysql_free_result($result); //Die Seiten definieren-> array([pageNr] => [LIMIT-Start der DB]) $this->pages = range(0, $countItems-1, $this->itemsPerPage); $this->index = array_keys($this->pages); } /** * Die aktuelle Seitennummer setzen * @param $pageNr Integer */ public function setPageNr($pageNr){ $this->actPageNr = $pageNr; } /** * Ein SQL ausgeben mit dem man die Daten abrufen kann * @retrun String SQL-Statement */ public function getActSql(){ return "{$this->sql} LIMIT {$this->pages[$this->actPageNr]}, {$this->itemsPerPage}"; } /** * @return Array Gibt ein Array mit allen Seitennummern aus */ public function getPageNumbers(){ return $this->index; } /** * Begin of File * @param $pageNr Integer Optional: zu prüfende Nr * @return Boolean Gibt an ob der Zeiger auf dem ersten Element steht */ public function bof($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return $pageNr <= $this->getFirstNr(); } /** * End of File * @param $pageNr Integer Optional: zu prüfende Nr * @return Boolean Gibt an ob der Zeiger auf dem letzten Element steht */ public function eof($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return $pageNr >= $this->getLastNr(); } /** * @return Integer Erste Seitennummer */ public function getFirstNr(){ return reset($this->index); } /** * @return Integer Letzte Seitennummer */ public function getLastNr(){ return end($this->index); } /** * @return Integer Nächste Seitennummer (false falls wir bereits am Ende sind) */ public function getNextNr($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return ($this->eof($pageNr)) ? false : $pageNr+1; } /** * @return Integer Vorhergehende Seitennummer (false falls wir bereits am Anfang sind) */ public function getPrevNr($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return ($this->bof($pageNr)) ? false : $pageNr-1; } } ?> ---- {{image class="left" url="images/icons/48/application-x-php.png"}} =====Navigation über Array===== ====Kleines Testspiel==== array('id' => 1, 'name' => 'Item 1'), 111 => array('id' => 2, 'name' => 'Item 2'), 2 => array('id' => 3, 'name' => 'Item 3'), array('id' => 4, 'name' => 'Item 4'), array('id' => 5, 'name' => 'Item 5'), array('id' => 6, 'name' => 'Item 6'), array('id' => 7, 'name' => 'Item 7'), array('id' => 8, 'name' => 'Item 8'), array('id' => 9, 'name' => 'Item 9'), array('id' => 10, 'name' => 'Item 10') ); //Aktuelle Seitennummer aus dem $_GET auslesen $actPageNr = ($_GET['nr']) ? $_GET['nr'] : 0; $myNav = new ArrayNavigator($array, 4); //Aktuelle Seite setzen $myNav->setPageNr($actPageNr); //Zu Testzwecken geb ich mal das generierte SQL aus, im normalfall kann man damit die Daten abrufen foreach($myNav->getArrayOfActualPage() as $index => $item){ echo "{$index} -> {$item['id']}: {$item['name']}
\n"; } echo "
"; //Aufbau der Navigation //Erste/Vorhergehende Seite -Links einfügen if(!$myNav->bof()){ $navEntries[] = "<<"; $navEntries[] = "<"; } //Pro Seite einen Link einfügen foreach($myNav->getPageNumbers() as $nr){ if($nr == $actPageNr){ $navEntries[] = "{$nr}"; }else{ $navEntries[] = "{$nr}"; } } //Nächste/Letzte Seite -Links einfügen if(!$myNav->eof()){ $navEntries[] = ">"; $navEntries[] = ">>"; } //Alle Links mit ' | ' getrennt ausgeben echo implode(' | ', $navEntries); ?>
====ArrayNavigator==== array = $array; $this->itemsPerPage = $itemsPerPage; //Anzahl Datensätze ermitteln $countItems = count($array); //Die Seiten definieren-> array([pageNr] => [LIMIT-Start der DB]) $this->pages = range(0, $countItems-1, $this->itemsPerPage); $this->index = array_keys($this->pages); } /** * Gibt den Teil des Arrays aus, der der aktuellen Seite entspricht * @param $pageNr Integer * @return Array */ public function getArrayOfActualPage($pageNr = false){ //Falls eine Seitennummer mitgegeben wird, zu dieser springen if($pageNr !== false) $this->setPageNr($pageNr); //Subarray aus dem Array extrahieren return array_slice($this->array, $this->pages[$this->actPageNr], $this->itemsPerPage, true); } /** * Die aktuelle Seitennummer setzen * @param $pageNr Integer */ public function setPageNr($pageNr){ $this->actPageNr = $pageNr; } /** * @return Array Gibt ein Array mit allen Seitennummern aus */ public function getPageNumbers(){ return $this->index; } /** * Begin of File * @param $pageNr Integer Optional: zu prüfende Nr * @return Boolean Gibt an ob der Zeiger auf dem ersten Element steht */ public function bof($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return $pageNr <= $this->getFirstNr(); } /** * End of File * @param $pageNr Integer Optional: zu prüfende Nr * @return Boolean Gibt an ob der Zeiger auf dem letzten Element steht */ public function eof($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return $pageNr >= $this->getLastNr(); } /** * @return Integer Erste Seitennummer */ public function getFirstNr(){ return reset($this->index); } /** * @return Integer Letzte Seitennummer */ public function getLastNr(){ return end($this->index); } /** * @return Integer Nächste Seitennummer (false falls wir bereits am Ende sind) */ public function getNextNr($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return ($this->eof($pageNr)) ? false : $pageNr+1; } /** * @return Integer Vorhergehende Seitennummer (false falls wir bereits am Anfang sind) */ public function getPrevNr($pageNr = false){ if(!$pageNr) $pageNr = $this->actPageNr; return ($this->bof($pageNr)) ? false : $pageNr-1; } } ?> ---- {{image class="left" alt="ico" url="images/icons/48/xfce4-ui.png"}}