0251 / 590 837 15
info@a-coding-project.de
;

EventManager (CMS)

Code & Blog Logo

Code & Blog Logo

Unser CMS bekommt Ereignisse! Das heißt, dass man die Ereignisse werfen kann und an anderer Stelle abgefangen kann. So können wir zum Beispiel ein Ereignis werden, wenn eine Seite aufgerufen wurde. In der Statistik wird dann darauf reagiert und zum Beispiel die Besucherzahl erhöht.

Dadurch können wir im Plugin-Bereich sehr flexibel sein. So können wir zum Beispiel evetns werfen, wenn:

  • Der Header aufgerufen wird
  • Ein Plugin installiert wird
  • der Body-Tag geschlossen wird

Das ganze läuft über die Datenbank. In der neuen Tabelle werden Eventnamen und Datei-Adressen gespeichert. Tritt nun ein Event auf, werden alle Adressen zu diesem Event importiert. Das ist der Sql-Query für diese Tabelle:

CREATE TABLE `cms_events` (
`event` VARCHAR( 50 ) NOT NULL ,
`file` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `event` , `file` )
) TYPE = MYISAM ;

Die Events werden über die Klasse EventManager gesteuert. Sie hat die folgenden Methoden:

  • addHandler: Fügt einen EventHandler in die Datenbank ein
  • raiseEvent: Wirft ein Event aus
  • getHandler: Sucht die Handler über den Namen.

Bei raiseEvent kann man noch ein Argument übergeben. So kann man zum Beispiel bei der Plugin-Installaition die PluginInfo übergeben. Ich empfehle in dem Fall Arrays (über Namen), weil man dann die Argumente ohne Probleme erweitern kann.

Und so sieht die Klasse in PHP aus:

<?PHP
  classEventManager {
  
    function addHandler($file, $event){
       global $dbpraefix;
       $file  = mysql_real_escape_string($file);
       $event = mysql_real_escape_string($event);
       return mysql_query("INSERT INTO ".$dbpraefix."events (event, file) VALUES ('".$event."','".$file."')");
    }
    
    function raiseEvent($name,$base,$args){
       $handler =self::getHandler($name);
       if($handler){
         foreach($handler as $file){
           include($base."/".$file);
         }
       }
    }
    
    function getHandler($name){
       global $dbpraefix;
       $name = mysql_real_escape_string($name);
       $mySqlRes = mysql_query("SELECT file FROM ".$dbpraefix."events WHERE event = '".$name."'");
       while($row = mysql_fetch_row($mySqlRes)){
         $res[] = $row[0];
       }
       return $res;
    }
  
  }
?>

Ich möchte nun öfters auf diese Funktionalität zurückgreifen, denn so kann man später sehr flexible Plugins schreiben, die natürlich auch wieder Events werfen können. Bei Veröffentlichung des CMS wird es eine erweiterbare Liste geben, in der alle Events mit Argumenten sind. So können zum Beispiel bestimmte Plugins auf Events von anderen Plugins reagieren.

Kommentare

Daniel schrieb am 30.11.2009:

Ich habe ein Problem mit dem Bilderserver. Die Datein werden hochgeladen, aber nicht in die Datenbank eingtragen (Bilder) Noch was.: Ich habe die event-Klasse jetzt eventmanager.php genannt und in system/classes gespeichert, oder hattest Du einen anderen Speicherort vorgesehen?

Daniel schrieb am 30.11.2009:

Zweite Frage hat sich erledigt habe im Codeplex nachgeschaut. ^^

Hannes schrieb am 23.06.2010:

Hi, ich hab mal eine Frage: Die Funktion raiseEvent() Sollte doch eigentlich neu geworfene Events in die Datenbank eintragen, oder? Dazu müsste sie aber doch die Funktion addHandler() aufrufen. Das würde dann aber von den return-werten her nicht passen... Und überhaupt, wieso includierst du die files bei raiseEvent? MfG, Hannes

Hannes schrieb am 23.06.2010:

sry, ich habs kapiert ^^ Gute Methode, jetzt wo ichs verstanden habe. Mfg, nochmal Hannes