info@a-coding-project.de

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&uuml;s</h1>
<p>
  <a href="/admin/index.php?page=menue-new">Neues Men&uuml;</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&uuml;</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&uuml; 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&uuml; 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&uuml;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&uuml; lö;schen</h1>
<?PHP
  if(!$_GET['delete']){
?>
  <p>Soll das Men&uuml; unwideruflich gel&ouml;scht werden?</p>
  <a href="/admin/?page=menues">Abbrechen</a>
  <a href="/admin/?page=menu-delete&menu=<?PHP echo $_GET['menu']; ?>&delete=true">
    Men&uuml; l&ouml;schen
  </a>
<?PHP
  }
  else{
    if(Menu::delete($GLOBALS['db']->EscapeString($_GET['menu']))){
      ?>
        <p>Das Men&uuml; wurde gel&ouml;scht!</p>
      <?PHP
    }
    else{
      ?>
        <p>Das Men&uuml; konnte nicht gel&ouml;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.

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant