Datenbankklasse Teil 9 (CMS)
In dem CMSwerden wir heute das komplette Menü-System in die neue Datenbankstruktur bringen. Zum Teil haben wir mit den Menüs bereits beim Dashboard angefangen. Heute kommt der Rest.
Fangen wir an mit der wichtigsten Klasse /system/classes/menu.php. Diese hat meinem Gefühl nach eniges an Lesbarkeit dazugewonnen:
<?PHP class Menu{ function display($id, $globalstart,$globalend, $elementstart,$elementend,$class){ $rows = $GLOBALS['db']->ReadRows("SELECT title,href FROM {'dbprefix'}menu WHERE menuID = '".$id."' ORDER BY id"); echo $globalstart; $i = 1; foreach($rows as $row){ echo $elementstart."<a href="".$row->href.""title="".$row->title."" class="".$class." menue-".$id."-".$i."">".$row->title."</a>".$elementend; $i++; } echo $globalend; } function getIdByName($name){ $name = $GLOBALS['db']->EscapeString(strtolower(trim($name))); return $GLOBALS['db']->ReadField("SELECT id FROM {'dbprefix'}menu_names WHERE lower(trim(name)) = '".$name."' LIMIT 0,1");; } functiondisplayEditable($id){ $rows = $GLOBALS['db']->ReadRows("SELECT id, title,href FROM {'dbprefix'}menu WHERE menuID = '".$id."' ORDER BY id"); if($rows){ foreach($rows as $row){ echo $elementstart."<input name="".$row->id."_title"value="".$row->title."" /> <input name="".$row->id."_href"value="".$row->href."" /> <input type="submit"name="".$row->id."_delete"value="X"/><br />"; } } } function addEntry($menu,$title,$href){ $maxID = $GLOBALS['db']->ReadField("SELECT MAX(id) FROM {'dbprefix'}menu WHERE menuID = '".$menu."'"); $id = $maxID + 1; $res = $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}menu (id,menuID,title,href) VALUES('".$id."','".$menu."', '".$title."','".$href."')"); if($res){ $args['menu'] = $menu; $args['title'] = $title; $args['href'] = $href; EventManager::raiseEvent("menu_entry_added","../",$args); } return $res; } function editEntry($menu,$id,$title,$href){ $res = $GLOBALS['db']->Execute("UPDATE {'dbprefix'}menu SET href = '".$href."', title = '".$title."' WHERE id = '".$id."' AND menuID = '".$menu."'"); if($res){ $args['menu'] = $menu; $args['title'] = $title; $args['href'] = $href; $args['id'] = $href; EventManager::raiseEvent("menu_entry_edit","../",$args); } return $res; } function deleteEntry($menu,$id){ $res = $GLOBALS['db']->Execute("DELETE FROM {'dbprefix'}menu WHERE menuID = '".$menu."' AND id = '".$id."'"); if($res){ $res = $GLOBALS['db']->Execute("UPDATE {'dbprefix'}menu SET id = id - 1 WHERE id > '".$id."'"); if($res){ $args['menu'] = $menu; $args['id'] = $id; EventManager::raiseEvent("menu_entry_deleted","../",$args); } } return $res; } function create($name){ $res = $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}menu_names (name) VALUES ('".$name."')"); if($res){ $args['name'] = $name; EventManager::raiseEvent("menu_created","../",$args); } return $GLOBALS['db']->InsertID(); } function delete($id){ $res = $GLOBALS['db']->Execute("DELETE FROM {'dbprefix'}menu_names WHERE id = '".$id."'"); if($res){ $res = $GLOBALS['db']->Execute("DELETE FROM {'dbprefix'}menu WHERE menuID = '".$id."'"); if($res){ $args['id'] = $id; EventManager::raiseEvent("menu_deleted","../",$args); } } return $res; } } ?>
Weiter geht’s mit der Auflistung der Menüs. Hier mussten lediglich die Arrays auf Objekte umgestellt werden:
<h1>Menüs</h1> <p> <a href="/admin/index.php?page=menue-new">Neues Menü</a> </p> <table> <thead> <tr> <td><strong>ID</strong></td> <td><strong>Name</strong></td> <td><strong>Seiten</strong></td> <td><strong>Aktionen</strong></td> </tr> </thead> <tbody> <?PHP foreach(sys::getMenues() as $menue){ ?> <tr> <td><?PHP echo $menue->id; ?></td> <td><?PHP echo $menue->name; ?></td> <td><?PHP echo $menue->count; ?></td> <td> <a title="Bearbeiten" href="index.php?page=menu-edit&menu=<?PHP echo $menue->id; ?>"> <img src="/system/images/icons/page_edit.png" /> </a> <a title="Löschen" href="index.php?page=menu-delete&menu=<?PHP echo $menue->id; ?>"> <img src="/system/images/icons/cross.png" /> </a> </td> </tr> <?PHP } ?> </tbody> </table>
Um auch neue Menüs zu erstellen muss die Datei /admin/includes/menue-new.php bearbeitet werden:
<h1>Neues Menü</h1> <?PHP if(!$_POST['name']){ ?> <form action="/admin/index.php?page=menue-new" method="POST"> Name: <input name="name"><br /> <input type="submit" value="Erstellen" /> </form> <?PHP } else{ $id =Menu::create($GLOBALS['db']->EscapeString($_POST['name'])); if($id){ ?> <p>Das Menü wurde erfolgreich erstellt.</p> <form action="/admin/index.php" method="GET"> <input name="page" value="menu-edit" type="hidden" /> <input name="menu" value="<?PHP echo $id; ?>" type="hidden" /> <input type="submit" value="Eintrage hinzufügen" /> </form> <?PHp } else{ echo "<p>Das Menü konnte leider nicht erstellt werden.</p>"; } } ?>
… und zum bearbeiten die /admin/includes/menu-edit.php…
<?PHP if($_POST['add']){ if(trim($_POST['newtitle']) != ""){ if(trim($_POST['newurl']) != ""){ $res =Menu::addEntry($GLOBALS['db']->EscapeString($_GET['menu']), $GLOBALS['db']->EscapeString($_POST['newtitle']), $GLOBALS['db']->EscapeString($_POST['newurl'])); if($res){ echo "<p>Eintrag hinzugefügt!</p>"; } else{ echo "<p>Eintrag nicht hinzugefügt!</p>"; } } else{ echo "<p>Bitte geben Sie ein Link-Ziel ein</p>"; } } else{ echo "<p>Bitte geben Sie einen Link-Titel ein</p>"; } } else if($_POST['save']){ foreach($_POST as $param=>$value){ if(strlen($param) >= 6){ if(substr($param,-5,5) == "_href"){ $entries[substr($param,0,-5)][href] = $value; } else if(strlen($param) >= 7 && substr($param,-6,6) == "_title"){ $entries[substr($param,0,-6)][title] = $value; } } } foreach($entries as $id=>$params){ Menu::editEntry($GLOBALS['db']->EscapeString($_GET['menu']), $GLOBALS['db']->EscapeString($id), $GLOBALS['db']->EscapeString($params[title]), $GLOBALS['db']->EscapeString($params[href])); } } else{ foreach($_POST as $param=>$value){ if(strlen($param) >= 8){ if(substr($param,-7,7) == "_delete"){ Menu::deleteEntry($GLOBALS['db']->EscapeString($_GET['menu']), $GLOBALS['db']->EscapeString(substr($param,0,-7))); } } } } ?> <h1>Menü bearbeiten</h1> <form action="index.php?page=menu-edit&menu=<?PHP echo $_GET['menu']; ?>" method="POST"> <h2>Einträ;ge Bearbeiten</h2> <?PHP Menu::displayEditable($GLOBALS['db']->EscapeString($_GET['menu'])); ?> <input name="save" type="submit" value="Speichern"/> <h2>Neuen Eintrag hinzufügen</h2> <input name="newtitle" /> <input name="newurl" value="http://" /> <input name="add" type="submit" value="Hinzufügen"/> </form>
Wenn wir ein Menü löschen wollen brauchen wir die neue /admin/includes/menu-delete.php:
<h1>Menü lö;schen</h1> <?PHP if(!$_GET['delete']){ ?> <p>Soll das Menü unwideruflich gelöscht werden?</p> <a href="/admin/?page=menues">Abbrechen</a> <a href="/admin/?page=menu-delete&menu=<?PHP echo $_GET['menu']; ?>&delete=true"> Menü löschen </a> <?PHP } else{ if(Menu::delete($GLOBALS['db']->EscapeString($_GET['menu']))){ ?> <p>Das Menü wurde gelöscht!</p> <?PHP } else{ ?> <p>Das Menü konnte nicht gelöscht werden!</p> <?PHP } } ?>
Das wars auch schon mit den Menüs. Ich denke im nächsten Beitrag können wir den Admin-Bereich abschließen. Dann kommen noch 1-2 Beiträge über den normalen Bereich und dann ist die Datenbankumstellung perfekt. Kleines Zwischenfazit von mir: Mit dem neuen System ist der Quellcode kürzer und noch leserlicher geworden.
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Über uns
Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project