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(" -> ","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.
Dies ist ein Beitrag aus der Aktion Code & Blog, in der hier ein eigenes CMS erstellt wird.





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.
Kommentar von Daniel — 10. Juli 2009 @ 07:10
hast Recht, werd ich ändern
Kommentar von Stefan Wienströer — 10. Juli 2009 @ 07:59
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
Kommentar von zilli — 30. April 2010 @ 06:40
Du hast in der While-Schleife in menu.php noch das $elemetend vergessen. Das kommt noch hintendran.
…$row[0].”” .$elementend;
Kommentar von stdio.h — 1. Mai 2010 @ 21:46
@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.
Kommentar von Stefan Wienströer — 2. Mai 2010 @ 13:10
Hallo, ich habe keine .htaccess und somit auch keine Mod-Rewrite. ich bastell es mir aber so das es auch so funktioniert.
Kommentar von zilli — 2. Mai 2010 @ 15:38
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.
Kommentar von Stefan Wienströer — 2. Mai 2010 @ 15:53
Fatal error: Call to undefined method sys::displayBreadcrump() in C:\xampp\htdocs\cms\system\skins\default\index.php on line 11
Wenn ich die Zeite mit dem Breadcrump weglasse, gibt es keinen Fehler …
Kommentar von Pascal — 15. Juli 2010 @ 01:46
Entschuldige, wie soll auch eine Methode definiert worden sein, wenn ich den Brotkrümmel Artikel übersprungen hab ^^
Kommentar von Pascal — 15. Juli 2010 @ 01:57