0251 / 590 837 15
info@a-coding-project.de
;

Die CMS Menü Klasse

Code & Blog Logo

Code & Blog Logo

Heute geht es um das Menü unseres CMSs. Hier soll es die Möglichkeit geben, mehrere verschiedene Menüs zu erstellen. Diese Menüs sollen in der Datenbank gespeichert werden. Dafür gibt es die Tabelle cms_menu. In ihr wird jeder Menü Eintrag gespeichert. Ein Eintrag hat 4 Spalten:

  • id: ID des Eintrags, sie fängt bei jedem Menü bei 1 oder 0 an. Sie entscheidet über die Sortierung der Einträge.
  • menueID: Gibt an in welchen Menü der Eintrag liegt. Darüber werden später die Menüeinträge ausgelesen. Ach ja, das Menü hat keinen Namen, sondern nur diese ID.
  • title: Gibt den Text an, der angezeigt werden soll. Außerdem wird der Text auch im Attribut title erscheinen. Was das bringt, könnt ihr hier nachlesen.
  • href: Gibt das Ziel an. Hier können externe und interne Links eingetragen werden.

Und hier ist der SQl-Query für diese Tabelle:

CREATE TABLE `cms_menu` (
 `id` INT( 2 ) NOT NULL ,
 `menuID` INT( 3 ) NOT NULL ,
 `title` VARCHAR( 100 ) NOT NULL ,
 `href` VARCHAR( 255 ) NOT NULL ,
 PRIMARY KEY ( `id` , `menuID` )
 ) TYPE = MYISAM ;

Jetzt können wir schonmal die ersten Einträge für unsere Testseiten machen:

INSERT INTO `cms_menu` ( `id` , `menuID` , `title` , `href` )
 VALUES (
 '1', '1', 'Testseite 1', 'testseite.htm'
 ), (
 '2', '1', 'Testseite 2', 'testseite2.htm'
 ),(
 '3', '1', 'Testseite 3', 'testseite3.htm'
 );

Somit sind die Datenbankänderungen soweit durch. Nun geht es an den PHP Code. Wie bereits im Titel erwähnt gibt es nun eine Menü Klasse. Sie wird in der Datei menu.php im Verzeichnis system/classes gespeichert. Die Klasse bekommt die Methode display, mit welcher die Einträge ausgegeben werden können. Die Methode hat folgende Parameter:

  • $id: Gibt die ID des Menüs (menuID in der DB) an
  • $globalstart: Gibt den HTML-Code an, welcher vor dem Menü stehen soll (z.B. ein <ul> für eine Liste)
  • $globalend: Gibt den Code an, welcher hinter dem Menü stehen soll.
  • $elementstart: Gibt den Code an, welcher vor jeden Eintrag stehen soll (z.B. <li>)
  • $elementend: Gibt den Code an, welcher nach jeden Eintrag stehen soll
  • $class: Gibt den Klassennamen an, der in jedem Link stehen soll. Hierüber können die Einträge nachher via CSS oder JavaScript angesprochen werden.

Der PHP-Code für die Klasse ist der hier:

<?PHP
class Menu{
  function display($id, $globalstart,$globalend, $elementstart,$elementend,
                   $class){
    global $dbpraefix;
    $res = mysql_query("SELECT title,href FROM ".$dbpraefix."menu 
                        WHERE menuID = '".$id."' ORDER BY id");
    echo $globalstart;
    $i = 1;
    while($row = mysql_fetch_row($res)){
      echo $elementstart."<a href="".$row[1]."" title="".$row[0]."" 
           class="".$class." menue-".$id."-".$i."">".$row[0]."</a>";
      $i++;
    }
    echo $globalend;
  }
}
?>

Damit man im Skin nicht immer auf die Klasse Menu zugreigen muss, erstellen wir einfach eine Verknüpfung in der Klasse sys. Das geht so:

function displayMenu($id, $globalstart,$globalend, $elementstart,$elementend,
                       $class){
    Menu::display($id, $globalstart,$globalend, $elementstart,$elementend,$class);
  }

Natürlich müssen wir die Klasse auch per include importieren. Dies geschieht mit der Datei index.php im Hauptverzeichnis:

<?PHP
  include("system/dbconnect.php");
  include("system/settings.php");
  include("system/classes/page.php");
  include("system/classes/skincontroller.php");
  include("system/classes/menu.php");
  include("system/filterfilename.php");
  include("system/sys.php");
  $currentpage = new Page();
  $currentpage->loadProperties($_GET['include']);
  include(SkinController::getCurrentSkinPath()."/index.php");
?>

Jetzt fehlt nur noch der Aufrufe im Skin (index.php im Verzeichnis system/skins/default):

<!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();
      sys::displayMenu(1,"<ul>","</ul>","<li>","</li>","globalmenu")
    ?>
  </body>
</html>

Wenn jetzt alles richtig gelaufen ist, solltet ihr nun auf allen Seiten eine Liste mit den 3 Testseiten sehen. Bei mir ist dies der Fall (Die Seite kann sich in der Zwischenzeit schon geändert haben):

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

Der nächste Schritt in Sachen Menüs, wäre, dass es lokale und globale Menüs gibt. Das globale Menü wird auf allen Seiten angezeigt. Das lokale wird anhand der Seiteninfos angezeigt. Dazu aber in einen späteren Artikel mehr.

Kommentare

Daniel schrieb am 10.07.2009:

CREATE TABLE `cms_menu` ( `id` INT( 2 ) NOT NULL , `menuID` INT( 3 ) NOT NULL , `title` VARCHAR( 100 ) NOT NULL , `href` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `id` , `menueID` ) ) TYPE = MYISAM ; Bei der Vergabe der Primärschlüsselatribute ist bei menuID ein -e- zuviel, oder irre ich mich da. Auf jeden Fall mag mein phpmyadmin diesen Querry ohne -e- mehr :-) . Sprich dann führt er ihn auch aus.

Stefan Wienströer schrieb am 10.07.2009:

hast Recht, werd ich ändern ;-)

zilli schrieb am 30.04.2010:

Hallo, jetzt erstmal, "toll das du das machtst". Hab schon viel gelernt. Jetzt meine Fragen: 1. Im File "filterfilename" formatieren wir ja den Link und hängen am ende ein ".php" dran. Das habe ich bei mir auf ".htm" geändert um die testseiteX.htm öffnen zu können. Wie kann ich aber jetzt ein .php öffnen? 2. In der Menu Tabelle der DB hast du bei "href" testseite.htm eingetragen. Damit das bei mir dann funktiniert musste ich aber index.php?include=testseite eintragen. Fügst du das index.php?include= bei dir später automatisch irgendwo ein und die Links funktionieren zu diesem Zeitpunkt noch nicht? Und das .htm muss ich ja auch weglassen, da er sonst im filterfilename.php testseitehtm.htm draus macht. Das ist mir jetzt noch alles nicht so klar. Vielleicht beantworten sich die Fragen in den nächsten Blogs, aber zur Zeit finde ich das unklar. Grüße, zilli

stdio.h schrieb am 01.05.2010:

Du hast in der While-Schleife in menu.php noch das $elemetend vergessen. Das kommt noch hintendran. ...$row[0]."</a>" .$elementend;

Stefan Wienströer schrieb am 02.05.2010:

@zilli: Wo genau möchtest du denn ein .php öffnen? Das .php hat nichts mit den Urls im CMS an sich zu tun. So heißen lediglich die abgelegten Dateien, die später importiert werden. Zum zweiten Punk: Hast Du evtl kein Mod-Rewrite order hast du diesen Artikel überlesen? http://blog.stevieswebsite.de/2009/04/schone-urls-im-cms-mod-rewrite-sei-dank-code-blog/ @stdio.h: Hast Recht, der Fehler wurde jedoch in einem späteren Beitrag bereits behoben.

zilli schrieb am 02.05.2010:

Hallo, ich habe keine .htaccess und somit auch keine Mod-Rewrite. ich bastell es mir aber so das es auch so funktioniert.

Stefan Wienströer schrieb am 02.05.2010:

aso. In einem späteren Artikel kann man einen Verweis auf die ID der Seite in den Menüs speichern. Dann wird dein vorhaben funktionieren.

Pascal schrieb am 15.07.2010:

Fatal error: Call to undefined method sys::displayBreadcrump() in C:xampphtdocscmssystemskinsdefaultindex.php on line 11 Wenn ich die Zeite mit dem Breadcrump weglasse, gibt es keinen Fehler ...

Pascal schrieb am 15.07.2010:

Entschuldige, wie soll auch eine Methode definiert worden sein, wenn ich den Brotkrümmel Artikel übersprungen hab ^^

nikon2k schrieb am 31.08.2010:

Find ich persöhnlich nicht schlecht das tutorial - allerdings hätte ich es besser gefunden, ein Template System anstelle von echos zu verwenden. Klar jeder Anfänger fängt mit echo "" an - allerdings ist dies auch direkt der komplett "falsche" weg (falsch in der hinsicht, daß jeder der so ein system schreibt nicht lange glücklich damit ist, wenn er nur ein wenig styles ändern möchte :)). Ansonsten gute arbeit ;)

Stefan Wienströer schrieb am 31.08.2010:

Das Template-System kommt in einem späteren Beitrag ;-)

BartM schrieb am 29.01.2011:

Das menü ist bei mir da, auf der Testseite 3 die ich aber so aufrufen muss: http://localhost/cms/index.php?include=testseite3 sehe ich dies : Testseite -&gt; Testseite 2 -&gt; Testseite 3 Testseite 3 •Testseite 1 •Testseite 2 •Testseite 3 Soblad ich auf Testseite 1 oder 2 klicke kommt diese meldung: Objekt nicht gefunden! Der angeforderte URL konnte auf dem Server nicht gefunden werden. Der Link auf der verweisenden Seite scheint falsch oder nicht mehr aktuell zu sein. Bitte informieren Sie den Autor dieser Seite über den Fehler. Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber. Error 404 localhost 01/29/11 11:56:15 Apache/2.2.3 (Win32) DAV/2 mod_ssl/2.2.3 OpenSSL/0.9.8d mod_autoindex_color PHP/5.1.6 und in Browser steht diese url : http://localhost/cms/testseite.htm also ob die Testseite nicht gefunden werden kann.

Stefan Wienströer schrieb am 29.01.2011:

Hast du Mod-Rewrite?

BartM schrieb am 29.01.2011:

ja Mod-Rewrite ist an.

jULiM schrieb am 17.05.2011:

Irgendetwas scheint auch bei mir grundlegend falsch zu laufen... Ich habe dasselbe Problem wie @zilli, möchte allerdings mit mod rewrite und der htaccess arbeiten. Wie ist denn aktuell der Stand der htaccess Datei? Danke für die Hilfe!