Open Source im professionellen Einsatz
Linux-Magazin 11/2013
© Frank Peters, 123RF.com

© Frank Peters, 123RF.com

Erweiterungen im PHP-CMS Contao

Schneller war keiner

Binnen eines Tages konnte der beauftragte Contao-Experte Code vorlegen, der die Programmieraufgabe löst. Mängel bei der verfügbaren Dokumentation nehmen jedoch Außenstehenden die Chance, Erweiterungen in vergleichbarer Zeit auf die Beine zu stellen.

995

Contao [1] ist ein freies Content-Management-System, das im Gegensatz zu vielen seiner Kollegen seitenorientiert arbeitet. Dabei legt der Administrator zunächst die Seitenstruktur des Internetauftritts fest und füllt dann die Seiten nach und nach mit Inhalten. Contao erschien 2004 unter dem Namen Typolight. Nutzer verwechselten es jedoch häufig mit Typo3, zudem deutete "light" auf ein funktionsarmes System hin – fälschlich.

Typolight-Erfinder und -Hauptentwickler Leo Feyer wechselte deshalb mit der Version 2.6 zum weniger missverständlichen Namen Contao. Seit 2012 betreut die Weiterentwicklung die dafür in der Schweiz gegründete Contao Association [2]. Obwohl sich das leicht erweiterbare und flott agierende CMS steigender Beliebtheit erfreut, erreicht es bei Weitem nicht den Verbreitungsgrad seiner direkten Konkurrenten Joomla oder Drupal.

Contao steht unter der GNU LGPL, für 500 Euro lässt sich aber auch eine kommerzielle Lizenz erwerben, aus der Lizenznehmer sämtliche Hinweise auf Contao und Leo Feyer entfernen dürfen. Die Implementierung der Beispielaufgabe lief unter der bei Redaktionsschluss aktuellen Versionsnummer 3.1.2, als Testsystem diente Ubuntu 13.04.

Modul unter Modulen

Die Inhalte einer Webseite erzeugen in Contao so genannte Module. Sie zapfen die Datenbank an, gießen dann die fertigen Daten und Texte in einen kleinen Schnipsel HTML-Code und übergeben diesen dem Content-Management-System. Contao setzt dann aus den angelieferten HTML-Stücken nach einem Bauplan die komplette Seite zusammen. Auch die kleine Beispielaufgabe löst folglich ein Modul. Es fragt die anstehenden Feste beim Dienst ab, bereitet sie auf und gibt sie in einer schicken Tabelle aus.

Contao selbst enthält einen Extension-Creator, der das Code-Skelett eines neuen Moduls ausspuckt. Der Programmierer gibt lediglich seinem Modul einen neuen Namen, hakt ab, ob es sich um ein Modul für das Front- oder Backend handelt, und legt fest, welche Sprachen das Modul später sprechen soll. Anschließend muss er bloß noch die erzeugten Klassen-Skelette und Konfigurationsdateien ausfüllen. Der beauftragte Contao-Experte (siehe Kasten "Der Programmierer") ist diesen Weg aber nicht gegangen.

Der Programmierer

Der Code für die Lösung der Aufgabe in diesem Artikel stammt von Andreas Schempp, Hauptentwickler des Contao-Shopsystems Isotope E-Commerce, Leiter der Contao Arbeitsgruppe Core-Entwicklung und im Vorstand der Contao Association [2].

Beruflich arbeitet er als Mitinhaber bei der Terminal42 GmbH, welche kleine und mittlere Agenturen bei deren Contao-Projekten in den Bereichen Entwicklung und Layout-Umsetzung unterstützt.

Der Anlasser

Den Kern eines Moduls bildet ein PHP-Skript. In ihm leitet der Programmierer von der Klasse »Modul« eine eigene ab und überschreibt die Methoden »generate()« und »compile()« . Den Contao-Konventionen zufolge muss die abgeleitete Klasse den gleichen Namen wie das Modul mit einem vorangestellten »Module« tragen. Wie in Listing 1 zu besichtigen ist, hat der Programmierer das Modul »LinuxMagazin« getauft, seine eigene Klasse heißt folglich »ModuleLinuxMagazin« . Der Name dieser Klasse stiftet übrigens zudem den Dateinamen des PHP-Skripts.

Wenn das Modul seine Ausgaben zusammenstellen und ausspucken soll, ruft Contao seine öffentliche Methode »generate()« auf. Diese prüft in Listing 1 zunächst, ob sie das Backend aufgerufen hat:

if (TL_MODE == 'BE') { ... }

Wenn dies der Fall ist, übergibt »generate()« lediglich ein paar Informationen an Contao, den Namen des Moduls beispielsweise, die dann wiederum das Backend anzeigt. Andernfalls soll das Modul seine Informationen im Frontend und somit den Besuchern präsentieren. Als Vorbereitung darauf lädt »generate()« ab Zeile 21 erst einmal mehrere Stylesheets aus dem Unterverzeichnis »assets« , welche später die Informationen des Moduls etwas aufhübschen.

Als Nächstes bindet »generate()« etwas Javascript-Code ein. Dieser stammt nicht vom Programmierer des Moduls, sondern aus dem in Contao bereits enthaltenen Javascript-Framework Mootools [3]. Der hinzugeholte Javascript-Code erzeugt die kleinen Kalendersymbole, über die Besucher später bequemer ein Datum auswählen können (in Abbildung 1 die kleinen grünen Symbole).

Zum Schluss ruft »generate()« noch ihre Kollegin in der Oberklasse auf. Die wiederum aktiviert die private Methode »compile()« , welche die eigentlichen Daten zusammenstellt und ausgibt. In der Implementierung aus Listing 1 holt sie zunächst die Daten im Json-Format von »berlin.de« ab und presst sie in Zeile 41 in ein handlicheres Array. Anschließend prüft die Methode, ob die ganzen Informationen auf eine Seite passen oder ob das Modul sie besser auf mehrere Seiten verteilen sollte.

Listing 1

ModuleLinuxMagazin-Klasse (Ausschnitte)

01 <?php
02 [...]
03   protected $strTemplate = 'mod_linuxmagazin';
04
05   public function generate()
06   {
07     if (TL_MODE == 'BE')
08     {
09             $objTemplate = new BackendTemplate('be_wildcard');
10
11       $objTemplate->wildcard = '### LINUX MAGAZIN DEMO ###';
12             $objTemplate->title = $this->headline;
13       $objTemplate->id = $this->id;
14       $objTemplate->link = $this->name;
15       $objTemplate->href = $this->Environment->script.'?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;
16
17       return $objTemplate->parse();
18     }
19
20             // Demo styles from berlin.de website
21     $GLOBALS['TL_CSS'][] = 'system/modules/linuxmagazin/assets/style.css';
22     $GLOBALS['TL_CSS'][] = 'system/modules/linuxmagazin/assets/bde_2010_land.css';
23     $GLOBALS['TL_CSS'][] = 'system/modules/linuxmagazin/assets/bde_2010.css';
24     $GLOBALS['TL_CSS'][] = 'system/modules/linuxmagazin/assets/land_form.css';
25
26     $GLOBALS['TL_JAVASCRIPT'][] = 'assets/mootools/datepicker/' . DATEPICKER . '/datepicker.js';
27     $GLOBALS['TL_CSS'][] = 'assets/mootools/datepicker/' . DATEPICKER . '/dashboard.css';
28
29     return parent::generate();
30   }
31
32   protected function compile()
33   {
34 [...]
35     $strUrl = 'http://www.berlin.de/sen/wirtschaft/service/maerkte/strassenfeste/index.php/index/all.json';
36 [...]
37     $objRequest = new Request();
38     $objRequest->send($strUrl);
39
40 [...]
41     $objData = json_decode($objRequest->response);
42 [...]
43
44     $perPage = (int) $this->Input->get('ipp') ?: 20;
45     $page = (int) $this->Input->get('page') ?: 1;
46     $skip = ($page - 1) * $perPage;
47
48     foreach (array_slice($objData->index, $skip, $perPage) as $objResult) {
49       $arrData[] = array_merge((array) $objResult, array(
50         'von'   => date('d.m.Y', strtotime($objResult->von)),
51         'class' => ($i%2 ? 'odd' : 'even'),
52       ));
53
54       $i += 1;
55     }
56
57 [...]
58     $this->Template->results = $arrData;
59     $this->Template->caption = $objData->results->count . ' Ergebnisse gefunden';
60     $this->Template->summary = $objData->results->count . ' Einträge insgesamt';
61     $this->Template->action = ampersand($this->Environment->request);
62 [...]
63   }
64 }
Abbildung 1: Die Ausgaben des Moduls im Frontend. Die kleinen Kalendersymbole stammen von Contaos Javascript-Framework Mootools.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

comments powered by Disqus

Ausgabe 08/2016

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.