Inhalte auf mehrere Seiten aufteilen - Das Seitenregister
An diesem Punkt erkläre ich mal, wie das Seitenregister konstruiert wird.
Funktionsweise
| 1 2 3 4 5 6 7 8 9 10 11 | // Erstellen des Registers function register($type, $aktivepage, $ipp, $query) { $this->mysqlConnect(); // Verbindung zu MySQL herstellen // Query absenden und Anzahl der Items speichern $rows = $this->mysqlQuery($query); $rows = $rows['numRows']; $this->mysqlConnect(); // MySQL trennen $seiten = ceil($rows/$ipp); // Seiten ermitteln // Aktuelle URL auslesen $request = explode("/", $_SERVER['REQUEST_URI']); |
Beim Aufruf der Methode werden ihr der Typ (mod_rewrite oder normal), die aktuelle Seite, wie viele Einträge pro Seite und das MySQL Statement übergeben. In den ersten drei Zeilen der Methode, verbindet sich die Methode mit der MySQL Datenbank und liest die Anzahl der Datensätze aus. Danach wird die Verbindung wieder getrennt.
Dann wird aus den "Items pro Seite" und der Anzahl der Datensätze die Seitenanzahl berechnet. Danach wird das Ergebnis mit der Funktion ceil() noch auf die nächst größte Zahl aufgerundet, damit auch ungerade Einträge mit erscheinen. Zuletzt wird noch die Aktuelle Adresse in eine Variable gespeichert. An diese wird dann am Ende die Variable für die Seiten angehängt.
| 1 2 3 4 5 6 7 | if($seiten>1) { // Sind mehr als eine Seite vorhanden? echo "<div class='register'>"; // Div-Box // Sicherheitspruefung if($aktivepage<1) $aktivepage=1; if($aktivepage>$seiten) $aktivepage=$seiten; |
Nun kommt ein Highlight was mich echt Kopfzerbrechen bereitet hat. Und zwar die dynamische Ansicht der Seitennummern. Das heißt, das wenn man zB 200 Seiten hat, nicht alle 200 Seiten in dem Register angezeigt werden. (Wie sähe das denn aus?) Mit dieser if-clause werden dann also nur die Aktuelle seite und drei Seiten davor sowie drei Seiten danach angezeigt. Also insgesamt sieben. Wenn es mehr als sieben Seiten gibt werden auch noch ein "Erste" und "Letzte" Link angezeigt, um schnell von Anfang bis Ende springen zu können.
| 1 2 3 4 | // Rewrite oder nicht? if($type=="rew") { |
Ab hier wird es etwas Kompliziert. Es wird hier entschieden, ob nun ein Register mit mod_rewrite Adressen erstellt werden soll, oder mit stink normalen PHP-URLs.
Die mod_rewrite Variante
| 1 2 3 4 5 6 7 8 | // Sind schon $_GET Elemente in der URL? if($_GET['page']) $document = substr($request[(sizeof($request)-1)], 0, strlen($request[(sizeof($request)-1)])-11-strlen($_GET['page'])); else $document = substr($request[(sizeof($request)-1)], 0, strlen($request[(sizeof($request)-1)])-5); |
Die nächste zeile sieht jetzt mal echt schlimm aus, aber eigentlich eist es ganz einfach! Sie Filtert einfach eine vorhandene page-Variable aus, so das die Seitenzahl nicht doppelt in der URL vorkommen kann.
Wichtig: Die Variable page MUSS immer am ende der URL stehen!
An sonden wird die falsche Variable entfernt! Des weiteren wird auch das *.html am Ende der rewrite-URL entfernt, was am Ende wieder angehängt wird.
| 1 2 3 4 | // Ausgabe der Statusinfo echo "<font class='sanzahl'>Seite ".$aktivepage." von ".$seiten." | </font>"; |
Als nächstes, wird noch der Status in Form von "Seite 1 von 20" ausgegeben.
| 1 2 3 4 5 | // "Erste" anzeigen? if($aktivepage>4 && $seiten>7) echo "<a href='".$document.",page,1.html'>« Erste</a> "; |
Hier wird entschieden, ob der "Erste"-Link angezeigt werden soll. Das passiert, wenn die Aktuelle Seite größer als Seite vier ist und wenn die gesamte Seitenanzahl größer ist als sieben.
| 1 2 3 4 5 6 7 | // Seitenregister for($i=$min; $i<=$max; $i ) { echo "<a"; if($aktivepage==$i) echo " style='font-weight:bold;'"; echo " href='".$document.",page,".$i.".html'>".$i."</a> "; } |
Nun kommen wir endlich zum wichtigsten Teil. Der Ausgabe des Registers. Hier wird einfach in einer for-schleife Link für Link ausgegeben. Dort kann man auch noch mal sehen, wie die einzelnen Variablen verwendet werden.
| 1 2 3 4 5 | // "Letze" anzeigen? if($aktivepage<$seiten-4 && $seiten>7) echo " <a href='".$document.",page,".$seiten.".html'>Letzte »</a>"; |
Nun noch als Letztes die Prüfung, ob der "Letzte"-Link angezeigt werden soll. Wann das passiert, kann man ja in der if erkennen.
Die nicht-mod_rewrite Variante
| 1 2 3 4 | // kein Rewrite } else { |
Nun kommen wir zu der nicht-mod_rewrite Variante. Die ähnelt der schon Beschriebenen Version sehr, hat aber einige kleine Unterschiede.
| 1 2 3 4 5 6 | // Page und *.php entfernen if($_GET['page']) $document = substr($request[(sizeof($request)-1)], 0, strlen($request[(sizeof($request)-1)])-6-strlen($_GET['page'])); else $document = $request[(sizeof($request)-1)]; |
Als erstes wird wieder an Angabe der Seitenzahl aus der URL entfernt, falls eine in der URL ist. Außerdem wird das *.php entfernt. Das wird dann wieder wie oben am Ende angehängt.
| 1 2 3 4 5 | // Sind schon $_GET's enthalten? if(substr($document, strlen($document)-4)==".php") $document=$document."?"; else $document=$document."&"; |
Nun was neues. Und zwar wird hier nun geprüft, ob schon $_GET Variablen an der URL hängen. Je nach dem was da raus kommt, wird entschieden, ob an das *.php ein ? angehängt werden muss, oder ob ein & an die vorheriege Variable angehängt werden muss.


