SteviesWebsite

PHP Breadcrumb erstellen

Code & Blog Logo

Code & Blog Logo

Um eine Breadcrumb-Navigation zu erstellen müssen wir erstmal wissen, welche Seite zu welcher Seite gehört. Dies geschieht in unserem Fall durch die Tabelle cms_pages, in welcher alle Seiten gespeichert werden. Sie bekommt nun eine Weitere Spalte, wo der Besitzer (owner) steht. Das heißt, hier muss nachher die ID der Übergeordneten Seite angegeben werden. Ist die Seite auf dem höchsten Level, also wenn sie keine Überseiten hat, bekommt sie hier eine -1.

Wir benötigen für das Hinzufügen der Spalte den folgenden Query:

ALTER TABLE `cms_pages`
ADD `owner` INT DEFAULT '-1' NOT NULL

Wenn wir nun schonmal in der Datenbank sind, können wir auch noch 2 weitere Testseiten hinzufügen, die beide einen Besitzer haben:

INSERT INTO `cms_pages` ( `id` , `alias` , `title` , `owner` )
VALUES (
'', 'testseite2', 'Testseite 2', '1'
), (
'', 'testseite3', 'Testseite 3', '2'
);

Diese Seiten sollten natürlich auch existieren. Also legen wir nochmal 2 Seiten mit Testinhalt an.

testseite2.htm (Verzeichnis content/articles):

<h1>Testseite 2</h1>

und testseite3.htm:

<h1>Testseite 3</h1>

Nun müssen wir in der Klasse page den Besitzer als Property hinzufügen. Dafür machen wir als erstes 2 neue Properties. Einmal $ownerid und einmal $owner. Es sind 2, da der owner vielleicht manchmal gar nicht benötigt wird und somit erstmal nur die id eingetragen wird. Hier erstmal die neuen 2 Properties:

var $ownerid = -1;
var $owner = false;

Um die id nun zu laden, müssen wir diese auch in der Funktion loadProperties auslesen. Die neue Funktion sieht nun so aus:

  function loadProperties($alias){
    global $dbpraefix;
    $res = mysql_query("SELECT id,title,owner FROM ".$dbpraefix."pages 
                        WHERE alias = '".$alias."'");
    if($row = mysql_fetch_row($res)){
      $this->id = $row[0];
      $this->title = $row[1];
      $this->ownerid = $row[2];
      $this->alias = $alias;
    }
  }

So, jetzt haben wir schonmal die ID. Nun brauchen wir noch eine Funktion, welche uns den Besitzer als Objekt zurückgibt. Damit das Objekt nicht immer wieder neu ausgelesen werden muss, wird es in die Property $owner geschrieben. Nur wenn diese auf false steht, wird der Owner ausgelesen. Hier ist der Code:

function getOwner(){
    global $dbpraefix;
    if(!$this->owner){
      $res = mysql_query("SELECT alias FROM ".$dbpraefix."pages 
                          WHERE id = '".$this->ownerid."'");
      if($row = mysql_fetch_row($res)){
        $this->owner = new Page();
        $this->owner->loadProperties($row[0]);
      }
    }
    return $this->owner;
  }

Jetzt haben wir schonmal den Owner. Also fehlt nur noch die wirkliche Breadcrump Funktion. Diese wird erstmal in dieser Klasse(page) als 2-Dimensionaales Array zurückgegeben und später in der Klasse sys ausgegeben. Das ganze ist eine rekursive Funktion, dass heißt, das sie sich selbst wiedrr aufruft. Denn wir brauchen auch alle übergeordneten Seiten und nicht bloß eine. Die Funktion getBreadcrump der Klasse page sieht so aus:

  function getBreadcrump(){
    if(!$this->owner) $this->getOwner();
    if($this->owner){
      $breadcrump = $this->owner->getBreadcrump();
    }
    $breadcrump[] = array($this->alias,$this->title);
    return $breadcrump;
  }

Als nächstes gibt es eine Funktion (in der Klasses sys) die die Breadcrump Navigation ausgibt. Sie hatfolgende Parameter:

  • $separator:  Gibt den Code an, der zwischen den Einträge ausgegeben werden soll (z.B. das ” -> “.
  • $class: Gibt die Klasse für die Breadcrump Navigation an. So kann diese später per CSS gestaltet werden.
  • $idpraefix: Gibt den ersten Teil der id der Elemente wieder. Der zweite Teil ist eine laufende Nummer. Dadurch kann per CSS oder JavaScript jedes Element der Breadcrump eigens angesprochen werden.

In der Funktion holen wir uns erstmal die Breadcrump als Array aus der aktuellen Seite. Danach gehen wir mit einer While schleife und einen Zähler alle Einträge durch. Hier nehmen wir keine foreach Schleife, da wir den Zähler und die Anzahl der Elemente benötigen, damit der letzte Separator nicht gesetzt wird. Die komplette Funktion ist diese:

function displayBreadcrump($separator,$class,$idpraefix){
    global $currentpage;
    $i = 1;
    $breadcrump = $currentpage->getBreadcrump();
    while($i <= count($breadcrump)){
      echo "<a href=\"".$breadcrump[$i-1][0].".htm\" class=\"".$class."\" 
            id=\"".$idpraefix.$i."\">".$breadcrump[$i-1][1]."</a>";
      if($i < count($breadcrump)){
        echo $separator;
      }
      $i++;
    }
  }

Jetzt muss diese Funktion nur noch aufgerufen werden. Dies geschieht natürlich in der index.php unseres Skins. Ihr neuer Quellcode sieht so aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
  <head>
    <?PHP
      sys::includeHeader();
    ?>
  </head>
  <body>
    <?PHP
      sys::displayBreadcrump(" -&gt; ","breadcrump","bc");
      sys::includeContent();
    ?>
  </body>
</html>

Zum Testen ruft nun bitte die Seite testseite3.htm auf. Hier sollte nun eine Breadcrump navigation erscheinen. Klickt doch mal ein bisschen rum, um zu sehen, ob auch alles Klappt.

Hier ist die Testseite 3 bei mir (sieht hat sich jedoch ggfl. schon wieder geändert):

http://cms.stevieswebsite.de/testseite3.htm

Dies ist ein Beitrag aus der Aktion Code & Blog, in der hier ein eigenes CMS erstellt wird.

Verwandte Themen

RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

4 Kommentare »

  1. Hi,
    bei mir besteht das Problem, dass er die testseite3.htm nicht öffnen möchte. Ich kann sie nur öffnen wenn ich den kompletten pfad angebe.
    Kann mir jemand sagen was ich falsch gemacht habe, bin alles schon drei mal durchgegangen und habe immer noch keinén Fehler gefunden.
    mfg
    Akini

    Kommentar von Akini — 28. Oktober 2009 @ 21:41

  2. Hast Du evtl. kein Mod Rewrite, oder hast Du vielleicht vergessen, die .htaccess zu erstellen?

    Kommentar von Stefan Wienströer — 29. Oktober 2009 @ 15:12

  3. Hi, ich hab mich bisher an deine Anleitung gehalten und es hat bisher auch alles geklappt nur jetzt bekomme ich, wenn ich die testseite3.htm aufrufe, oder generell irgendeine Testseite aufrufe das hier:

    Fatal error: Call to undefined method sys::displayBreadcrump() in C:\xampplite\htdocs\system\skins\default\index.php on line 11

    Ich habe die Funktion “displayBreadcrump”, wie beschrieben in die sys.php Datei im system Ordner geschrieben, oder besser gesagt reinkopiert.

    Kommentar von Floh — 27. Juni 2010 @ 22:06

  4. K, hab meinen Fehler gefunden, ich hatte die klassen sys und page jeweils zu früh mit } geschlossen, sodass die ganzen anderen Funktionen nicht berücksichtigt wurden.

    Kommentar von Floh — 27. Juni 2010 @ 22:28

Hinterlasse einen Kommentar

Trackbacks/Pingbacks

Code & Blog LogoErstelle dein eigenes CMS mit PHP. Dieses Tutorial wird dir zeigen wie das geht. Also lies dir es durch und frische deine PHP Kenntnisse auf. [mehr...]

LiveEditor - Kostenloser WebEditorDer kostenlose WebEditor hilft dir dabei, deine Website besser zu entwickeln. Mit dem Syntax-Highlighting fällt geht alles viel schneller. Download jetzt! [mehr...]

Blog Tutorials... helfen dir deinen Blog zu verbessern. Nebenbei gibt es noch nützliche Blog-Tools. [mehr...]

WebanalyseFür die Verbesserung Deiner Seite solltest Du wissen, wie sich die Besucher verhalten. Diese Artikel zeigen Dir wie man das am geschicktesten macht. [mehr...]

Diskussion starten
  • RSS
  • Blogverzeichnis - Blog Verzeichnis bloggerei.de
PHP Breadcrumb erstellen © SteviesWebsite.de - Kontakt | Impressum