Archives for Februar 2008

J!-Gästebuche, Teil 2: Datenstruktur und Funktionen des Gästebuchs

Bei der Datenstruktur orientiere ich mich einfach am alten Gästebuch. Der Besucher kann also folgende Daten eintragen: Name, Nachricht, URL seiner Website, E-Mail Adresse. Dazu wird vom Server noch das Datum gespeichert. Als Website-Betreiber kann ich dann noch einen Kommentar abgeben. Zudem gibt es ein Feld mit einer eindeutigen ID und ein Feld mit dem man den Beitrag online bzw. offline schalten kann. IP-Adresse lasse ich aufgrund der verdachtsunabhängigen Vorratsdatenspeicherung weg. Sobald wir wieder eine Staatsform haben, in der die Rechte der Bürger berücksichtigt werden, kann man sich ja überlegen, ob man aus Sicherheitsgründen die IP-Adresse wieder speichert… Aber das ist ein anderes Thema.

Feldname Feldtyp Beschreibung
id int(11) mit auto_increment Integerfeld, welches den primären Schlüssel (eindeutiger Wert) enthält
name varchar(100) Textfeld (100 Zeichen) für den Namen des Besuchers
datum datetime Datumsfeld für das Eintragsdatum
nachricht text Textfeld für die Nachricht des Besuchers/Text des Gästebucheintrags
email varchar(100) Textfeld (100 Zeichen) für die E-Mail-Adresse des Besuchers
website varchar(200) Textfeld (200 Zeichen) für die Website-Adresse des Besuchers
Nicht jeder hat eine eigene Domain, daher mal lieber bis zu 200 Zeichen.
kommentar text Textfeld für einen Kommentar des Webmasters
sichtbar set(‚ja‘,’nein‘) „Schalter“, um einen Eintrag anzuzeigen („ja“) oder zu sperren („nein“)

Meine install.sql:
DROP TABLE IF EXISTS `#__gaestebuch`;
CREATE TABLE `#__gaestebuch` (
id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 100 ) NOT NULL ,
`datum` DATETIME NOT NULL ,
`nachricht` TEXT NOT NULL ,
`email` VARCHAR( 100 ) ,
`website` VARCHAR( 200 ) ,
`kommentar` TEXT,
`sichtbar` SET( 'ja', 'nein' ) DEFAULT 'ja' NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE=MyISAM AUTO_INCREMENT DEFAULT CHARSET=utf8;

Und die passende uninstall.sql dazu:
DROP TABLE IF EXISTS `#__gaestebuch`;

Damit diese Daten auch genutzt werden können, wird nun das Model benötigt. Dazu wird erstmal eine Klasse GaestebuchModelGaestebuch erzeugt. Die meisten Funktionen stehen bereits in der Klasse Joomla!-Klasse JModel zur Verfügung. Um diese zu erben, verwende ich das Schlüsselwort extends und füge meine eigenen Variablen und Funktionen hinzu.

jimport( 'joomla.applicatoin.component.model' );
class GasetebuchModelGaestebuch extends JModel {
..
}

Als zusätzliche Variable habe ich $_eintraege.

var $_eintraege;

Dazu kommen noch zwei Funktionen. Die erste Funktion wird nur intern verwendet, um die SQL-Abfrage zu erzeugen. Daher nenne ich sie _abfrageErzeugen().

function _abfrageErzeugen()
{
$abfrage = 'SELECT * FROM #__gaestebuch WHERE sichtbar = "ja" ORDER BY datum DESC;';
return $abfrage;
}

Dazu kommt jetzt noch die eigentlich Abfrage holeEintraege().

function holeEintraege()
{
// Hole die Daten, falls sie noch nicht geholt wurden
if (empty( $this->_eintraege ))
{
$abfrage = $this->_abfrageErzeugen();
$this->_eintraege = $this->_getList ( $abfrage );
}
return $this->_eintraege;
}

Die Komplette site/models/gaestebuch.php gibt es, sobald ich die Komponente fertig entwickelt und getestet habe 😉

Als nächstes habe ich mir überlegt, welche Aufgaben meine Komponente erledigen muß.

Ausgabe der Nachrichten
Die sichtbaren/freigeschalteten Beiträge werden in umgekehrter chronolgischer Reihenfolge (neuster Eintrag oben) ausgegeben. Die Kommentare des Website-Betreibers werden direkt unterhalb des Beitrags angezeigt.

Eintragen von Nachrichten durch den Besucher
Der Besucher soll die Möglichkeit haben, sich in das Gästebuch einzutragen. Dabei müssen die Eintragungen überprüft werden. Name und Nachricht sind Pflichtfelder. Die URL der Website und die E-Mail-Adresse sind optional. Aus Sicherheitsgründen wird der HTML-Code in Nachrichten gefiltert. Die URL und die E-Mail-Adresse muß auf Gültigkeit überprüft werden – wobei eine automatische Korretkur bei fehlendem „http://“ wünschenswert wäre. Eintragungen wie „hab keine“ sollten natürlich nicht verlinkt werden.
Die Eintragung wird erstmal in der Datenbank mit sichtbar=nein gespeichert. Der Website-Betreiber erhält automatisch eine E-Mail mit der Bitte um Prüfung und Freischaltung.

Administration der Nachrichten
Der Website-Betreiber hat die Möglichkeit, Gästebucheinträge zu kommentieren, zu bearbeiten, zu sperren bzw freizuschalten oder auch zu löschen. Dabei gibt es eine Übersicht der Einträge und eine Detail-Ansicht für jeden Beitrag.
In der Übersicht gibt es die Möglichkeit mehrere Beiträge auszuwählen und diese dann zu sperren/freischalten oder auch löschen („Masseneditiermodus“).
In der Detailansicht kann zusätzlich noch der Beitrag bearbeitet und kommentiert werden.

In Teil 3 werde ich jetzt die Gästebuchkomponente soweit erstellen, dass diese bereits in Joomla! installiert werden kann und die Gästebucheinträge aus der Datenbank ausgibt.

Inhaltsübersicht:

Teil 1: Der Aufbau von Joomla! 1.5 Komponenten
Teil 2: Datenstruktur und Funktionen des Gästebuchs
Teil 3: Die Einträge ausgeben
Teil 4: Neue Einträge eintragen
Teil 5: Die Administration der Einträge
Teil 6: Die Sicherheit überprüfen

Programmierung: Notiz an mich

Meine Vorgehensweise beim Gästebuch ist zum Ausprobieren der Joomla 1.5 Komponenten-Entwicklung vielleicht nicht ganz so sinnvoll. Es macht zwar Sinn, im Vorfeld die Struktur und Funktionen zu planen, bevor man dies dann programmiert – aber ich habe nicht Informatik studiert und bin lieber ein Script-Freak. Wenn ich programmiere, dann vertraue ich [Link Auf getDigital.de Webshop] der Macht. Die Source umgibt mich. Sie ist da und will durch meine Finger zu neuen Webapplikationen erwachen. Kalte, emotionslose Programmierung ist eigentlich nicht mein Stil. Ich programmiere nach Gefühl. Ich bin halt ein Geek 😉

Okay, bei größeren Projekten ist so eine Planung schon wegen der Wartbarkeit sinnvoll. Aber ich bin lieber der Kesselflicker. Meine Scripte funktionieren einfach *g* – und wenn ich etwas größeres brauche, dann nehme ich einfach Open Source Anwendungen, die ich mit meinen rumgescripte an meine Bedürftnisse (oder die meiner Kunden) anpassen kann.

Zum Einstieg in die Programmierung von Webapplikationen haben die Macher des „Hello World“-Tutorials den verständlicheren und einfacheren Weg gewählt. Zuerst haben sie einfach nur das Ergebnis auf der Seite angezeigt und dann das Ergebnis Schritt für Schritt über das Model in die Datenbank verschoben. Das ist nachvollziehbar und verständlich. Und man hat bereits nach dem ersten Teil etwas, was man anschauen kann. Den ersten Erfolg. Bei mir ist das erst ab Teil 3. Und davor im Prinzip nur (erfolglose) Theorie.

Dabei müßte ich dies als ausgebildeter Übungsleiter A besser wissen. Aber ich mache trotzdem erstmal wie geplant weiter. Wenn ein brauchbares Ergebnis rauskommt, werde ich das ganze nochmal überarbeiten und als verständlicheres Tutorial (welches bei den ersten Schritten hilft) bei mir auf die Website packen 😉 Ob jemand jetzt anhand meines Tutorials in der Lage sein wird, Komponenten für Joomla! entwickeln zu können? Keine Ahnung. Wenn es jemanden hilft, dann hat es sich schon rentiert. Ich gehe mal davon aus, dass es zumindest mir hilft. May the source be with you.

J!-Gästebuch, Teil 1: Der Aufbau von Joomla! 1.5 Komponenten

Nun zum Teil 1 meiner kleinen Serie. Beim Aufbau von Joomla! 1.5 Komponenten orientiere ich mich an den Dateien des vierten „Hello World“-Beispiels. Hier die Struktur, die in der ZIP-Datei enthalten ist:

admin/controllers/hello.php
admin/models/hello.php
admin/models/hellos.php
admin/tables/hello.php
admin/views/hello/tmpl/form.php
admin/views/hello/view.html.php
admin/views/hellos/tmpl/default.php
admin/views/hellos/view.html.php
admin/admin.hello.php
admin/controller.php
admin/install.sql
admin/uninstall.sql
site/models/hello.php
site/views/hello/tmpl/default.php
site/views/hello/view.html.php
site/controller.php
site/hello.php
hello.xml

Das sind schonmal sehr viele Dateien, oder? Die ganzen leeren index.html-Dateien habe ich nicht eingetragen. In jedem Verzeichnis sollte aus Sicherheitsgründen immer eine leere index.html-Datei sein, damit sichergestellt ist, dass das Verzeichnis nicht durchsucht werden kann.

Die Komponente ist grundsätzlich mal in zwei Verzeichnisse aufgeteilt: site und admin. Man könnte auch Frontend und Backend sagen. Das Verzeichnis site enthält die Dateien, welche für die Website benötigt werden. Unter admin befinden sich alle Dateien, die zur Verwaltung im Administrator verwendet werden. Wichtig ist, dass z.B. Bilder, die in der Website und im Administrator verwendet werden im site Verzeichnis liegen, da das administrator-Verzeichnis aus Sicherheitsgründen durch ein zusätzliche Webserver Authentication (siehe .htaccess) geschützt sein sollte.

site/hello.php
im site-Verzeichnis finden wir eine hello.php. Diese Datei ist der Einstieg für Joomla! in die Komponente. Wenn die Komponente gaestebuch heißt, dann muß diese Datei dementsprechend gaestebuch.php genannt werden. Der Dateiname setzt sich immer aus dem Namen der Komponente und der Erweiterung .php zusammen: <Komponente>.php.

site/controller.php
Im gleichen Verzeichnis befindet sich noch unserer Haupt-Controller (controller.php). Diese Datei bearbeitet die Benutzereingaben (Bei Websites die Anfragen an den Webserver), ändert die Daten im Model und gibt das Ergebnis an das Ausgabescript (View) weiter.

site/models/hello.php
Zusätzlich gibt es noch den Unterordner models, indem sich die Datenmodelle befinden. Im „Hello World“-Beispiel gibt es nur ein Datenmodell.

site/views/hello/view.html.php
Das Verzeichnis views enthält zusätzlich für jede Ansichtsmöglichkeit ein Unterverzeichnis. Im admin-Verzeichnis gibt es beispielsweise eine Übersicht alles „hellos“ und die Detailansicht „hello“. Die Datei view.html.php erhält die notwendigen Daten vom Controller und gibt diese an das Template weiter.

site/views/hello/tmpl/default.php
Das Template enthält den HTML-Code und gibt die Daten aus. Dort befindet sich auch die Darstellungslogik (z.B. for-Schleifen um mehrere Datensätze auszugeben).

admin/admin.hello.php
Das admin-Verzeichnis hat fast die gleiche Struktur. Nur die Einstiegsdatei heißt in diesem Fall admin.hello.php. Beim Gästebuch heißt die Datei admin.gaestebuch.php. Der Aufbau des Dateinamen sieht daher wie folgt aus: admin.<Komponente>.php.

admin/install.sql und admin/uninstall.sql
Zusätzlich befinden sich noch die SQL-Dateien im Admin-Verzeichnis. Diese Dateien enthalten (wie die Erweiterung .sql schon vermuten läßt) den SQL-Code zum erzeugen bzw. zum Löschen von Tabellen in der Datenbank.

hello.xml
Zu guter Letzt haben wir noch die XML-Datei. Der Dateiname setzt sich ebenfalls wieder aus dem Namen der Komponente und der Erweiterung .xml zusammen: <Komponente>.xml. Dort sind Meta-Informationen und auch die Installations bzw. Deinstallations-Anweisungen für Joomla! enthalten.

Im nächsten Teil werde ich mich mit der Datenstruktur und des Models beschäftigen.

Inhaltsübersicht:

Teil 1: Der Aufbau von Joomla! 1.5 Komponenten
Teil 2: Datenstruktur und Funktionen des Gästebuchs
Teil 3: Die Einträge ausgeben
Teil 4: Neue Einträge eintragen
Teil 5: Die Administration der Einträge
Teil 6: Die Sicherheit überprüfen

Enwicklung von Joomla! 1.5 Komponenten

Ich habe mir jetzt auf meinem Testserver das neue Joomla! 1.5 installiert. Das ganze Web Content Management System wirkt jetzt viel smarter als früher.

Der Aufbau von Komponenten hat sich jedoch stark verändert. Wie weit jetzt die populären Komponenten Joomlaboard oder auch Community Builder installiert werden können, ist mir leider nicht klar. Bisher gibt es nur sehr wenige Joomla! 1.5 Komponenten. Aber das macht nichts, ich kann ja auch ein wenig programmieren 😉

Aber erstmal muß ich mich dazu in die Struktur der Komponenten einarbeiten. Um Joomla! 1.5-Komponenten zu programmrieren, muß man erstmal das Architekturmuster Model-View-Controller (zu Deutsch: Modell-Präsentation-Steuerung, kurz MVC) verstehen. Grob habe ich eigentlich schon seit langen versucht, die Programmierlogik und die Ausgabe zu trennen – wobei ich dies aus Faulheit meist in einer Datei gemacht hatte. Oben war die Datenbankabfrage und die Logik und im unteren Bereich der Datei die komplette Ausgabe. Aber bedenkt bitte, dass „Ausgabe“ nicht bedeutet, dass dort kein PHP-Code stehen darf. Es gibt auch eine Ausgabelogik (meist einfache Kontrollstrukturen wie if oder while, for…), die natürlich in der Ausgabe stehen sollte. Aber mal wieder zurück zum MVC.

Im Joomla! Developer Network habe ich (nachdem ich ein wenig gesucht hatte…) ein kleines „Hello World“-Beispiel gefunden. An diesem Beispiel kann ich mich jetzt orientieren. Man braucht für eine Komponente mindestens fünf Dateien (die leeren index.html für jedes Verzeichnis nicht mitgerechnet).

Als erstes werde ich wohl erstmal wieder ein Gästebuch programmieren – ähnlich wie ich dies im März 2003 angefangen hatte ;-). Jedoch werde ich mich (weitesgehend) an die Joomla!-Entwickler-Standards halten – vorallem, was die Sicherheit angeht. Wobei ich beim Einrücken von Code gerne den Tab verwende und eigentlich nicht mit Leerzeichen als Zeileneinzug arbeite, aber vermutlich kann man das im UltraEdit auch irgendwo einstellen 😉

Folgende Aufteilung habe ich mir dazu überlegt.

Teil 1: Der Aufbau von Joomla! 1.5 Komponenten
Teil 2: Datenstruktur und Funktionen des Gästebuchs
Teil 3: Die Einträge ausgeben
Teil 4: Neue Einträge eintragen
Teil 5: Die Administration der Einträge
Teil 6: Die Sicherheit überprüfen

This is a demo store for testing purposes — no orders shall be fulfilled.