======[PHP] Einfache Seitennavigation====== > ''**Diese Seite befindet sich im Kompost. Wenn ich mal Zeit habe, wird sie entweder überarbeitet (besser dokumentiert) oder entfernt.**'' =====Intro===== Eine ganz einfache kleine Seitennavigation ohne Schnickschnack. Nunja, inzwischen hat sie auch Schnickschnack bekommen. Ist aber immer noch relativ einfach. Die Doku befindet sich im Code selber. Hier ein paar Dinge **item: **Der Seitenindex mit 0 beginnt. Die Anzeige 'Seite 1' hat also die pageNr 0. **item: **Das Script ist in 4 Teile aufgeteilt. Settings - Datenbeschaffung - Navigation - Items-Auflistung. In Meinem Beispiel ist die Datenbaschaffung ein Array - dies kann aber problemlos auch eine DB-Tabelle sein **item: **Wenn du bei deinen Daten kein Intro-Text hast, in der übersicht aber trotzdem eine Vorschau liefern willst, dann kannst du dies mit der Funktion [[:php:functions:wordcut]] bewerkstelligen (Siehe das Anwednungsbeispiel von wordCut) =====Code===== %s'); //[pageTitle] der aktuellen Seite in der Navigation. %s wird durch die Seitenzahl ersetzt define('C_NAV_FORMAT_ACT_PAGE_NR', '%s'); //[pageTitle] einer Seite in der Navigation. %s wird durch die Seitenzahl ersetzt define('C_NAV_FORMAT_PAGE_NR', '%s'); //Trennzeichen, mit dem die Seitennummern getrennt werden define('C_NAV_DELEMITER', " | \n"); //[pageTitle] der Erster, Zurück, Nächster und Letzter -> Navigation define('C_NAV_FORMAT_FIRST', '<<'); define('C_NAV_FORMAT_PREV', '<'); define('C_NAV_FORMAT_NEXT', '>'); define('C_NAV_FORMAT_LAST', '>>'); /** * --------------------------------------------------- * --- Datenbeschaffung ---- * --------------------------------------------------- * Simulierte Daten. Diese Informationen können aus einer DB oder sonstwoher stammen * In dieser Variante werden immer alle Daten ausgelesen und dann auf die Seite gekürzt. * Also keine WHERE und LIMIT für eine Datenbankabgfrage um die Seite einzugrenzen. * Wie die Felder etc. heissen, ist eigentlich egal. Erst im letzten Abschnitt dieses * Codes [Anzeigen der Einträge der ausgewählten Seite] werden diese Daten wirklich * verwendet. Hat aber auf die Navigation nur einen Datenmengen-Einfluss */ $items[] = array('id' => 1, 'title' => 'Willkommen', 'intro' => 'Hallo Welt'); $items[] = array('id' => 2, 'title' => 'Eintrag 1', 'intro' => 'Ich habe die ID 2'); $items[] = array('id' => 14, 'title' => 'Weiter gehts', 'intro' => 'ID 14 an dritter Stelle'); $items[] = array('id' => 3, 'title' => 'Und noch was', 'intro' => 'irgendwas'); $items[] = array('id' => 8, 'title' => 'abc', 'intro' => 'ABC'); $items[] = array('id' => 9, 'title' => 'def', 'intro' => 'DEF'); $items[] = array('id' => 10, 'title' => 'ghi', 'intro' => 'GHI'); $items[] = array('id' => 11, 'title' => 'jkl', 'intro' => 'JKL'); $items[] = array('id' => 12, 'title' => 'Zuletzt', 'intro' => 'Ich bin das Letzte'); /** * Für eine DB-Quelle würde dasselbe etwa so aussehen * @example * $sql = "SELECT id, title, intro FROM my_data"; * $result = mysql_query($sql); * while($item = mysql_fetch_assoc($result)) $items[] = $item; */ /** * --------------------------------------------------- * --- Erstellen der Navigation --- * --------------------------------------------------- * Im folgenden Abschnitt wird die Navigation berechnet und ausgegeben */ //Die Items in Seiten aufteilen //array(pageNr => array(page)) $pages = array_chunk($items, C_NAV_ITEMS_PER_PAGE, true); //Die letzte Page-Nr ermitteln $lastPageNr = end(array_keys($pages)); //Die Aktuelle Page ermitteln und validieren $actPageNr = filter_input( INPUT_GET, 'pageNr', FILTER_VALIDATE_INT, array('options'=>array('min_range'=>0, 'max_range'=>$lastPageNr)) ); //Auswerten. Wenn False, ist eine ungültige Nummer übergeben worden if($actPageNr === false) die("pageNr {$_GET['pageNr']} ist ausserhalb des Ranges (0 bis {$lastPageNr})"); //Wenn es NULL ist, wurde keine Nummer übergeben if(is_null($actPageNr)) $actPageNr = C_NAV_DEFAULT_PAGE_NR; //Die Page-Nummern extrahieren //Ergibt ein 2-Dimanesionaler Array: //array(array(pageNr, pageTitle)) foreach($pages as $pageNr => $page){ $pageNumbers[] = array( 'pageNr'=>$pageNr, 'pageTitle' => $pageNr+1 ); } //Ausrechnen welche ids überhaubt angezeigt werden sollten if(C_NAV_NR_PER_TIME > 0){ $leftPos = $actPageNr - floor((C_NAV_NR_PER_TIME-1) / 2); if($leftPos < 0) $leftPos = 0; $pageNumbers = array_slice($pageNumbers, $leftPos, C_NAV_NR_PER_TIME, true); } //Erster, Zurück, Nächster, Letzter anhängen if($actPageNr > 0){ if(C_NAV_WITH_PREV_NEXT) array_unshift($pageNumbers, array('pageNr'=>$actPageNr-1, 'pageTitle'=>C_NAV_FORMAT_PREV)); if(C_NAV_WITH_FIRST_LAST) array_unshift($pageNumbers, array('pageNr'=>0, 'pageTitle'=>C_NAV_FORMAT_FIRST)); } if($actPageNr < $lastPageNr){ if(C_NAV_WITH_PREV_NEXT) array_push($pageNumbers, array('pageNr'=>$actPageNr+1, 'pageTitle'=>C_NAV_FORMAT_NEXT)); if(C_NAV_WITH_FIRST_LAST) array_push($pageNumbers, array('pageNr'=>$lastPageNr, 'pageTitle'=>C_NAV_FORMAT_LAST)); } //Navigator erstellen foreach($pageNumbers as $nr){ //Falls die aktuelle Seite ist, kein Link erstellen if($actPageNr == $nr['pageNr']){ $navEntries[] = sprintf(C_NAV_FORMAT_ACT_PAGE_NR, htmlentities($nr['pageTitle'])); }else{ $pageTitle = sprintf(C_NAV_FORMAT_PAGE_NR, htmlentities($nr['pageTitle'])); $navEntries[] = sprintf(C_NAV_FORMAT_LINK, 'pageNr', $nr['pageNr'], $pageTitle); } } //Und die Navigation ausgeben echo "\n"; echo "\n"; echo implode(C_NAV_DELEMITER, $navEntries); echo "\n\n"; /** * --------------------------------------------------- * --- Anzeigen der Einträge der ausgewählten Seite -- * --------------------------------------------------- * Dieser Teil ist nur zu Demozwecken. Die ganzen Formatierungen etc. müssen jeweils * angepasst werden */ echo "\n\n"; //Die Einträge der aktuellen Seite erstellen foreach($pages[$actPageNr] as $item){ //Im Pfad die ID und die Source mitgeben. Somit kannst du nachher die Richtigen Daten abholen $html = "

{$item['title']}

\n"; $html .= "{$item['intro']}
\n"; //Hier den Pfad angeben um die Details des Eintrags zu besichtigen $html .= "Weiterlesen"; $itemsHTML[] = $html; } //Asugeben aller Einträge der Seite echo implode("\n
\n", $itemsHTML); echo "\n\n"; ?>
=====Ausgabebeispiele===== Hier kannst du es online testen http://yaslaw.info/example/simplePageNav.php ====Erste Seite (pageNr=0)==== 1 | 2 | 3 | > | >>

Willkommen

Hallo Welt
Weiterlesen

Eintrag 1

Ich habe die ID 2
Weiterlesen
====Eine Seite mitendrin==== << | < | 2 | 3 | 4 | > | >>

abc

ABC
Weiterlesen

def

DEF
Weiterlesen
====Eine ungültige Seite==== Wenn jemand so schlau sein will, und eine ungültige Page-Nr von Hand in den Link einträgt. pageNr 22 ist ausserhalb des Ranges (0 bis 4)