faecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:microblogging:step01:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:microblogging:step01:start [20.06.2021 14:52] – [Automatisches Laden benötigter Klassendefinitionen] sbelfaecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:microblogging:step01:start [24.06.2021 09:52] (aktuell) sbel
Zeile 6: Zeile 6:
   * Benutzer sollen die Liste ihrer Einträge angezeigt bekommen.   * Benutzer sollen die Liste ihrer Einträge angezeigt bekommen.
  
-===== Datenbankmodell=====+===== Ein erstes Datenbankmodell =====
  
 Ein einfaches Datenbankmodell könnte zunächst so aussehen: Ein einfaches Datenbankmodell könnte zunächst so aussehen:
Zeile 20: Zeile 20:
 Erstelle Tabellen in deiner Datenbank, die dieses Modell abbilden. Erstelle Tabellen in deiner Datenbank, die dieses Modell abbilden.
  
-===== Objektorientierter Datenbankzugriff reloaded =====+===== Mehr Klassen bitte =====
    
 Wenn man nun über die OOM unseres Projekts nachdenkt, macht es zunächst Sinn, dass man zwei Klassen verwenden möchte: Wenn man nun über die OOM unseres Projekts nachdenkt, macht es zunächst Sinn, dass man zwei Klassen verwenden möchte:
Zeile 36: Zeile 36:
   * Warum könnte das das hinsichtlich der Erweiterbarkeit des Projekts ungeschickt sein, so zu beginnen?   * Warum könnte das das hinsichtlich der Erweiterbarkeit des Projekts ungeschickt sein, so zu beginnen?
  
-==== Refactoring des bisherigen Beispielplugins ====+===== Refactoring des bisherigen Beispielplugins =====
  
 Um deinen Plugin-Code besser zu strukturieren und auf die kommenden Anpassungen vorzubereiten,  gehe wie folgt vor: Um deinen Plugin-Code besser zu strukturieren und auf die kommenden Anpassungen vorzubereiten,  gehe wie folgt vor:
Zeile 46: Zeile 46:
 </html> </html>
  
-  * Lege ein Unterverzeichnis ''class'' im Plugin-Ordner an.+  * Lege ein Unterverzeichnis ''class'' im Ordner deines Plugins an.
   * Verschiebe die Datei mit deiner Datenbank-Klasse in diesen Ordner und benenne sie um in ''mysqldb.class.php''   * Verschiebe die Datei mit deiner Datenbank-Klasse in diesen Ordner und benenne sie um in ''mysqldb.class.php''
   * Passe das ''include'' Statement in der ''syntax.php'' entsprechend an.   * Passe das ''include'' Statement in der ''syntax.php'' entsprechend an.
Zeile 59: Zeile 59:
   * Alle Klassen (und Interfaces) müssen in einer Datei ''class/<NAME>.class.php'' definiert werden.   * Alle Klassen (und Interfaces) müssen in einer Datei ''class/<NAME>.class.php'' definiert werden.
   * Die in den Dateien definierten Klassen müssen genau so heißen, wie die Dateien. Man darf also nicht die Klasse ''mysqldb'' in einer Datei mit dem Namen ''db.class.php'' definieren, sondern diese muss in der Datei ''mysqldb.class.php'' definiert werden.   * Die in den Dateien definierten Klassen müssen genau so heißen, wie die Dateien. Man darf also nicht die Klasse ''mysqldb'' in einer Datei mit dem Namen ''db.class.php'' definieren, sondern diese muss in der Datei ''mysqldb.class.php'' definiert werden.
 +
 +Wenn man sich an diese Regeln hält kann man anstelle des ''include'' Statements zu Beginn der ''syntax.php'' folgenden Code einfügen:
 +
 +<code php>
 +// 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);
 +        }
 +   });
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (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();''
 +
 +----
 +[[{}..:start|Übersicht]][[{|float-right}..:step02:start|Schritt 2 ->]]
 +---- 
 +
  
  
  • faecher/informatik/oberstufe/datenbanken/projekt/dokuwiki_plugin/microblogging/step01/start.1624200750.txt.gz
  • Zuletzt geändert: 20.06.2021 14:52
  • von sbel