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 Hessner
* @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:
Ähnliche Beiträge:<< < 1 2 3 4 5 6 7 > >>
- Objektorientierte ID-Verwaltung in PHP
- Eindeutige und zufällige Hashes mit PHP generieren (OOP-Klasse)
Dieser Artikel wurde von Simon verfasst.
Gelesen: 2982x heute: 2x
Dieser Artikel wurde am Sonntag, April 5th, 2009 um 16:25 in den Kategorien Codeschnipsel geschrieben. Du kannst die Kommentare über den Feed (RSS 2.0) beobachten. Du kannst eine Antwort hinterlassen, oder einen Trackback von deiner Seite setzen.



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?
Phentermine Success Story and Cheapest Phentermine and Viagra Vs Cialis and No Prescription Vicodin and Women Does Viagra Work
Xanax Side Effects and Snorting Adderall and Vicodin Online and Phentermine 37.5mg and Viagra Side Effects
Buy Xanax Valium Online Florida and Viagra And Cannabis and Doxycycline Side Effects and Premarin Alternatives and Carisoprodol Abuse
Phentermine 37.5 Lowest Price and Buy Cialis Doctor Online and Vicodin Long Term Effects and Biaxin Xl and Hydrocodone Addiction
Xanax Mexico and Hydrocodone Without A Prescription and Cheap Viagra Canada and Wholesale Phentermine and Xanax Online Without Prescription