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

Plugin (de)aktivierung (CMS)

Code & Blog Logo

Code & Blog Logo

Damit wir Plugins in unserem CMS richtig nutzen können, müssen wir sie aktivieren. Dafür habe ich vorgesehen, dass es pro Plugin die Dateien activate.php und deactivate.php gibt. Diese erstellen dann Tabellen registrieren Events usw..

Da wir wissen möchten, welche Plugins aktiviert sind, müssen wir diese in die DB eintragen. Dafür gibt es nun die neue Tabelle cms_activated_plugins. Sie hat nur eine Spalte und zwar das Verzeichnis. Wenn ein Plugin-Verzeichnis darin steht ist das Plugin aktiviert, anonsten nicht. Das ist der Create-String:

CREATE TABLE `cms_activated_plugins` (
`path` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `path` )
) TYPE = MYISAM ;

Kommen wir zur Datei /system/classes/plugininfo.php. Diese hat bereits die Funktion isActivated. Diese lieferte bisher immer nur false zurück, dass soll sich natürlich ändern. Zusätzlich gibt es noch die Funktionen activate und deactivate, die den Datensatz eintragen / löschen und die Aktivierungsdateien importieren.

Der neue Quelltext für diese Datei ist so:

<?PHP
  class PluginInfo{
    public $path              = '';
    public $name              = '';
    public $description       = '';
    public $authorName        = '';
    public $authorLink        = '';
    public $version           = '';
    public $configurationFile = '';
    
    function isActivated(){
      global $dbpraefix;
      $path = mysql_real_escape_string($this->path);
      $res = mysql_query("SELECT COUNT(*) FROM ".$dbpraefix."activated_plugins WHERE path = '".$path."'");
      if($row = mysql_fetch_row($res)){
        return $row[0] > 0;
      }
      else{
        return false;
      }
    }
    
    function activate(){
      global $dbpraefix;
      $path = mysql_real_escape_string($this->path);
      @include("../system/plugins/".$path."/activate.php");
      return mysql_query("INSERT INTO ".$dbpraefix."activated_plugins (path) VALUES ('".$path."')");
    }
    
    function deactivate(){
      global $dbpraefix;
      $path = mysql_real_escape_string($this->path);
      @include("../system/plugins/".$path."/deactivate.php");
      return mysql_query("DELETE FROM ".$dbpraefix."activated_plugins WHERE path = '".$path."'");
    }
  }
?>

Kommen wir für heute zur letzten Datei: admin/includes/plugins.php. Diese muss nun die Aktivierungsfunktionen aufrufen und das Plugin damit aktivieren. Der neue Quellcode dafür sieht so aus:

<?PHP
  $plugins = new PluginList();
  $plugins->loadAll();
  foreach($plugins->plugins as $plugin){
    if($_GET['activate'] == $plugin->path){
      $plugin->activate();
    }
    elseif($_GET['deactivate'] == $plugin->path){
      $plugin->deactivate();
    }
    ?>
      <h2><?PHP echo $plugin->name; ?></h2>
      <p><?PHP echo $plugin->description; ?></p>
      <p style="font-size:80%">
        <?PHP echo $plugin->version; ?>
        <a href="<?PHP $plugin->authorLink; ?>">
          <?PHP echo $plugin->authorName; ?>
        </a>
      </p>
      <?PHP
        if($plugin->isActivated()){
          echo "<a href="/admin/index.php?page=plugins&deactivate=".urlencode($plugin->path)."">Deaktvieren</a>";
        }
        else{
          echo "<a href="/admin/index.php?page=plugins&activate=".urlencode($plugin->path)."">Aktvieren</a>";
        }
      ?>
    <?PHP
  }
?>

Ich denke, dass es sich nach diesem Schritt nun lohnt ein Plugin zu entwickeln. Was noch fehlt ist das Werfen von Events an verschiedenen Stellen, damit sich das Plugin richtig gut einbettet. Wer will, kann ja mal ein paar Plugin Ideen/fertige Plugins im Forum des CMS Tutorial vorstellen.

Kommentare

Stefan Wienströer schrieb am 05.12.2009:

Das ist ja der 100te CMS Artikel^^ Jubiläumsbeitrag gibt's dann morgen (mit der Entscheidung des Namens)

Daniel schrieb am 05.12.2009:

Sollte der Primärschlüssel nicht auch path heissen. Der Query wird sonst mit Fehlermeldung abgebrochen. PS.: Mein Problem mit den Bildern existiert immer noch. Upload funz aber das Eintragen in die Datenbank nicht.

Stefan Wienströer schrieb am 05.12.2009:

Ja sollte er. Hatte den erst dir genannt und mich später umentschieden, werd's ersetzen. Wg den Bildern bin ich gerade dran, dass nachzuvollziehen, jemand anders hatte das selbe Problem.