User Tools

Site Tools


php:kompost:simplesietenavigation

[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] wordcut bewerkstelligen (Siehe das Anwednungsbeispiel von wordCut)

Code

<?php
/**
 * ---------------------------------------------------
 * --- Settings                                   ----
 * ---------------------------------------------------
 * Ich habe versucht, möglichst alle Fix-Werte hier als Konstanten zu führen.
 * So muss beim Übernehmen des Codes nichts im Code geändert werden.
 */ 
//Anzahl Einträge pro Seite
define('C_NAV_ITEMS_PER_PAGE', 2);
 
//Standart PageNr wenn keine Nummer übergeben wurde (min. 0)
define('C_NAV_DEFAULT_PAGE_NR', 0);
 
//Anzahl Seitennummern auf einmal.
//Um immer alle anzuzeigen, verwende 0
define('C_NAV_NR_PER_TIME', 3);
 
//Mit Erster und Letzter Navigation
define('C_NAV_WITH_FIRST_LAST', true);
//Mit Zurück und Nächster Navigation
define('C_NAV_WITH_PREV_NEXT', true);
 
//Formatierungen:
//Navigationslink. Hier wird der Link definiert .
//Die Parameter (%s) werden in der folgenden Reihenfolge übergeben:
//[Name der Get-Variable], [pageNr], [pageTitle]
define('C_NAV_FORMAT_LINK', '<a href = "?%s=%s">%s</a>');
 
//[pageTitle] der aktuellen Seite in der Navigation. %s wird durch die Seitenzahl ersetzt
define('C_NAV_FORMAT_ACT_PAGE_NR', '<b>%s</b>');
//[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 "<!-- Start Seitennavigation -->\n";
echo "<!-- pageNr = {$actPageNr} -->\n";
echo implode(C_NAV_DELEMITER, $navEntries);
echo "\n<!-- Ende Seitennavigation -->\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<!-- Start Auflistung der Seiten -->\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 = "<h3>{$item['title']}</h3>\n";
    $html .= "{$item['intro']}<br />\n";
    //Hier den Pfad angeben um die Details des Eintrags zu besichtigen
    $html .= "<a href='show.php?itemId={$item['id']}'>Weiterlesen</a>";  
    $itemsHTML[] = $html;
}
//Asugeben aller Einträge der Seite
echo implode("\n<hr />\n", $itemsHTML);
echo "\n<!-- Ende Auflistung der Seiten -->\n";
?>

Ausgabebeispiele

Hier kannst du es online testen http://yaslaw.info/example/simplePageNav.php

Erste Seite (pageNr=0)

<!-- Start Seitennavigation -->
<!-- pageNr = 0 -->
<b>1</b> | 
<a href = "?pageNr=1">2</a> | 
<a href = "?pageNr=2">3</a> | 
<a href = "?pageNr=1">&gt;</a> | 
<a href = "?pageNr=4">&gt;&gt;</a>
<!-- Ende Seitennavigation -->
 
<!-- Start Auflistung der Seiten -->
<h3>Willkommen</h3>
Hallo Welt<br />
<a href='show.php?itemId=1'>Weiterlesen</a>
<hr />
<h3>Eintrag 1</h3>
Ich habe die ID 2<br />
<a href='show.php?itemId=2'>Weiterlesen</a>
<!-- Ende Auflistung der Seiten -->

Eine Seite mitendrin

<!-- Start Seitennavigation -->
<!-- pageNr = 2 -->
<a href = "?pageNr=0">&lt;&lt;</a> | 
<a href = "?pageNr=1">&lt;</a> | 
<a href = "?pageNr=1">2</a> | 
<b>3</b> | 
<a href = "?pageNr=3">4</a> | 
<a href = "?pageNr=3">&gt;</a> | 
<a href = "?pageNr=4">&gt;&gt;</a>
<!-- Ende Seitennavigation -->
 
<!-- Start Auflistung der Seiten -->
<h3>abc</h3>
ABC<br />
<a href='show.php?itemId=8'>Weiterlesen</a>
<hr />
<h3>def</h3>
DEF<br />
<a href='show.php?itemId=9'>Weiterlesen</a>
 
<!-- Ende Auflistung der Seiten -->

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)
php/kompost/simplesietenavigation.txt · Last modified: 07.12.2015 12:25:58 by yaslaw