Plugin in PHP – Klasse in OOP

Wie ich angekündigt habe, möchte ich euch meine Pluginklasse erneut vorstellen.
Diesmal aber in OOP.

Damit jedes Plugin verbindliche Klassen zur Verfügung stellt, erstellen wir ein Interface:

Datei IgPlugin.php

<?php
	interface IgPlugin
	{

		public function getName();
		public function setName($name);

		public function getVersion();
		public function setVersion();

		public function getAutor();
		public function setAutor();

		public function install();
		public function update($version);
		public function unistall();

		public function run();
	}
?>

Das Plugin ist dann folgendermaßen aufgebaut:

</pre>
<?php

	require_once("class/IgPlugin.php");
	
	class test implements IgPlugin
	{
		private $name = "TestPlugin";
	
		public function getName() { return $this->name; }
		public function setName($name){}
		
		public function getVersion(){}
		public function setVersion(){}
		
		public function getAutor(){}
		public function setAutor(){}
		
		public function install(){}
		public function update($version){}
		public function unistall(){}
		
		public function run(){ echo "Plugin l&auml;uft"; }
	}
	
?>

Die Datei gPlugin.php ist nun die Klasse für das Laden der Plugins:


<?php
	
	/**
	 * Klasse gPlugin
	 *
	 * Klasse zum Starten, Installieren, Updaten und Deinstallieren
	 * von Plugins
	 *
	 * @author Alexander Grüßung
	 * @version 2.0
	 */
	 
	class gPlugin
	{
		/**
		 * private field
		 */
		private $pluginName;
		
		/**
		 * private field
		 */
		private $pluginInstance;
	
		/**
		 * Konstruktor lädt Plugin in den Speicher
		 */
		public function __construct($pluginName)
		{
			$this->setPluginName($pluginName);
			$this->loadPlugin();
		}
		
		//Getter und Setter für PluginName
		private function setPluginName($pN) { $this->pluginName = $pN; }
		private function getPluginName() { return $this->pluginName; }
		
		//Getter und Setter für PluginInstance
		private function setPluginInstance($instance) { $this->pluginInstance = $instance; }
		private function getPluginInstance() { return $this->pluginInstance; }
	
		/**
		 * Funktion bindet Plugindatei ein und
		 * lädt Instanz in den Speicher
		 */
		private function loadPlugin()
		{
			if (file_exists($this->getPluginName().".php"))
			{
				require_once($this->getPluginName().".php");
				$name = $this->getPluginName();
				$this->setPluginInstance(new $name());
				
				if ( ($this->getPluginInstance() instanceof IgPlugin) == false)
				{
				 trigger_error("Interner Pluginfehler: Interface wird nicht implementiert", E_USER_ERROR);
				}
				
			}
			else
			{
				trigger_error("Plugin nicht gefunden", E_USER_ERROR);
			}
		}
		
		/**
		 * Plugin starten
		 */
		public function runPlugin()
		{
			//TODO Prüfen ob Plugin installiert ist
			$this->getPluginInstance()->run();
		}
	
	}
?>

Hier eine Beispieleinbindung:

<?php
	require_once("class/gPlugin.php");
	
	$p = new gPlugin("test");
	$p->runPlugin();
	
?>

 
Damit viel Spaß mit der Klasse!

gFramework bekommt ein neues Gesicht

Viele von euch werden das Designframework Bootstrap von Twitter kennen.

Bootstrap ermöglicht es ein kurzer Zeit eine gut aussehende, funktionale Seite auf die Beine zu stellen.
Und obwohl Bootstrap ein recht allgemeines Framework ist, so kann man viel daraus machen,
wie in dieser Galerie zu sehen ist.

Bootstrap hat es mir richtig angetan, und so entschied ich mich die neue Seite gVisions Projects darauf aufzubauen.
Und auch gFramework wird auf Bootstrap umgebaut.
Die Klasse gNavigation ist bereits fertig und wird die alte gMenu ablösen.

Da es in der Grundausführung von Bootstrap möglich ist mit einer einzigen Änderung in der CSS Datei die ganze Seite zu beeinflussen, wird dies ein Grundelement der neuen Templateengine sein.
Ein kleines Menu, wo man die Seite neu einfärben kann.

Grundelemente, wie Hero-Unit und Sidebar können vom Nutzer dann individuell angepasst und eingefügt werden.
Dafür werden, Beispiel Hero-Unit, neue BBCodes eingeführt.

[hero]…[/hero]

Auch ein Imageslider ist dann ohne Probleme möglich.

Und das ist das Einzige, was ich noch machen muss. Dann wird das gFramework veröffentlicht als Beta.

gFramework bekommt ein neues Gesicht weiterlesen

Ein Pluginsystem mit Paketserver in PHP – Teil 3

Ein Pluginsystem mit Paketserver in PHP – Teil 3

Nachdem wir nun wissen, wie ein Plugin aufgebaut ist und wir wir es im Frontend verwenden, müssen wir uns mit der Frage beschäftigen, wie wir die Plugins im Backend administrieren.

Generell ist meine Überlegung, dass das ACP eine PHP Datei hat, die je nach übergebener ID aus dem Pluginordner die Backenddateien nachlädt.

Ein Beispiel: Im ACP gibt es eine Datei plugin_list.php.
Rufen wir diese Datei auf, so erscheint eine Liste mit Plugins, wie hier:

Pluginliste

Von hier aus, kann man die Plugins administrieren.
Dazu ruft man dann plugin_verwalten.php?appid=X auf, dann erscheint, je nach Plugin, die entsprechenden ACP Seite.

Um  die plugin_list.php anzuzeigen, ist nicht viel nötig.
Der nötige SQL Befehl lautet:

SELECT * FROM plugins ORDER BY id;

Geben wir die Ergebnisse einfach als eine normale Liste aus:


$query = mysql_query("SELECT * FROM plugins ORDER BY id;");

$AppsNum = mysql_num_rows();
 $AppsTd="";
 while ($AppsArray = mysql_fetch_object($query)) {
 $color ="red";

 if ($AppsArray->activate=="1" || $AppsArray->activate=="true") { $color = "lightgreen"; }
 $AppsTd .= '<tr style="background-color:'.$color.';"><td style="width:20%;">'.$AppsArray->name.'</td><td "width:5%;">'.$AppsArray->version.'</td><td "width:45%;">'.$AppsArray->desc.'</td><td "width:35%;"><a href="plugin_verwalten.php?appid='.$AppsArray->id.'">Administrieren</a></td></tr>';
 }

 echo 'Installierte Erweiterungen:<br><div class="cel" style="height:auto;">
 <table style="width:100%;"><tr style="border: 1px black solid;"><td>Name</td><td>Version</td><td>Beschreibung</td><td>Optionen</td></tr> '.$AppsTd.'</table></div><br /><br />';

 

Die plugin_verwalten.php ist recht einfach aufgebaut, sie prüft nur, ob die angegebene ID konform und in der Datenbank existent ist und includiert dann die hinterlegten Dateien:


<?php

 /*
 Checke die Paratemter in der GET
 */

 if (!isset($_GET['appid']) OR !is_numeric($_GET['appid'])){
 trigger_error("Die Variable \"appid\" ist entweder nicht übergeben worden oder entspricht nicht den Vorraussetzungen.",E_USER_ERROR);
 }

$appid = $_GET['appid'];

 /*
 Schauen wir mal nach der und laden alle Daten in ein array() ^^
 Und natürlich wider zählen
 */

 $query = mysql_query("SELECT * FROM plugins WHERE ID = ".$appid);

 $row = mysql_fetch_object($query);

 $num = mysql_num_rows();

 /*
 Wenn jetzt $num = 0 oder > 1 ist, dan stimmt was nicht
 */

 if ($num != 1) {
 trigger_error("Die ID ist nicht vorhanden und/oder mehrmals vergeben. Dies macht eine eindeutige Identifikation unmöglich.",E_USER_ERROR);
 }

 /*
 So, dann schauen wir mal OptionFile an und laden die Datei hier rein^^
 */
 define("apppath",$row->path);
 require_once(apppath."/cp/index.php");

 /*
 Für mich ist die Sache damit erledigt :)
 */

Okay, nun wissen wir, wie wir die Backenddateien verwalten.

Im nächsten Teil installieren wir die Plugins via einem Updateserver.

Zur Hauptseite