Kapitel 15

Alles online!

Das gesamte Joomla! 1.5 Buch ist jetzt online lesbar, die Kapitel 13-17 beschäftigen sich mit dem Ausbau von Joomla!. Eigene Templates, Komponenten, Module, Plugins und eine komplette Website mit Joomla! von A-Z wird beschrieben!

Die Website hier wird auch langsam entdeckt.

Hier ein paar Screenshots aus Google Analytics vom 7.1.2008

Zugriffe der letzten zwei Wochen

aus Deutschland

aus Österreich

aus der Schweiz

15 Eigene Komponenten, Module, Plugins

Sie wollen mit Joomla! ein Problem lösen, für das es noch keine fertige Komponente gibt? Sie sind beispielsweise Autohändler und benötigen eine über die Joomla!-Administration pflegbare Auflistung Ihrer Gebrauchtwagen auf Ihrer Website? Oder eine Liste Ihrer Niederlassungen? Erweitern Sie einfach den Funktionsumfang um neue Komponenten, Module und Plugins. Was auf den ersten Blick sehr kompliziert aussieht, ist auch mit PHP-Anfängerwissen durchaus machbar.

Nach den Erfahrungen im Template-Bau in Kapitel 13 können Sie sich bestimmt schon vorstellen, was auf Sie zukommt. Diesmal liegt der Schwerpunkt allerdings nicht auf der Gestaltung, sondern auf der Programmierung.

Exkurs

Seit 01.01.2008 wird PHP 4 offiziell nicht mehr weiterentwickelt. Daher sollten Sie alle neuen Erweiterungen nach den Empfehlungen für die Version PHP 5 umsetzen. Joomla selbst ist in der Version 1.5 zu beiden Standards kompatibel. Wenn Sie mehr erfahren möchten: http://gophp5.org/.

15.0.1 Model – View – Controller

Mit Joomla! 1.5 wurde ein Konzept (Muster) für die Erstellung von Erweiterungen eingeführt: das Model-View-Controller-Muster, abgekürzt mit MVC. In der modernen Software-Entwicklung wird dieser Ansatz benutzt, um eine gewisse Ordnung in die Dinge zu bekommen.

Fast immer, wenn es um Aufgaben einer Software geht, benötigt man drei Bereiche:

  • Ein Datenmodell (engl. Model)
  • Eine Präsentation (engl. View)
  • Eine Programmsteuerung (engl. Controller)

Also liegt es nahe, diese drei Bereiche zu standardisieren. Da Programmierer auf solche Vorgaben eher allergisch reagieren, muss es echte Vorteile geben. Schauen wir uns die einzelnen Begriffe näher an.

Modell (Model)

Das Modell enthält die darzustellenden Daten. Die Herkunft der Daten ist unerheblich. Das Modell weiß nichts über die Ausgabe der Daten und hat auch keine Ahnung davon, wie diese Daten verändert werden.

Präsentation (View)

Die Präsentation stellt die Daten des Modells dar. Es muss eine Verbindung zwischen Modell und Präsentation geben, damit etwas dargestellt werden kann.

Steuerung (Controller)

Ja, was wird die Steuerung machen? Sie steuert das Ganze, reagiert auf Benutzereingaben oder andere Ereignisse, verwaltet die Modelle und die Präsentationen und gibt ihre Informationen an Präsentationen weiter.

15.0.2 Wo ist der Vorteil von MVC?

Wie bereits oben angedeutet, kommt gerade im Falle von Joomla! eine gewisse Ordnung in die Dinge. War es mit Joomla! 1.0 üblich, so zu programmieren, wie man Lust hatte, ist das mit Joomla! 1.5 nicht mehr erwünscht. Das hat nichts mit Bevormundung zu tun, sondern mit den Anforderungen der Benutzer, also mit Ihnen!

Sie wollen:

  • Barrierefreie Websites (overrides)
  • Suchmaschinenfreundliche URLs
  • Verteilte Authentifizierung
  • Internationalisierung
  • Sicherheit und Wartbarkeit
  • Wiederverwendbarkeit
  • mehr, mehr, mehr ...

Genau dieses mehr, mehr, mehr ist der Grund dafür, Ordnung im System zu schaffen. Solange Sie eine Firma mit einem Mitarbeiter haben, können Sie die Verwaltung noch im Kopf, mit einem Zettel und einem Stift erledigen. Haben Sie 10 Mitarbeiter, wird das schon schwierig. Wenn Ihre Firma jetzt vielleicht auch noch »brummt« und anfängt zu wachsen, brauchen Sie irgendein System zur Verwaltung!

MVC ist so ein System, in unserem Falle aber für Software. Es soll ein Programmdesign ermöglichen, das spätere Änderungen erleichtert und eine Wiederverwendbarkeit von Code ermöglicht. Es ist nicht unumstritten, aber auch nicht schlecht. Wenn sich alle dran halten, ist es gut!

Quell religiöser Diskussion sind natürlich Fragen wie:

  • Wohin soll meine Geschäftslogik? In den Controller oder in das Model?
  • Wie ist das mit wiederverwendbaren Dialogen? In den View?
  • Wie regeln wir mehrere Views (Tabelle, Einzelansicht, Frontend, Backend)?

Da eine vergleichbare Struktur in Joomla! 1.0 nicht existierte, ist dieses »Mantra« und vor allem seine Durchsetzung in meinen Augen die größte Leistung, die Joomla! 1.5 bzw. das Projektteam dahinter vollbracht haben. Die Zukunft wird zeigen, ob die Benutzer und Entwickler das auch so sehen. :-)

Wo ist er also, der Vorteil für alle?

Ganz einfach, Sie kennen das von sich selbst. Wenn die Küche, der Keller, das Auto, der Dachboden erst einmal aufgeräumt sind, ist es relativ einfach, diesen Zustand beizubehalten. Im Falle von Software ist das die Grundvoraussetzung, überhaupt wachsen zu können und pflegbar zu sein. Und Joomla! steht immer noch am Anfang seiner Möglichkeiten. Das heißt, wenn sich heute jemand (das Joomla!-Projektteam) die Arbeit gemacht hat und Joomla! 1.0 aufgeräumt hat, wird es für Sie in Zukunft deutlich einfacher, Joomla! an Ihre Wünsche anzupassen.

1Download siehe Anhang (hier in der Online Version direkt an der Kapitelseite).

 

15.5 Schlussbemerkung

Dieses Kapitel sollte Ihnen eine Übersicht über die Erstellung von Komponenten, Modulen und Plugins geben.

Weitergehende Entwicklungen lassen sich gut aus vergleichbaren Komponenten ableiten. Beispielsweise hat unsere Komponente auto nur eine Tabellenansicht. Suchen Sie sich eine Komponente mit Einzelansicht wie beispielsweise com_contact und erweitern Sie auto um diese Funktionalität.

Ebenso verhält es sich mit den Parameterangaben bei Modulen. Suchen Sie sich eine Vorlage und erstellen Sie Ihr eigenes Modul.

Was auf den ersten Blick kompliziert aussieht, entpuppt sich bei näherem Hinsehen als durchaus durchschaubar.

Ich wünsche Ihnen viel Spaß beim Ausprobieren!

15.4 Plugins

Zum guten Schluss wollen wir die Komponente noch in die allgemeine Suche von Joomla! integrieren. Um die Tabelle durchsuchbar zu machen, benötigen Sie ein Plugin vom Typ search. In diesem Fall hat nicht jedes Plugin ein Unterverzeichnis, sondern jeder Plugin-Typ. Wir arbeiten daher im Verzeichnis [PfadzuJoomla]/ plugins/search. Für ein Plugin benötigen Sie mindestens eine php-Datei mit der Logik (siehe Listing 15.26) und die xml-Datei mit der Beschreibung. Die Namen sollten Sie in diesem Fall von der Komponente ableiten. Also auto.php und auto.xml. Wenn Sie beispielsweise ein User-Plugin schreiben, werden Sie sich beim Namen nach der Funktion des Plugins richten, in unserem Fall besteht ein konkreter Bezug zur com_auto-Komponente. Auch die Plugins müssen in einer Tabelle angemeldet werden, in diesem Fall in der Tabelle jos_plugins. Das übernimmt natürlich der Installer für Sie. Die Suche ist sehr ausführlich und kann mit verschiedensten Parametern versehen werden. Der Quellcode gibt einen Eindruck von den Möglichkeiten. Da unsere Komponente nicht vermerkt, wann ein Auto eingefügt wurde oder wie viele Zugriffe ein Auto hat (wir haben ja noch keine Auto-Detailseite), bleiben hier viele Möglichkeiten der erweiterten Suche ungenutzt.

<?php
defined('_JEXEC')
or die( 'Restricted access' );
$mainframe->registerEvent('onSearch',
'plgSearchAuto');
$mainframe->registerEvent('onSearchAreas',
'plgSearchAutoAreas');
function &plgSearchAutoAreas() {
static $areas = array('auto' => 'Auto');
return $areas;
}

function plgSearchAuto( $text, $phrase='',
$ordering='', $areas=null ){
$db =& JFactory::getDBO();
$user =& JFactory::getUser();
if (is_array( $areas )) {
if (!array_intersect( $areas,
array_keys( plgSearchAutoAreas() ) )) {
     return
array();
}
}
$plugin =& JPluginHelper::getPlugin('search', 'auto');
$pluginParams = new JParameter( $plugin->params );
$limit = $pluginParams->def( 'search_limit', 50 );
$text = trim( $text );
if ($text == '') {
return array();
}
$section = JText::_( 'Auto' );
$wheres = array();
switch ($phrase){
case 'exact':
     $text = $db->getEscaped($text);
     $wheres2 = array();
     $wheres2[]= "LOWER(a.text)
LIKE '%$text%'";
     $wheres2[]= "LOWER(a.hersteller)
LIKE '%$text%'";
$where = '(' . implode( ')
OR (', $wheres2 ) . ')';
break;
case 'all':
case 'any':
   default:
$words = explode( ' ', $text );
$wheres = array();
foreach ($words as $word) {
$word = $db->getEscaped($word);
$wheres2 = array();
$wheres2[] = "LOWER(a.text)
LIKE '%$word%'";
$wheres2[] = "LOWER(a.hersteller)
LIKE '%$word%'";
$wheres[]  = implode( ' OR ', $wheres2 );
}
     $where= '('.implode(($phrase == 'all'
? ') AND ('
: ') OR ('), $wheres ) . ')';
     break;
}
switch ( $ordering ) {
default:
    $order = 'a.text ASC';
    break;
}
$query = "SELECT * FROM #__auto AS a"
."\n WHERE ( $where )"
."\n AND published = '1'"
."\n ORDER BY $order";
$db->setQuery( $query, 0, $limit );
$rows = $db->loadObjectList();
foreach($rows as $key => $row) {
$rows[$key]->href = 'index.php?option=com_auto&view=auto';
}
return $rows;
}
?>

Listing 15.26: auto.php

Die auto.xml-Datei enthält wieder die beschreibenden Daten über das Plugin für den Installer und sieht aus wie in Listing 15.27.

<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="search">
<name>Search - Auto</name>
<author>Hagen Graf</author>
<creationDate>November 2007</creationDate>
<copyright>(C) 2007 cocoate.com. All rights reserved.</copyright>
<license>GNU/GPL</license>
<authorEmail>hagen.graf@gmail.com</authorEmail>
<authorUrl>www.cocoate.com</authorUrl>
<version>0.1</version>
<description>Such Plugin fuer die Auto Komponente</description>
<files>
<filename plugin="auto">auto.php</filename>
</files>
</install>

Listing 15.27: auto.xml

Wenn Sie nun das Plugin installieren und im Menü Erweiterungen - Plugins aktivieren, ist Ihre Autoliste über das Suchfeld auf der Website durchsuchbar. Nach Eingabe eines Suchbegriffs werden die Felder text und hersteller in der Datenbank durchsucht und die Ergebnisse in der allgemeinen Suchmaske angezeigt (Abbildung 15.18).

Das search-Plugin Auto im Einsatz
Abbildung 15.18: Das search-Plugin Auto im Einsatz

Das search-Plugin ist bewusst einfach gehalten. An der Fundstelle in den Suchergebnissen sollte natürlich ein Link zur Einzelansicht des Listenelementes platziert werden, damit der Suchende dorthin weiterklicken kann. Da wir aber in unserer Komponente keine Einzelansicht vorgesehen haben, können wir hier natürlich keinen Link angeben.

15.3 Module

Ein Modul ist von der Idee her sehr viel einfacher. Module haben meist keine echte Administrationsoberfläche, sondern hin und wieder Parameter. Es geht immer um die Darstellung auf Ihrer Website und die Einbindung in Ihr Template. Module setzen meist auf vorhandenen Komponenten auf. Sie können also davon ausgehen, dass bestimmte Tabellen und ihre Inhalte bereits vorhanden sind und gepflegt werden können.

Um selbst ein Modul zu programmieren, benötigen Sie zwei Dateien. Eine Datei für die Logik und die Darstellung und eine XML-Datei für den Joomla!-Installer. Beide Dateien beginnen mit der Kennzeichnung mod_.

15.3.1 Quellcode

Schauen wir uns gleich die Quellcodes der Dateien an. Auch hier werden wieder Templates benutzt. Sie haben die Dateien

  • mod_auto.php
  • helper.php
  • tmpl/default.php
  • mod_auto.xml

Schauen wir uns auch diese Dateien an.

Einstiegspunkt (mod_auto.php)

Die Datei mod_auto.php dient als Steuerdatei für das Modul (Listing 15.22).

<?php
defined('_JEXEC')
or die('Restricted access');
require_once (dirname(__FILE__).DS.'helper.php');
$auto = modAutoHelper::getAuto($params);
require(JModuleHelper::getLayoutPath('mod_auto'));
?>

Listing 15.22: mod_auto.php

Hier wird kein Basis-Controller, sondern eine Helper-Klasse eingebunden.

Helper-Klasse (helper.php)

Die Helper-Klasse kombiniert den Controller und das Model (Listing 15.23).

<?php
defined('_JEXEC')
or die( 'Restricted access' );
class modAutoHelper{
function getAuto(&$params){
global $mainframe;
$db  = &JFactory::getDBO();
$query = "SELECT *"
         . "\n FROM #__auto"
         . "\n WHERE published = 1"
         . "\n LIMIT 0,5"
        ;
$db->setQuery( $query );
$rows = $db->loadObjectList();;
$auto = "<ul>\n";
if ($rows) {
     foreach ($rows as $row){
$auto .= "<li>".$row->text."</li>\n";
   }
}
$auto .= "</ul>\n";
return $auto;
}
}
?>

Listing 15.23: helper.php

In der Helper-Klasse findet nacheinander die Abfrage der Daten auf die Aufbereitung in einer for-Schleife statt.

Template (tmpl/default.php)

In diesem ganz einfachen Konstrukt wird die Variable $auto aus der Helper-Klasse einfach nur ausgegeben. Sie könnten genauso gut die for-Schleife aus der Helper-Klasse hier durchführen und damit mehr Einfluss auf den auszugebenden HTML-Code nehmen und einem Template-Designer ermöglichen, den Quellcode zu überschreiben (Listing 15.24).

defined('_JEXEC') 
or die( 'Restricted access' ); ?>
<?php
echo $auto;
?>

Listing 15.24: tmpl/default.php

mod_auto.xml

Um das Modul installieren zu können, benötigen Sie wie bei der Komponente alle für den Joomla!-Installer relevanten Daten in einer XML-Datei (Listing 15.25).

<?xml version="1.0" encoding="utf-8"?>
<install type="module" version="1.5.0">
<name>Auto</name>
<author>Hagen Graf</author>
<creationDate>November 2007</creationDate>
<copyright>(C) 2007 cocoate.com All rights reserved.</copyright>
<license>GNU/GPL</license>
<authorEmail>hagen.graf@gmail.com</authorEmail>
<authorUrl>www.cocoate.com</authorUrl>
<version>0.1</version>
<description>Auto Modul</description>
<files>
<filename module="mod_auto">mod_auto.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
<filename>tmpl/index.html</filename>
</files>
</install>

Listing 15.25: mod_auto.xml

15.3.2 Installation

Kopieren Sie alle Dateien in ein Unterverzeichnis und verpacken Sie dieses Verzeichnis in einem zip-Paket mit dem Namen mod_auto.zip. Die zip-Datei können Sie jetzt mit dem Joomla!-Installer wie gewohnt installieren und, wenn Sie wollen, zum Download für andere Benutzer bereitstellen. Bevor Sie das in Ihrer eigenen Installation tun, müssen Sie die per Hand erstellte Variante über den Joomla!-Installer deinstallieren. Klicken Sie dazu auf Erweiterungen - Installieren/Deinstallieren, markieren Sie Ihre Komponente und klicken Sie auf das Icon Deinstallieren.

Nach der Installation müssen Sie das Modul im Menü Erweiterungen - Module aktivieren.

15.3.3 Ansicht auf der Website

Auf Ihrer Website sehen Sie jetzt an der ausgewählten Position die Einträge aus der Tabelle jos_auto (Abbildung 15.17).

Modul auto auf der Website
Abbildung 15.17: Modul auto auf der Website

Inhalt abgleichen