Inhaltsverzeichnis

Schritt 1: Grundfunktionalität

Zunächst soll die Grundfunktionalität implementiert werden:

Ein erstes Datenbankmodell

Ein einfaches Datenbankmodell könnte zunächst so aussehen:


(A1)

Erstelle Tabellen in deiner Datenbank, die dieses Modell abbilden.

Mehr Klassen bitte

Wenn man nun über die OOM unseres Projekts nachdenkt, macht es zunächst Sinn, dass man zwei Klassen verwenden möchte:

Beide Klassen müssen auf die Datenbank zugreifen.


(A2)

Refactoring des bisherigen Beispielplugins

Um deinen Plugin-Code besser zu strukturieren und auf die kommenden Anpassungen vorzubereiten, gehe wie folgt vor:

Automatisches Laden benötigter Klassendefinitionen

Wenn künftig weitere Klassendefinitionen zu unserem Projekt hinzukommen, wird es immer aufwändiger, alle benötigten Dateien von Hand im Kopf der Steuerklasse1) einzubinden.

Man kann das durch einen "Autoloader" erledigen lassen. Damit das klappt, müssen ein paar Konventionen eingehalten werden:

Wenn man sich an diese Regeln hält kann man anstelle des include Statements zu Beginn der syntax.php folgenden Code einfügen:

// Klassendateien mit Hilfe eine anonymen Funktion als
// Autoloader einbinden
spl_autoload_register(function ($class)
   {
    // DokuWiki arbeitet stets in seinem DocRoot, wir suchen die Dateien 
    // aber in einem UVZ des Plugin-Verzeichnisses -anpassen wenn das 
    // Plugin nicht "projekt" heißt!
    $plugin_dir=DOKU_PLUGIN . "/projekt/";
 
    // Wenn eine Klasse oder ein Interface noch nicht existiert
    // soll versucht werden, die passende Datei zu laden.
    if(!class_exists($class) or !interface_exists($class))
        {
            $file = $plugin_dir . 'class/' . $class . '.class.php';
            // Wenn die Datei nicht existiert, Fehler ausgeben.
            if(!file_exists($file))
               die ('Fehler beim automatischen Laden einer Klassendatei.<br />Es wurde erfolglos versucht die Klasse ' . $class . ' aus der Datei ' . $file . ' zu laden.');
            // Wenn die Datei existiert, laden
            require_once($file);
        }
   });

(A3)

Ersetze das Include-Statement durch den Code oben und versuche zu verstehen, was dieser macht.

Teste ob der Code tatsächlich automatisch Klassendateien nachlädt, indem du einen Fehlerfall, erzeugst: versuche dazu ein Objekt zu erzeugen, für das es keine Klassendefinition gibt, beispielsweise $benutzer = new bloguser();.


ÜbersichtSchritt 2 →


1)
unsere syntax.php