Contao 2.11.0 verfügbar

Am 15.02.2012 wurde das Contao 2.11.0 Release veröffentlicht. Das Release ist das erste für die ein “Long-Term-Support” gilt, also mindestens 18 Monate gepflegt wird. Es wurde kräftig an Contao gearbeitet. Die wichtigsten Änderungen sind nachfolgend beschrieben:

  • Stylesheets können nun in die kombinierte CSS-Datei eingefügt werden:
    $GLOBAL['TL_CSS'][] = 'mystyle.css|screen|static';
  • Es gibt einige neue Hooks:
    • sqlCompileCommands
    • sqlGetFromFile
    • sqlGetFromDB
    • getCookie
    • getRootPageFromUrl
  • File-/Folder-Klasse: Die Klassen “File” und “Folder” haben die neuen Funktionen “chmod()” und “copyTo()” erhalten.
  • Die Anonymisierung von IP-Adressen kann im Backend kon­fi­gu­rie­rt werden.
  • Google-Webfonts können über ein neues Feld im Seitenlayout eingebunden werden, die dann als externes Stlyesheet geladen werden.
  • Erweiterte Optionen zur Bildverkleinerung
  • Bei den Backend-Passwörtern kann die Änderung des Passworts erzwungen werden.
  • Es wurden alle externen Plugins aktualisiert.
  • Die URLs der Seiten können nun auch in der Form domain.tld/de/ bzw. domain.tld/[Ländercode]/ dargestellt werden. Dazu gibts auch einen neuen Sprachenwechsler.
  • Globale Stylesheet-Variablen: In den Theme-Einstellungen können globale Variablen definiert werden, die in den CSS-Definitionen verwendet werdne können.
  • Verbessertes FAQ-Modul, insbesondere das Rechtesystem.
  • News-Archiv und News-Leser auf derselben Seite: Das ist eine super Sachen. Es müssen nun nicht zwei Seiten mit einem Archiv und einem Leser erstellt werden (man kann auch Überssicht und Detailseite dazu sagen), sondern es kann eine Seite für beides verwendet werden… klasse.
  • Das CSS-Framework kann nun auch im Backend in den Einstellungen deaktiviert werden.
  • Request-Token-System: Es gab immer wieder Probleme mit dem Request-System, wenn der Nutzer die Browser-Funktion “vor” bzw. “zurück” verwendet hat. Das Token ist nun für eine Session und nicht für ein Request gültig.
  • Einen Safemode für Contao: Third-Party-Er­wei­te­run­gen werden nicht geladen, wenn der Mode aktiv ist. Wird auch bei einer Contao-Aktualisierung verwendet, damit eventuell fehlerhafte Erweiterungen die Stabilität des Systems nicht beeinträchtigen.
  • Systemnachrichten: Es gibt ein paar neue Funktionen, um Systemmeldungen im Backend anzuzeigen.
  • Einen neuen Inserttag {{page}}

Ein Update von Contao 2.10 auf 2.11 funktionierte problemlos.

Moduleinstellungen unter Contao

Während der Modulentwicklung kommt man schnell an den Punkt, wo man verschiedene Einstellungen zu einem Contao Modul hinterlegen möchte. Das kann eine Weiterleitungsseite sein, ein Text oder ein x-beliebiger Wert aus einem Auswahlfeld oder ähnliches. Jeder Eintrag in den Modulen einer “Theme” entspricht einem Datensatz in der Tabelle tl_module. Dort werden auch alle Einstellungen zu einem Modul hinterlegt.

Contao tl_module Tabelle

Auszug aus der Tabelle tl_module

Um eine dieser bestehenden Spalten in einem Modul nutzen zu können, muß man in der DCA eine Zeile ergänzen:

$GLOBALS['TL_DCA']['tl_module']['palettes']['mymodule'] = '{title_legend},name,headline,type,customLabel';

Schon steht im Modul ein einfaches Textfeld zur Verfügung. Da diese Einstellung bereits von Contao verwendet wird, gibt es bereits eine Felddefinition und eine Übersetzung für die Einstellung customLabel. Damit wir keine neue Spalte in der tl_module anlegen müssen, können wir das Feld für etwas anderes “mißbrauchen”. Ich will nur demonstrieren, wie man Änderungen vornehmen kann, die im Prinzip auch bei einem neuen Feld notwendig sind.

Die Übersetzung wird beispielsweise folgendermaßen gesetzt bzw. überschrieben:

$GLOBALS['TL_LANG']['tl_module']['customLabel']=array('View', 'Please select a view type.');

Den Feldtyp können wir folgendermaßen beeinflussen:

$GLOBALS['TL_DCA']['tl_module']['fields']['customLabel'] = array(
  'label' => &$GLOBALS['TL_LANG']['tl_module']['customLabel'],
  'inputType'  => 'select',
  'options'    => array(1=>'Overview', 2=>'Detail')
);

Somit haben wir jetzt folgendes im Backend erreicht:

Angepasstes Backend-Modul

Das angepasste Backend Modul mit neuem Feld

Eines sollte jedoch klar sein, wenn man bestehende Felddefinitionen verändert: Auch in den Modulen, in den die Einstellung bereits verwendet wird, kann unter Umständen die Veränderung greifen. Das wiederum hängt von der Reihenfolge ab, wie die Module abgearbeitet werden (alphabetisch).

Contao auf 2.10.0 updaten

Die Version 2.10.0 beinhaltet sehr viele Änderungen. Bei einem manuellen Update ist vor allem die Änderungen im Template-System zu beachten. Die Endung *.tpl sollte nicht mehr verwendet werden. An dessen Stelle treten die Endungen *.xhtml oder *.html5. Um eine bestehende Installation auf 2.10.0 zu aktualisieren, sollte man also den Contao-Core entpacken und in das Contao Verzeichnis kopieren (bestehende Dateien werden überschrieben). Anschließend kann man z. B. unter Windows mit del /S *.tpl alle alten Template-Dateien rekursiv löschen. Unter Linux heißt der Befehl rm -Rf *.tpl. Bitte diese Befehle mit Vorsicht verwenden, die Dateien werden rekursiv gelöscht. Also vorher unbedingt ein Backup machen.

Dieses Vorgehen sollte man nur wählen, wenn keine Erweiterungen verwendet werden (da diese noch mit den alten *.tpl Dateien arbeiten).

Natürlich muß anschließend die Datenbank mit dem Installationstool aktualisiert werden.

Ich hatte auch Probleme mit dem CSS-Framework. Die Hintergrundbilder wurden teilweise nicht korrekt eingebunden (Pfad im CSS war nicht korrekt). Nachdem ich im Backend die CSS-Definitionen nochmals abgespeichert hatte, wurden die Dateien neu generiert und der Fehler war behoben.

Wer eigene Extensions entwickelt kann leider nicht einfach seine Template-Dateien auf die Endung .xhtml umbenennen, da im Backend zwingend die Endung *.html5 erwartet wird. Um jetzt nicht alle Template-Dateien doppelt zu pflegen, hat man zwei Möglichkeiten:

  1. Im Modul wird die Methode generate() abgeleitet und im Fall, dass wir uns im Backend befinden, wird einfach ein Text ausgegeben:
    public function generate()
    {
      if (TL_MODE == 'BE')
        return 'Mein Modul';
      return parent::generate();
    }
  2. Man kann auch wahlweise das Format xhtml erzwingen.
    protected function compile()
    {
      // force xhtml format
      $this->Template->setFormat('xhtml');
      ...
    }

Außerdem muß man seine Formulare anpassen, da nun mit einem Request-Token-System gearbeitet wird. Wie die Formulare anzupassen sind, ist auf der Contao-Seite beschrieben.

Contao in verschiedenen Systemumgebungen

Wer in Contao eine Erweiterung programmiert macht das in der Regel auf einem lokalen Rechner. Sobald die Erweiterung einen halbwegs stabilen Stand erreicht hat, kann diese bereits auf einem Testsystem geprüft werden (ggf. auch durch externe Tester). Anschließend wird die Extension auf dem Live-System in Betrieb genommen. Die Extension hat somit verschiedene Umgebung durchlaufen: Development, Testing und Live. Um Contao in diesen Umgebungen zu betreiben hat sich für mich folgendes Vorgehen ergeben: Continue reading

Contao VM (Virtuelle Maschine)

Kaum zu glauben, aber es gibt tatsächlich eine vorkonfigurierte VM für Contao. Auf der VM läuft ein Ubuntu und die Zend Server Community Edition. Als Virtualisierungsanwendung kommt VirtualBox zum Einsatz. Seit Dezember 2010 wurde die VM nicht mehr aktualisiert, aber eine Contao Installation ist ziemlich schnell auf den neusten Stand gebracht. Wer also den ca. 2,6 GB großen Download nicht scheut, der hat schnell eine funktionsfähige Entwicklungsumgebung.

Als Alternative bietet sich natürlich auch eine einfache XAMPP Installation an, auf der man Contao selbst installiert.

Session Handling in Contao

Contao hat eine sehr einfache Abstraktion zur Handhabung von PHP Session Informationen. Die betreffende Contao-Klasse heißt schlicht Session. Es handelt sich dabei um eine Singelton-Klasse, d. h. wir können über eine statische Methode eine Instanz der Klasse holen:

$session=Session::getInstance();

Damit können wir nun Daten in die Session schreiben und auslesen. Dazu stehen die Methode get() und set() zur Verfügung. Das wars auch schon im groß und ganzen. Die Abstraktion schreibt die Daten im Destruktor in die Session (innerhalb der Klasse werden die Werte als assoziatives Array gespeichert). Das bedeutet, dass zur Laufzeit die Werte in der PHP Session ($_SESSION) nicht sofort zur Verfügung stehen, sondern erst beim nächsten Request.

Um zu prüfen, ob ein Wert bereits hinterlegt wurde, muß auf die get()-Methode zurückgegriffen werden.

Der Entwickler muß sich selbst um eventuelle Nameskonflikte kümmern, denn sonst werden gleiche Schlüssel mit dem jeweils letzten Wert überschrieben. Ein Namespace-Mechanismus gibt es lediglich für die Backend- und Frontend-Session.

Contao: 403/Forbidden auf tl_files

Ich möchte hier kurz festhalten, dass ich Probleme hatte, Bilder aus dem tl_files Verzeichnis direkt aufzurufen. Zuerst dachte ich an eine falsche htaccess Konfiguration. Als ich das jedoch ausschließen konnte, habe ich mir die Dateirechte genauer angeschaut. PHP lief nicht im SafeMode, weshalb die Problematik der unterschiedlichen Benutzer nicht gegeben war. Der Datei selbst hatte ich versuchsweise alle Rechte gegeben (777). Dies führte jedoch nicht zum Erfolg. Bei Aufruf bekam ich immer noch einen 403/Forbidden. Schließlich half mir das System-Check-Tool von Contao auf die Sprünge. Die Verzeichnisse hatten falsche Berechtigungen. Als ich diese auf den empfohlenen Wert setzte (750) konnte ich das Bild (endlich) aufrufen.