0251 / 590 837 15
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&ouml;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&uuml; 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&uuml;gt!</p>";
        }
        else{
          echo "<p>Eintrag nicht hinzugef&uuml;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&auml;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&uuml;gen"/>
</form>

Wenn wir ein Menü löschen wollen brauchen wir die neue /admin/includes/menu-delete.php:

<h1>Men&uuml; l&ouml;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.