Joomla!

URLs in Joomla! 1.5 Komponenten

Ich „bastel“ an einigen Joomla!1.5-Komponenten herum. Dabei ist mir leider noch nicht klar, wie ich auf eine andere Ansicht oder einen anderen Controller innerhalb der eigenen Komponente verlinke.

Nehmen wir mal an, ich habe eine Komponenten, die „Episodenguide“ heißt. Die Komponenten wird also in J!1.5 mit index.php?option=com_episodenguide aufgerufen. Wenn ich dies in der Navigation einbaue, dann hängt das System automatisch noch die „Itemid“ an, welche dem jeweiligen Navigationspunkt entspricht: index.php?option=com_episodenguide&Itemid=1701.

Was soll angezeigt werden, wenn ich die Komponente aufrufe? Solange kein anderer Controller oder keine andere View gewählt wurde, soll er mir die Liste der Serien ausgeben. Wenn man eine Serie anklickt, soll die Liste der Episoden der Serie erscheinen.

Jetzt stehe ich hier noch vor einem anderen Problem. Brauche ich jetzt einen neuen Controller oder reicht eine andere View aus? Bis vor kurzem hatte ich auf diese Frage noch keine eindeutige Antwort gefunden. Eine andere View zu verwenden ist jedenfalls einfacher. Wobei aber auch die Regel „andere Daten = anderer Controller“ ansprechend gilt. Ich bin mir noch uneins. In meinem Beispiel ändere ich nur die View auf „serie“. Dazu brauche ich natürlich noch einen Parameter für die ausgewählte Serie – welche ich sinnigerweise ebenfalls „serie“ nenne. Die URL zum Aufruf einer Serie wäre folglich: index.php?option=com_episodenguide&Itemid=1701&view=serie&serie=TNG.

In meinem ersten Entwurf hatte ich leider die Itemid vergessen gehabt. Es wurde daher zwar die Liste der Episoden angezeigt – aber es war nicht mehr der Navigationspunkt gekennzeichnet. Hier habe ich nach langem Suchen aber eine schöne Lösungen für meine URLs in J!1.5 gefunden. Die Funktion sefRelToAbs($url); hatte leider nicht funktioniert. Vermutlich wurde diese Funktion durch JRoute::_( $url ); ersetzt. Was mir daran sehr gut gefällt, ich muß mich nicht mehr um den Namen der Komponente und auch nicht um die Itemid kümmern. Ich schreibe einfach: JRoute::_( ‚index.php?view=serie&serie=TNG‘); und erhalte damit dich richtige Verlinkung.

Ich werde mir die JRoute-Klasse noch etwas genauer ansehen. Ich denke, dass ich dort noch einige nützliche Funktionen finden werde, die mir bei meiner Komponenten-Entwicklung weiterhelfen. Der nächste Schritt wird sein, dass ich die URLs der Komponente Suchmaschinenfreundlich gestalte. Hier hoffe ich einige eingebauten Funktionen von Joomla! nutzen zu können. Schließlich gibt es eine Einstellungen in der Konfiguration „Suchmaschinenfreundliche URLs: Ja oder Nein“. Also muß es auch einige vorgefertigte Funktionen geben.

Für meinen Episodenguide kommt mir folgende Struktur in den Sinn:

  • Startseite der Komponente: /episodenguide/
  • Episodenliste einer Serie (z.B. TNG): /episodenguide/tng/
  • Episode (z.B. TNG – Das Kind): /episodenguide/tng/2×01.html oder vielleicht sogar /episodenguide/tng/2x01_das-kind.html

Aber das ist wohl noch ein weiter Weg bis dahin…

Update:

Ich habe gerade festgestellt, dass die Links ohne JRoute::_(); durch die eingebaute SEF-Funktion sauber umgewandelt werden. Wenn ich also direkt nur index.php?option=com_episodenguide&view=serie&serie=TNG schreibe, dann wird das automatisch zu /component/episodenguide/?view=serie&serie=TNG. Sobald die URL jedoch mit Slash („/“) beginnt (z.B. /index.php?option=…) findet keine Umwandlung statt. JRoute::_() erzeugt scheinbar eine URL, welche mit einem Slash („/“) beginnt und ist daher mit der eingebauten SEF-Einstellung nicht kompatibel :-(. Aber ich werde weitersuchen.

Warum Open Source Content Management Systeme besser sind

Es ist doch immer wieder erstaunlich, was mit Open Source so möglich ist. WordPress ist eigentlich eher ein kleines System – aber weitaus mächtiger als überteuerte Script-sammlungen die von windigen Geschäftsleuten als ECMS verkauft werden… Und wenn man dann mal etwas will, was seit Jahren überall standard ist, dann muß man es für diese Sonderlösung teuer entwickeln lassen. Und dann ist man noch an die wenigen (vielleicht auch nicht so guten) Agenturen gebunden. Das deprimiert mich immer wieder.

Bei den meisten Open Source-Anwendungen sieht das ganz anders aus. Nehmen wir mal Typo3 als Beispiel. Sehr weit verbreitet und sehr mächtig – und sicherlich auch für viele Unternehmen als Enterprise Content Management System bestens geeignet. Durch die sehr hohe Verbreitung gibt es bereits sehr viele Standard-Funktionalität (Forum, Suche, Formulargenerator, SEO-Erweiterungen etc.) als fertige Erweiterungen, die man nur noch herunterladen und installieren muß. Dazu kommen natürlich auch noch jede Menge Agenturen, die sich mit diesem System auskennen. Und falls mal eine schlechte Agentur dabei ist – dann einfach diese durch eine gute Typo3-Agentur austauschen. Und falls man mal eigene Erweiterungen benötigt, die es bisher noch nicht gibt – auch kein Problem. Läßt sich sehr leicht programmieren (zumindest für jemand, der sich ein wenig mit Programmierung auskennt).

Allerdings ist Typo3 für mich eine Liga zu hoch. Für die meisten meiner Kunden reicht WordPress oder Joomla! vollkommen aus. Diese sind auch einfacher zu bedienen. Ich konzentriere mich auf diese beiden System. Typo3 überlasse ich lieber den guten Agenturen 😉

Joomla! Templates

Ich hatte ja vor einiger Zeit angefangen, mich in die Komponenten-Entwicklung von  Joomla! 1.5 einzuarbeiten. Ab der 1.5er Version basiert das ganze sehr stark auf dem Model-View-Controller (MVC) Prinzip. Jedoch wurde meine Entwicklung eines Gästebuchs durch das ARG Final Mill unterbrochen *g*. Seitdem hatte ich nicht mehr über mein J!1.5-Gästebuch gebloggt. Das heißt aber nicht, dass ich daran nichts machen.

Inzwischen bin ich wieder dazu gekommen, ein wenig zu programmieren und habe auch angefangen, meinen guten alten Star Trek Episodenguide als Komponente für Joomla! 1.5 zu entwickeln. Die Ausgabe (View) klappt schonmal ganz gut. Aber für Bewertung und Kommentarmöglichkeit muß ich noch ein passendes Model aufbauen. Und es fehlt auch noch der ganze Admin-Bereich. Aber den sehe sowieso nur ich – und daher kann ich auch mit einem phpmyadmin die Inhalte administrieren *g*

Also mache ich mir mal lieber Gedanken über die Darstellung. Soll ich dem Episodenguide auch mal ein neues Design verpassen? Es gibt viele schöne Joomla!-Templates.

Vielleicht eine etwas mehr naturverbundenere Variante? Oder wieder etwas dunkleres? Bei der zweiten Variante sehe ich Picard als Jungen unter dem Baum liegend die Sterne beobachten. Das kann ich ja noch reinbauen *g*. Vielleicht auch mal eine ganz andere Variante. Wobei das meiner Meinung nach eher zu einem Egoblogger paßt. Blackbear 1.5.1 wäre ein guter Anfang für die Umsetzung meines jetzigen Designs.

Es sind hunderte von Templates. Schnell installiert und mit einem Klick aktivierbar. Tja, das ist der Nachteil an guten Content Management Systeme. Es gibt viele gute Entwickler, Erweiterungen und Templates. Einfach so. Frei. Aber man muß sich entscheiden. Große Auswahl. Die Qual der Wahl…

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.

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