0251 / 590 837 15
;

Events werfen Teil 2 (CMS)

Code & Blog Logo

Code & Blog Logo

Heute bekommen die Menüs in unserem CMS eigene Events. Deswegen dreht sich heute alles um die Datei /system/classes/menu.php.

Los geht’s mit der Funktion addEntry. Sie wirft das Event menu_entry_added:

  function addEntry($menu,$title,$href){
    global $dbpraefix;
    $res = mysql_query("SELECT MAX(id) FROM ".$dbpraefix."menu 
                        WHERE menuID = '".$menu."'");
    $row = mysql_fetch_row($res);
    $id = $row[0] + 1;
    $res = mysql_query("INSERT INTO ".$dbpraefix."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;
  }

Und das Bearbeiten wirft natürlich auch ein Event:

  function editEntry($menu,$id,$title,$href){
    global $dbpraefix;
    $res =  mysql_query("UPDATE ".$dbpraefix."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;
  }

Die Methode DeleteEntry:

  function deleteEntry($menu,$id){
    global $dbpraefix;
    $res = mysql_query("DELETE FROM ".$dbpraefix."menu WHERE menuID = '".$menu."' AND id = '".$id."'");
    if($res){
      $res = mysql_query("UPDATE ".$dbpraefix."menu SET id = id - 1 WHERE id > '".$id."'");
      if($res){
        $args['menu']  = $menu;
        $args['id'] = $id;
        EventManager::raiseEvent("menu_entry_deleted","../",$args);
      }
    }
    return $res;
  }

Menü erstellen:

  function create($name){
    global $dbpraefix;
    $res = mysql_query("INSERT INTO ".$dbpraefix."menu_names (name) VALUES ('".$name."')");
    if($res){
      $args['name']  = $name;
      EventManager::raiseEvent("menu_created","../",$args);
    }
    return mysql_insert_id();
  }

Und zu guter letzt das Löschen eines Menüs:

  function delete($id){
    global $dbpraefix;
    $res = mysql_query("DELETE FROM ".$dbpraefix."menu_names WHERE id = '".$id."'");
    if($res){
      $res = mysql_query("DELETE FROM ".$dbpraefix."menu WHERE menuID = '".$id."'");
      if($res){
        $args['id']  = $id;
        EventManager::raiseEvent("menu_deleted","../",$args);
      }
    }
    return $res;
  }

Ich weiß, das einfügen der Events ist nicht so spannend, aber dadurch bekommen wir dann gute Plugin-Schnittstellen. Kein Angst, es wird nicht mehr so viele Event-Artikel geben 😉

Kommentare

Daniel schrieb am 16.12.2009:

Hi Stevie. Könntest Du hier noch mal eine Beispielquery für das hinzufügen in die MySQL Datenbank posten? Des weiteren würde ich gerne noch mal genauer wissen wie ich es testen kann. Wenn ich nämlich auf einer Seite print_r($args); einbaue bekomme ich keine Ausgabe der Argumente. MfG Daniel.

Stefan Wienströer schrieb am 16.12.2009:

INSERT INTO `cms_events` ( `event` , `file` ) VALUES ( 'eventname', 'dateipfad' ); Zeig mal was du in der DB stehen hast, vlt wird die Datei einfach nicht gefunden / das Event ist falschgeschrieben

Daniel schrieb am 17.12.2009:

also als eventname habe ich fileserver eingetragen und als pfad den pfad zur fileserver.php . War das falsch? Gruss Daniel

Daniel schrieb am 17.12.2009:

Ich hätte mir den Quelltext mehr durchlesen müssen. Wenn ich es richtig verstanden habe muss ich bei: .....raiseEvent("menu_created..... als eventname menu_created und als pfad /system/classes/menu.php eintragen und bei ....raiseEvent("menu_entry_deleted..... menu_entry_deleted und als pfad wieder /system/classes/menu.php, oder?

Daniel schrieb am 17.12.2009:

Einen Bugfix hätte ich noch. Wenn ich richtig liege muss bei der Funktion zum Menülöschen bei raiseEvent statt menu_created ein menu_deleted stehen. MfG Daniel

Stefan Wienströer schrieb am 17.12.2009:

So wie du es eben Beschrieben hast ist es richtig, nur das / könnte evtl. Probleme machen, musste ausprobieren. Hab natürlich menu_deleted gemeint, wollte nur testen ob auch alle schön aufpassen^^

Daniel schrieb am 18.12.2009:

Aber immer doch. Alles klar werde das mal so umsetzen. Ich mache mal ne Zusammenstellung der derzeitigen Events, damit es für die Leute da drausse einfacher wird. Also: INSERT INTO `cms_events` ( `event` , `file` ) VALUES ( ‘eventname’, ‘dateipfad’ ); / / eventname dateipfad folder_created system/classes/fileserver.php file_uploaded system/classes/fileserver.php image_registered system/classes/imageserver.php page_saved system/classes/page.php pagecontent_writed system/classes/page.php page_created system/classes/page.php page_deleted system/classes/page.php menu_entry_added system/classes/menu.php menu_entry_deleted system/classes/menu.php menu_created system/classes/menu.php menu_deleted system/classes/menu.php

Daniel schrieb am 18.12.2009:

Wordpress hat mir die Tabelle zerschossen. Denkt euch einfach das eventname und dateipfad die Überschriften sind und das Lehrzeichen zwischen dem letztem Buchstaben des Eventnamens und system/.... der vertikale Tabellenstrich. Argh ich wünsche mir mce für die Kommentare.

Daniel schrieb am 18.12.2009:

Ich bekomme bei jeder Ändrung diese Fehlermeldung Fatal error: Cannot redeclare class xyz in C:xampphtdocssystemclassesxyz.php on line 2

Stefan Wienströer schrieb am 18.12.2009:

Kann sein, dass Du als Datei eine Klasse angegeben hast? Diese würde dann 2 Mal importiert werden, was nicht erlaubt ist.

Daniel schrieb am 18.12.2009:

ich habe als dateipfad system/classes/menu.php usw angegeben.