Objektorientierte Blätterfunktion (OOP-PageBrowser) in PHP 5
Es gibt Aufgaben, die einfach immer wieder gemacht werden müssen. Eine dieser Aufgaben ist die Blätterfunktion, die häufig in Foren oder News-Seiten benötigt wird. Da es irgendwann nur noch nervig ist, jedes Mal von vorne zu beginnen, habe ich vor einiger Zeit einmal einen Page-Browser in PHP geschrieben.
Die Blätterfunktion ist eine Klasse namens PageBrowser.
Funktionen von PageBrowser
Folgende Funktionalitäten wurden bereits implementiert:
- Festlegen der Anzahl der Elemente, die auf die Seiten aufgeteilt werden sollen
- Festlegen des Anzeigebereichs in der Seitenauflistung (vor und nach der aktuellen Seite)
- Aktuelle Seite festlegen
- Elemente pro Seite festlegen
- Die komplette Blätterfunktion als HTML ausgeben
- Dabei ist es möglich, das Aussehen der URL zu manipulieren (später mehr dazu)
- Außerdem können die Links per CSS formatiert werden, indem man ihnen eine Klasse spendiert.
- Man kann sämtliche Attribute mit get-Methoden auslesen
- Die Klasse besitzt ein sogenanntes Fluent Interface. Das heißt, dass bei jeder set-Methode $this zurückgegeben wird. So kann man mehrere Setter aneinanderreihen.
Code der Klasse
Der Code ist leider unkommentiert. Wenn ich mal Zeit habe, hole ich das vielleicht nach.
/** * @author Simon H. * @version 2.1 * * So wird diese Klasse angewandt: * ---------------------------------------------------------------------------- * $browser = new PageBrowser(); * $browser->setArea(3) //bereich vor und nach der aktuellen seite * ->setElementsPerPage(5) //wieviele einträge pro seite? * ->setElementsSum(1000) //wieviele einträge gibt es insgesamt? * ->setURL(array("admin.php?page=test&site=", "")) //wie sieht die URL aus? * ->setPage($_GET["site"]); //wo befinden wir uns gerade? * * ---------------------------------------------------------------------------- * * Dadurch dass jede Set-methode $this zurückgibt, können die einzelnen Befehle * aneinandergekettet werden, ohne dass jedesmal das Objekt davorgestellt werden * muss. */ class PageBrowser { /** * @var integer page_sum * Speichert die Gesamtzahl der Einträge, die auf den Seiten verteilt werden ab */ private $elements_sum = null; /** * @var integer area * Legt fest, wieviele Seiten vor und nach der aktuellen angezeigt werden (in der Übersicht) */ private $showArea = null; /** * @var integer page_now * Speichert die aktuelle Seite */ private $page_now = null; /** * @var array url * Dieses Array beinhaltet den vorderen ([0]) und den hinteren ([1]) Teil der URL. * z.B. array("/modul/show/seite-", ".html") */ private $url = array("?site=",""); /** * @var integer perPage * Wieviele Einträge pro Seite? */ private $perPage = null; ################################################################################################## /** * Konstruktor */ public function __construct($elements_sum = null, $showArea = null, $page_now = null, $perPage = null, $url = null) { if($elements_sum !== null) { $this->setElementsSum($elements_sum); } if($showArea !== null) { $this->setArea($showArea); } if($perPage !== null) { $this->setElementsPerPage($perPage); } if($page_now !== null) { $this->setPage($page_now); } if($url !== null) { if(is_array($url)) { $this->setURL($url); } else { throw new Exception('Die URL wird als Array erwartet. [0] => start || [1] = ende'); } } } ################################################################################################## /** * Legt die Gesamtzahl aller anzuzeigenenden Elemente fest. * * @return object */ public function setElementsSum($sum) { $sum = (int)$sum; if($sum < 0) { throw new Exception('Es darf keine negative Elementsumme angegeben werden'); } $this->elements_sum = $sum; return $this; } ################################################################################################## /** * Gibt die Gesamtzahl der Seiten zurück * * @return integer */ public function getPages() { if($this->perPage == 0) { print_r($this); } $pages = ceil($this->elements_sum / $this->perPage); return $pages; } ################################################################################################## /** * Legt den Anzeigebereich fest. * * @param integer area * @return object */ public function setArea($area) { $this->area = abs($area); return $this; } ################################################################################################## /** * Gibt den Anzeigebereich zurück * * @return integer */ public function getArea() { return $this->area; } ################################################################################################## /** * Legt die aktuelle Seite fest. * * @param integer page_now * @return object */ public function setPage($page_now) { if($this->getPages() === null) { throw new Exception('Die Gesamtseitentahl muss vor der aktuellen Seite angegeben werden'); } $page_now = (int)$page_now; if($page_now < 1) { $page_now = 1; } if($page_now > $this->getPages()) { $page_now = $this->getPages(); } $this->page_now = $page_now; return $this; } ################################################################################################## /** * Gibt die aktuelle Seite zurück * * @return integer */ public function getPage() { return $this->page_now; } ################################################################################################## /** * Legt den Aufbau der URL fest * * @param array url * @return object */ public function setURL(array $url) { $this->url = $url; if(!isset($this->url[1])) { $this->url[1] = ""; } return $this; } ################################################################################################## /** * Diese Funktion gibt den ersten Parameter (bei welchem eintrag beginnt die anzeige?) * für die SQL-Limit-Klausel zurück. * * @return int start */ public function getStart() { $start = ($this->getPage() - 1) * $this->getLimit(); return $start; } ################################################################################################## /** * Gibt zurück, wie viele Einträge auf einer Seite angezeigt werden. * --> 2. Parameter für SQL-Limit-Klausel * @return int perPage */ public function getLimit() { return $this->perPage; } ################################################################################################## /** * Legt fest, wie viele Einträge auf einer Seite angezeigt werden. * @return object */ public function setElementsPerPage($perPage) { $this->perPage = $perPage; return $this; } ################################################################################################## /** * Liefert einen String mit Links zu den Seiten. * @param string class * @return string */ public function show($class = null) { // Der Parameter $class kann dazu verwendet werden, den Links eine CSS-Klasse mitzugeben if($class === null) { $classAdd = ""; } else { $classAdd = " class=\"".$class."\" "; } $string = ''; $string .= '<<'."\n"; $string .= '<'."\n"; for($i = $this->getPage()-$this->getArea(); //start $i < = $this->getPage()+$this->getArea(); //ende $i++) { if($i > 0 && $i < = $this->getPages()) { if($i == $this->getPage()) { $string .= ''.$i.''."\n"; } else { $string .= ''.$i.''."\n"; } } } $string .= '>'."\n"; $string .= '>>'."\n"; return $string; } }
Die Methoden sollten eigentlich verständlich sein. Ok, die letzte ist jetzt nicht auf den ersten Blick vollkommen klar, aber wenn man sich damit außeinandersetzt, müsste es doch gehen 🙂
Beispiel einer Anwendung
Hier seht ihr, wie man die Klasse benutzt:
error_reporting(E_ALL); ini_set("display_errors", true); require_once("PageBrowser.php"); $browser = new PageBrowser( 200, //Elemente insgesamt 4, //Anzeigebereich isset($_GET["site"]) ? $_GET["site"] : 1, //Aktuelle Seite 5, //Einträge pro Seite array("?site=","") //Ausgabe der Seite in URL ); echo $browser->show();
Wie man sieht, kann man alle Parameter gleich im Konstruktor übergeben. Es geht aber auch so:
error_reporting(E_ALL); ini_set("display_errors", true); require_once("PageBrowser.php"); $browser = new PageBrowser; echo $browser->setElementsSum(200) ->setArea(4) ->setElementsPerPage(5) ->setPage(isset($_GET["site"]) ? $_GET["site"] : 1) ->setURL(array("?site=","")) ->show();
Die Ausgabe sieht dann in etwa so aus:
<< < 1 2 3 4 5 6 7 > >>
Geil. Sowas hab ich schon lang gesucht
und war selbst zu faul es eigens zu entwickeln!
Leg ich mir später mal aufm Zahn. Merci : – )
Bitte bitte 😉
Hast du es dir schon angeschaut?
Ich bitte um Feedback 🙂
Schau ich mir jetzt an. Danke danke 🙂
Die Woche hat mit etwas unerwartetem
Stress grüßen lassen. Kennste ja 😉
Mal schauen wie fix sich die Klasse
einsetzen lässt 😉
So an sich funzt die Klasse gut!
Einziges Manko : – ))
Du hast dort keine a hrefs in die
Ausgabe reingehaun oder hab ich was
falsch gemacht ?
Und was etwas genervt hat, die ganze
Klasse abzutippen (faul). Hat knapp 15 mins
gedauert.
Also schnell einsatzbereit.
Merci
Hi!
Vielen Dank fürs Testen!
Warum musstest du die Klasse abtippen? Bei mir im Firefox funktioniert Copy & Paste.
Achso, das mit den hrefs sollte eigentlich nicht so sein. Ich sehe leider erst jetzt, dass WordPress irgendwie die HTML-Tags mit richtig darstellt.
Allerdings hab ich dafür jetzt auch keine wirkliche Lösung.
Aber ich denke, dass du die hrefs selbst eingebaut hast, oder?
Simon
Lol ja klar hab ich die selbst eingebaut.
Bzw. mach ich jetzt, spontan keine Zeit
mehr gehabt gestern.
Das mit dem Copy Paste hier kam aus
dem IE und wenn ich das mim IE kopiere,
schmeisst er mir alle Umbrüche weg.
Der eingefügte Quellcode sieht dann aus,
als wenn man ihn mit dem Zend-Encoder
verschlüsseln wollte.
VG
Warum benutzt du auch den IE? 😉
Und welche Version? 8?
[…] Ohne jetzt alles gelesen zu haben, scheint meine Klasse genau das richtige für dich zu sein! Objektorientierte Blätterfunktion (OOP-PageBrowser) in PHP 5 – net-developes.de […]
Ist leider nichts für mich, ich will eine haben, die Daten gleich mit ausliest(also direkt aus Model) und sie in einem Array zur View weiterreicht.
.-= Thomas´s last blog ..Firefox, der sichere Browser, hat 40% Marktanteile =-.
Das wäre natürlich eine super Sache, aber so einfach leider nicht umzusetzen. Die Klasse muss dann wissen, woher die Daten kommen, usw…
Oder hast du da eine Idee?