Archiv

Artikel Tagged ‘oop’

Ein kleines Pluginsystem in PHP – Teil1

2. April 2010 3 Kommentare

Artikel wurde neu geschrieben und ist hier erreichbar.

OUTDATED: Dieser Text ist veraltet und wird in der Woche vom 16.01.2012 bis zum 22.01.2012 ersetzt.

In den folgenden 3 Teilen werd ich euch zeigen, wie Ihr euch relativ einfach ein PHP Pluginsystem schreibt.
Der hier veröffentliche Quellcode kann unter der Creative Commons 3.0 by-sa mit Namensnennung von “Alexander Grüßung” und Verlinkung auf www.gvisions.de (zB. in den Credits (nicht nur als Kommentar!)) genutzt und veröffentlicht werden.

Teil 1: Vorüberlegung & die Klasse

Nun, wenn man so überlegt, was muss ein Pluginsystem alles mitbringen, damit man mit diesem ordentlich arbeiten kann?

Ich finde ein Pluginsystem sollte leicht zu verstehen sein, modular aufbauend sein und Ressourcen schonen.

Auf die Architektur der Ordner in eurem Projekt gehe ich jetzt nicht ein, da diese für die Pluginklasse, welche ich geschrieben habe nicht relevant ist.
Aber als Information gebe ich hier mal meine Ordnerstruktur preis:

/ – root Verzeichnis des Projektes
/core – hier liegen die ganzen Klassen
/application/plugins – wie der name schon sagt

 

Die anderen Ordner sind irrelevant.
In dem Ordner Plugins bekommt jedes Plugin noch einen Unterordner, die Schwierigkeit besteht darin, das die Pluginentwickler Ihre Plugins unterschiedlich benennen.
Vorerst lasse ich dies aber außer Betracht und widme mich in Teil 3 nochmal dem ganzen.

Kommen wir nun zur Pluginklasse ansich:


<del><!--?php /* gPlugin class to manage plugins (c) Alexander Gruessung 2010 */ class gPlugin { public  $pluginName = ''; public  $pluginClass = ''; public  $sql = ''; public  $content = ''; function __construct($pluginName) { $this--->pluginName = $pluginName;</del>
<del> if ($this->isRegist()==false OR $this->isActive()==false) {</del>
<del> $this->pluginName = 'PluginNotFound';</del>
<del> }</del>
<del> require_once('application/plugins/'.$this->pluginName.'/'.$this->pluginName.'.php');</del>
<del> $this->pluginClass = new $this->pluginName();</del>
<del> }</del>
<del> /*</del>
<del> * public function getContent</del>
<del> * @name getContent</del>
<del> * @version 1.0</del>
<del> * @author Alexander Gruessung</del>
<del> * @parameters pluginname</del>
<del> */</del>
<del> public function getContent() {</del>
<del> $plugin = new $this->pluginName();</del>
<del> $this->content = $plugin->run();</del>
<del> return $this->content;</del>

<del> }</del>

<del> public function getTitel() {</del>
<del> return $this->pluginClass->getTitel();</del>
<del> }</del>

<del> private function isRegist() {</del>
<del> $plugin = $this->pluginName;</del>
<del> $sql = new db();</del>
<del> $sql->query("SELECT * FROM ".prafix."_plugins WHERE `filename` = '".$this->pluginName."'");</del>
<del> $num = $sql->num_rows();</del>
<del> if ($num!="") {</del>
<del> return true;</del>
<del> } else {</del>
<del> return false;</del>
<del> }</del>
<del> }</del>

<del> public function isActive() {</del>
<del> $sql = new db();</del>
<del> $plugin = mysql_real_escape_string($this->pluginName);</del>
<del> $sql->query("SELECT * FROM ".prafix."_plugins WHERE `filename` = '".$plugin."' AND `activate` = 'true'");</del>
<del> $row = $sql->fetch();</del>
<del> $num = $sql->num_rows();</del>
<del> if ($num=="" OR $row->activate=="false") {</del>
<del> return false;</del>
<del> } else {</del>
<del> return true;</del>
<del> }</del>
<del> }</del>

<del>}</del>

Die Klasse ist somit komplett.
Erklärungen, so denke ich, muss ich nicht viele geben.>
Kurz zur Datenbankstruktur:

id (int, primary) | name (varchar 500 [für beschreibung]) | filename (varchar 200 [dateiname des plugins]) | activate (varchar 4 [true oder false])

Die Verwaltung der Plugins ist also relativ einfach.
Jetzt mal ein beispielplugin:

<!--?php class HelloWorld {  public function __constructor() {  }  public function getTitel() {  return "Hello World";  } //hier eventuell Dateien includieren und/doder Funktionen einbinden.  public function run() {   $html = "Hello World";   return $html;  } } ?-->

Wie man also sieht, gibt die Funktion run() in meinem Fall den HTML Quelltext zurück.
Natürlich kann man Pluginintern noch mit Templates arbeiten. Das ist garkein problem und sollte auch für PHP Laien realisierbar sein.
Stichwort: preg_replace, preg_match und so weiter…

Aufgerufen werden Plugins folgendermaßen:

</pre>
&nbsp;

<!--?php $plugin = new gPlugin('HelloWorld');  //die Klasse deklaireren $pluginTitel = $plugin--->getTitel();</del></span>
<span style="color: #000000;"><del>$pluginContent = $plugin->getContent();
?>

 

Nun kann man mit diesen Variablen machen, was man will:)

Im nächsten Teil werde ich auf eine Installationsroutine eingehen.

Rss Feed Tweeter button Facebook button Technorati button Delicious button Flickr button Youtube button