Durch den EventManager des CMS Tutorialskönnen wir bereits Events werfen und auf Events reagieren. Derzeit wird aber noch an keiner Stelle des CMS in Event geworfen. Und genau das wird sich heute ändern. Wir werden heute im ganzen CMS verteilt Events werfen. Um das ganze zu testen habe ich mir eine Datei gemacht, welche eine Überschrift und die Argumente ausgibt. Diese könnte auch euch beim Entwickeln hilfreich sein:
<h1>Event geworfen!</h1>
<?PHP
  print_r($args);
?>
Wenn ihr nun ein Event werft, müsst ihr die Datei in der DB registrieren. Das geht über folgenden Insert-String:
INSERT INTO `cms_events` ( `event` , `file` )
VALUES (
'eventname', 'dateipfad'
);
Die Values müsst ihr dann jeweils ersetzten. Der Datepfad bezieht sich auf den Hauptordner. Fangen wir an mit der Klasse /system/classes/fileserver.php. In ihr werden nun Events geworfen wenn Ordner erstellt wurden und Dateien hochgeladen wurden:
function createFolder($base,$name){
  $res = mkdir("../content/uploads/".$base."/".$name,0777);
  $args['name'] = "../content/uploads/".$base."/".$name;
  if($res)EventManager::raiseEvent("folder_created","../",$args);
  return $res;
}
    
function upload($base,$file){
  $tempname = $file['tmp_name'];
  $name = $file['name'];
  $res = copy($tempname, "../content/uploads/".$base."/".$name);
  $args['name'] = "../content/uploads/".$base."/".$name;
  if($res)EventManager::raiseEvent("file_uploaded","../",$args);
  return $res;
}
Weiter geht's mit dem Event image_registered, was geworfen wird, wenn ein Bild in die Mediathek eingetragen wird (Datei system/classes/imageserver.php):
$description = mysql_real_escape_string($description);
$res         = mysql_query("INSERT INTO ".$dbpraefix."images (path,name,description) 
                            VALUES ('".$path."','".$name."','".$description."')");
if($res){
  $args['path']        = $path;
  $args['name']        = $name;
  $args['description'] = $description;
  EventManager::raiseEvent("image_registered","../",$args);
}
return $res;
Die letzte Event werfende Klasse für heute ist die Klasse /system/classes/page.php. Sie bekommt in fast jeder Methode Events. So kann man zum Beispiel später nach dem Speichern den Quellcode der Datei noch verändern. Das ist die neue Datei:
<?PHP
class Page{
  var $id = -1;
  var $alias = '';
  var $title = '';
  var $ownerid = -1;
  var $owner = false;
  var $menu = -1;
  
  function loadProperties($alias){
    global $dbpraefix;
    $res = mysql_query("SELECT id,title,owner,menu FROM ".$dbpraefix."pages 
                        WHERE alias = '".$alias."'");
    if($row = mysql_fetch_row($res)){
      $this->id = $row[0];
      $this->title = $row[1];
      $this->ownerid = $row[2];
      $this->menu = $row[3];
      $this->alias = $alias;
    }
  }

  function getContent(){
    include(filterfilename("content/articles/".$this->alias));
  }

  function getOwner(){
    global $dbpraefix;
    if(!$this->owner){
      $res = mysql_query("SELECT alias FROM ".$dbpraefix."pages 
                          WHERE id = '".$this->ownerid."'");
      if($row = mysql_fetch_row($res)){
        $this->owner = new Page();
        $this->owner->loadProperties($row[0]);
      }
    }
    return $this->owner;
  }

  function getBreadcrump(){
    if(!$this->owner) $this->getOwner();
    if($this->owner){
      $breadcrump = $this->owner->getBreadcrump();
    }
    $breadcrump[] = array($this->alias,$this->title);
    return $breadcrump;
  }

  function readContent($dirpraefix){
    $filename = $dirpraefix."content/articles/".$this->alias.".php";
    $handle = @fopen ($filename, "rb");
    if($handle && filesize($filename) > 0){
      $contents = fread ($handle, filesize ($filename));
      fclose ($handle);
    }
    else{
      $contents = "";
    }
    return $contents;
  }

  function save(){
    global $dbpraefix;
    $res = mysql_query("UPDATE ".$dbpraefix."pages SET
                              title = '".$this->title."',
                              alias = '".$this->alias."',
                              menu = '".$this->menu."' 
                        WHERE id = '".$this->id."'");
    if($res){
      $args['title'] = $this->title;
      $args['alias'] = $this->alias;
      $args['menu']  = $this->menu;
      $args['id']    = $this->id;
      EventManager::raiseEvent("page_saved","../",$args);
    }
    return $res;
  }

  function writeContent($dirpraefix,$content){
    $filename = $dirpraefix."content/articles/".$this->alias.".php";
    $handle = fopen ($filename, "a");
    $res = fwrite ($handle, $content);
    fclose ($handle);
    if($res){
      $args['alias'] = $this->alias;
      $args['filename']  = $filename;
      $args['content'] = $content;
      EventManager::raiseEvent("pagecontent_writed","../",$args);
    }
    return $res;
  }

  function deleteContent($dirpraefix){
    $filename = $dirpraefix."content/articles/".$this->alias.".php";
    if(file_exists($filename)){
      unlink($filename);
      $args['alias'] = $this->alias;
      $args['filename']  = $filename;
      EventManager::raiseEvent("pagecontent_deleted","../",$args);
    }
  }

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

  function delete(){
    global $dbpraefix;
    $res = mysql_query("DELETE FROM ".$dbpraefix."pages WHERE alias = '".$this->alias."'");
    if($res){
      $args['alias'] = $this->alias;
      EventManager::raiseEvent("page_deleted","../",$args);
    }
    return $res;
  }
}
?>
Weitere Events folgen in Kürze. Ich denke, dass mit mit diesen Events in der Plugin-Entwicklung schon einiges anstellen kann. Wer will kann ja schon mal anfangen welche zu Entwickeln und diese (oder auch nur Ideen) im Forum vorstellen.