phpChrystal :: SDK :: Modulerstellung
1. Klassen
Das interessante an phpChrystal ist, dass es sehr einfach durch neue Module, wir Foren, Turniermanagments, Serververwaltungen etc. ausgebaut werden kann.
Damit diese Prinzip auch bestehen kann, ist es nötig, dass der Mod-Programmierer Ordnung in das Code-Chaos bringt.
Aus diesem Grund sollten alle MySQL-Datenbankabfragen über die einzelnen Klassen geschehen. Dies hat den Vorteil, dass man zu einem späteren Zeitpunkt die Funktionen leichter anpassen kann und die einzelnen Code-Routinen lassen sich von anderen Mods wieder verwenden. (so ist z.B. denkbar, dass ein Turnier-Mod automatisch das Ergebnis des Turniers auf die Startseite postet, indem es die Funktion $cnews->setNews($opts) benutzt).
Alle Klassen sollten mit dem großen Buchstaben "C" beginnen, z.B. "C<MeinModul>".
2. Kommentare
Wenn man sich den Quellcode der einzelnen PHP-Dateien anschaut, erkennt man, dass Kommentare mit "// XML::" beginnen.
Diese Kommentarstruktur ermöglicht es, dass ein Parser (der z.Z. in Beta in Perl vorliegt) aus dem Quellcode eine einfach-verständliche Onlinedokumentation erzeugt.
Folgende XML-Anweisungen sind erlaubt (jeweils XML:: davor):
COMMENTEinfacher Kommentar, z.B. zum Beschreiben von wichtigen If-Abfragen.
CODECode-Auszug, der auf bestimmten Plattformen nicht funktioniert und deshalb auskommentiert wurde.
MODULName des erstellten Moduls/Plugins
VERSIONVersion des erstellten Moduls/Plugins
AUTHORDer Autor des Moduls/Plugins
INFOKurze Information über das Modul/Plugins
FUNC::<newfunc>Syntax der Funktion "newfunc"
DESC::<newfunc>Kurzbeschreibung der Funktion "newfunc"
VERSION::<newfunc>Version der Funktion "newfunc"
RETURN::<newfunc>Zurückgelieferte Werte von der Funktion "newfunc" (z.B. BOOL, $array, $string etc.)
2. Must-Have-Funktionen
Zuerst einmal müssen wir unterscheiden, was ein Modul und was ein Plugin ist: Als Modul wird die komplette Package bezeichnet. Als Plugin wird die auführbare PHP-Datei php<Modul>.php bezeichnet.
Wie schon erwähnt, ist es nötig, dass jeweils zwei Dateien erstellt werden: Einmal die ausführbare PHP-Datei, die im Hauptordner "/" liegt und HTML-, XML- o.ä. Code erzeugt.
Desweiteren existiert die Klassendatei "C<Modul>.php" im Ordner "/classes". Folgender Code-Ausschnitt sollte als Grundgerüst in die Klassendatei eingefügt werden:
		  <?php
			// XML::MODUL   (Modulname)
			// XML::VERSION (Version)
  			// XML::AUTHOR  (Autor)
  			// XML::INFO    (Kurzbeschreibung)


  			// XML::COMMENT (Vesrion, Name und Autor festlegen)
  			$VERSION = "x.xxx";
  			$NAME    = "C<Modulname>";
  			$AUTHOR  = "Autor";

  			// XML::COMMENT (Variablen laden)
			include_once("CConfig.php");
			include_once("CFunction.php");
			$cfunc = new CFunc;
			global $cfunc;

			// XML::COMMENT (Klasse festlegen)
			class C<Modulname>
			{
			  // XML::FUNC::getInfo ($self->getInfo())
			  // XML::DESC::getInfo (liefert Name, Autor und Version des Modules zurück)
			  // XML::VERSION::getInfo  (1.0)
			  // XML::RETURN::getInfo ($NAME,$AUTHOR,$VERSION)
			  function getInfo()
			  {
				global $NAME, $AUTHOR, $VERSION;

				return $NAME;
				return $AUTHOR;
				return $VERSION;
			  }
			}
		  ?>
		  
Die Funktion getInfo() ermöglicht es, dass andere Dateien Informationen über das Modul erhalten können.

Nun das Grundgerüst für die Plugins:

		  <?php session_start(); ?>
		  <?
		    // XML::MODUL   (php<Modulname>)
			// XML::VERSION (x.xxx)
			// XML::AUTHOR  (Autor)
			// XML::INFO    (Kurzinfo)

			// XML::COMMENT (Vesrion, Name und Autor festlege)
			$VERSION = "x.xxx";
			$NAME    = "php<Modulname>";
			$AUTHOR  = "Autor";

			// XML::COMMENT (Variablen laden)
			include("./classes/CCore.php");

			// XML::COMMENT (Variablen für das Modul festlegen)
			$opts[uid]        = "php<Modulname>.php";
			$opts[insertin]   = "mainamenu";
			$opts[showedname] = "Angezeigter Name";
			$opts[active] 	  = 1;
			$opts[url]        = "php<Modulname>.php";
			$opts[desc] 	  = "Beschreibung des Links";

  			// XML::COMMENT (Modul registrieren & $opts-Array löschen)
  			$cmod->registerMod($opts);
	  		unset($opts);

			// XML::FUNC::getInfo ($self->getInfo())
			// XML::DESC::getInfo (liefert Name, Autor und Version des Modules zurück)
			// XML::VERSION::getInfo  (1.0)
			// XML::RETURN::getInfo ($NAME,$AUTHOR,$VERSION)
			function getInfo()
			{
			  global $VERSION,$NAME,$AUTHOR;

			  return $NAME;
			  return $AUTHOR;
			  return $VERSION;
			}
		  ?>

		  <?php
  		    // XML::COMMENT (Grundgerüst der HTML-Seite ausgeben)
  		    $opts[banner_links] = "images/inf.jpg";
  		    $cdesign->createSiteHeader($opts);
  		    $cdesign->createSiteLayers($opts);
		  ?>

		  // XML::COMMENT (PHP/HTML/XML-Code)

		  <?php
  		    // XML::COMMENT (Seite abschließen)
  			$cdesign->createSiteFooter($opts);
		  ?>
		  
Wie man erkennt, gibt es die Funktion $cmod->registerMod(). Sie bewirkt, dass das Plugin in der Navigation angezeigt wird und auch bei Bedarf deaktivierbar ist.
Es ist auch möglich, dass man mehrere Plugins über eine Datei laufen lässt. Dazu muss man die Funktion $cmod->registerMod() nur mit den neuen Paramtern ausführen.
Folgende Paramter akzeptiert registerMod (ausführliche Beschreibung aller Funktionen folgt):
uid (szString)UID des Plugins, für gewöhnlich der Dateiname (required)
url (szURL)URL dse Plugins. required, falls das Plugin keine Administrationsoberfläche besitzt
showedname (szString)Angezeigter Linkname (required)
active (iVar)Bei "1" wird das Modul aktiviert, andernfalls deaktiviert
listorder (iVar)An welcher Stelle das Modul angezeigt wird. Sollte möglichst nicht angegeben werden, da phpChrystal sich die nächste Listorder selbst heraussuchen kann.
online (iVar)Bei "1" wird das Modul nur aktiviert, wenn die globale Konstante is_online auf "1" gesetzt wurde. Bei "0" ist es nur in der Offline-Variante von phpChrystal verfügbar. Bei "2" funktioniert es sowohl off- als auch online.
description (szString)Beschreibung des Plugins
admindesc (szString)Beschreibung der Administrationsoberfläche
is_admin (iVar)Bei "1" wird es in der Administrationsoberfläche angezeigt. Hierbei verweist der Link automatisch auf die Adresse "php<Modulname>.php?cmd=admin_overview"!
insertin (szString)Fügt das Modul entweder in das Usermenu (insertin=usermenu) oder in das Navigationsmenu (insertin=mainmenu) ein.

Nach der Registrierung des Moduls wird das Grundgerüst der Seite erstellt. Dabei existieren die Funktionen $cdesign->createSiteHeader($opts), $cdesign->createSiteLayers($opts) und $cdesign->createSiteFooter($opts). Zwischen createSiteLayers() und createSiteFooter() wird dein PHP-/HTML-/XML-Code platziert.

Bei der Erstellung neuer Klassen sollte man sich an einen gewisse Syntax halten: So sollten alle Funktionsnamen mit einem Kleinbuchstaben beginnen und danach alle Anfangsbuchstaben von Wörtern großgeschrieben werden.
Desweiteren sollten private Funktionen, die nur intern in der Klasse verwendet werden, mit einem "priv" vor dem Funktionsnamen gekennzeichnet werden (z.B. privMeineFunktion).