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 > >>

1 Star2 Stars3 Stars4 Stars5 Stars (1 Stimme, durchschnittlich 5,00 / 5)
Loading...


10 Kommentare zu “Objektorientierte Blätterfunktion (OOP-PageBrowser) in PHP 5”

  1. PeterJackson on April 28th, 2009 at 07:06

    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 : – )

  2. Bitte bitte 😉

    Hast du es dir schon angeschaut?
    Ich bitte um Feedback 🙂

  3. PeterJackson on Mai 8th, 2009 at 22:39

    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 😉

  4. PeterJackson on Mai 8th, 2009 at 23:06

    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

  5. 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

  6. PeterJackson on Mai 9th, 2009 at 10:16

    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

  7. Warum benutzt du auch den IE? 😉
    Und welche Version? 8?

  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 […]

  9. 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 =-.

  10. 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?

»Informationen zum Artikel

Autor: Simon
Datum: 05.04.2009
Zeit: 16:25 Uhr
Kategorien: Codeschnipsel
Gelesen: 23261x heute: 4x

Kommentare: RSS 2.0. Responses are currently closed, but you can trackback from your own site.

»Meta