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:

<< < 1 2 3 4 5 6 7 > >>

Ähnliche Beiträge:
  1. Objektorientierte ID-Verwaltung in PHP
  2. Eindeutige und zufällige Hashes mit PHP generieren (OOP-Klasse)
1 Star2 Stars3 Stars4 Stars5 Stars (Wurde noch nicht bewertet)
Loading ... Loading ...

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.


15 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 My ComLuv Profile

  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?

  11. Phentermine Success Story and Cheapest Phentermine and Viagra Vs Cialis and No Prescription Vicodin and Women Does Viagra Work

  12. Xanax Side Effects and Snorting Adderall and Vicodin Online and Phentermine 37.5mg and Viagra Side Effects

  13. Buy Xanax Valium Online Florida and Viagra And Cannabis and Doxycycline Side Effects and Premarin Alternatives and Carisoprodol Abuse

  14. Phentermine 37.5 Lowest Price and Buy Cialis Doctor Online and Vicodin Long Term Effects and Biaxin Xl and Hydrocodone Addiction

  15. Xanax Mexico and Hydrocodone Without A Prescription and Cheap Viagra Canada and Wholesale Phentermine and Xanax Online Without Prescription

Hinterlasse einen Kommentar!

CommentLuv Enabled

Nein, mich gibt es nicht bei Twitter!

»Archiv

Easy-Profit.info
Angebote und Einkaufen klimaneutral -  bei kaufDA.de Browser-Statistiken
Dieser Blog ist gehostet bei ALL-INKL.COM - Webhosting Server Hosting Domain Provider