Rückblick auf die letzten 12 Monate

Contao-Association

Gründung eines Contao-Fördervereins (Mai 2012)

Contao-Association

  • Förderverein
    • Finanzierung der Weiterentwicklung von Contao
    • Kommunikation nach innen und außen
    • Organisation von Events wie z.B. Konferenz oder Camp
  • Eckdaten (Stand April 2013)
    • 110 Mitglieder, 13.500,00 Euro Budget
  • Bisherige Projekte
    • Einrichtung eines Community-Servers
    • Vorfinanzierung des Camps und der Konferenz
    • Werbemittelunterstützung (z.B. Flyer)

Contao Live Update

Neue Contao Live Update Major-Version (Juni 2012)

Live Update

  • Beliebige Upgrades und Downgrades
    • Auch das Reparieren einer Installation ist möglich
    • Alle Contao-Versionen ab 2.9.0 werden unterstützt
  • Automatisches Backup/Restore der Datenbank
  • Diff-Ansicht der angepassten Template-Dateien
  • Anzeige von distributionsfremden Dateien

Contao-Tools

Contao-Tools für Google Chrome (Juli 2012)

Contao-Tools

  • Erweiterung für Google Chrome
  • Responsive Grid-Overlay für das Contao CSS-Framework
  • Linksammlung zu Contao
    • Deeplinks auf contao.org
    • Link zum Ticketsystem
    • Link zur Community-Plattform
    • Link zum Contao-Wiki
    • Link zur API-Dokumentation

Contao-Check

Contao-Check mit erweiterten Funktionen (August 2012)

Contao-Check

  • https://github.com/contao/check
  • Prüfen der Contao-Systemvoraussetzungen
    • PHP-Version
    • Extension Repository
    • Live Update
    • Safe Mode Hack
  • Validierung einer bestehenden Installation
    • Korrupte und fehlende Dateien finden
  • Contao über den Web-Installer direkt installieren

Contao-Camp

Contao-Camp 2012 in Essen (November 2012)

Contao-Camp

  • Zweitägiges Barcamp zum Thema "Contao"
    • 100 Teilnehmer im Unperfekthaus in Essen
    • Das Programm wird von den Teilnehmern festgelegt
  • Zweite große Contao-Veranstaltung neben der Konferenz
    • Contao-Konferenz im Mai
    • Contao-Camp im November
  • Eindrücke im Internet:

Contao Theme-Store

Start des offiziellen Contao Theme-Store (Dezember 2012)

Zentrale Anlaufstelle

  • https://themes.contao.org
  • Umfangreiche Filtermöglichkeiten
    • Responsive Design
    • Verwendung der Originaltemplates
    • Interner CSS-Editor oder externe Stylesheets
    • Zukünftige Updates inklusive
  • Kostenlose und kostenpflichtige Themes
    • Leider noch keine kostenlose Themes für Contao 3
    • Vergünstigungen für Anbieter kostenloser Themes

Vorteile für Nutzer

  • Prüfung der Abieter durch uns
  • Sicheres Bezahlen und funktionierende Downloads
  • Kaufabwicklung nach deutschem Recht
  • Supportanfragen können direkt an uns gestellt werden
  • Zukünftige Updates können – sofern inklusive – direkt über die Bestellhistorie im Kundenkonto bezogen werden

Vorteile für Anbieter

  • Seriöser Geschäftspartner
  • Monatliche Auszahlung der Umsätze
  • Hohes Besucheraufkommen
  • Keine Kosten für Werbung oder eine eigene Plattform
  • Selbstgehostete Live-Demo der Themes möglich
  • Detaillierte Umsatzstatistik
  • Paralleler Betrieb eines eigenen Shops erlaubt

Contao-Handbuch

Umstellung der Contao-Dokumentation (Januar 2013)

Neuer Workflow

  • Markdown-Dokumente
  • Verwaltet in einem Git-Repository
  • Ausgabe als HTML auf contao.org
    • Unterteilung nach Versionen
    • Erstellung des Inhaltsverzeichnis

Kollaboratives Arbeiten möglich

  • Jeder kann mithelfen
  • Gleiches Prinzip wie beim Arbeiten am Core
    • Lokale Kopie des Repos auschecken
    • Änderungen und Ergänzungen vornehmen
    • Pull Request auf GitHub erstellen
  • Beim nächsten Import auf contao.org werden die Änderungen automatisch übernommen

Geringe Beteiligung

Leider gibt es bislang nur sieben Mitwirkende:

Software ohne Dokumentation ist entweder absolut selbsterklärend oder weitestgehend nutzlos! Umso dankbarer sind wir, dass sich wenigsten die sieben Helfer gefunden haben.

Wir wünschen uns für die Zukunft aber eine regere Beteiligung.

Contao goes CeBIT

Contao beim CMS-Garden auf der CeBIT (März 2013)

Contao goes CeBIT

Contao-Nordtag

Contao-Nordtag 2013 in Hamburg (März 2013)

Contao-Nordtag

  • Eintägiges Event in Hamburg
    • Organsiert von der Community
    • 75 Teilnehmer
    • Acht Vorträge/Sessions verteilt auf zwei Räume
  • Eindrücke im Internet:

Contao im TV

Contao auf Sendung im ComputerClub² (April 2013)

Contao im TV

  • Sendung des ComputerClub²
    • 600.000 Aufrufe der Webseite pro Monat
    • 340.000 Downloads des wöchentlichen Podcasts
    • 150.000 Downloads der monatlichen TV-Sendungen
  • Folge 106 vom 18. April 2013
    • Kabel: NRW-TV
    • Astra: Dr. Dish TV
    • Web: cczwei.de
  • Contao wird präsentiert von Christian de la Haye

Blick auf die nächste Contao-Version

Contao 3.1

Termin für das finale Release ist Mai 2013

Automatische Synchronisation

Der Dateiwähler zeigt das Dateisystem in Echtzeit an und fügt die ausgewählten Dateien bzw. Ordner automatisch zum DBAFS hinzu, sofern sie noch keinen Datenbank-Eintrag haben.

Vorteile

  • Per FTP hochgeladene Dateien stehen sofort zur Verfügung
  • Die Notwendigkeit einer manuellen Synchronisation entfällt

Hinweis: Der automatische Abgleich mit dem DBAFS funktioniert nur für neue Dateien. Werden Dateien bzw. Ordner per FTP umbenannt und/oder verschoben, muss nach wie vor synchronisiert werden.

Verbesserte Seiten- und Dateiwähler

Die Seiten- und Dateiwähler können nun auf Teilbäume begrenzt werden, so wie es bereits in der Seitenstruktur und in der Dateiverwaltung der Fall ist. Zudem kann man nun im Popup-Dialog zwischen dem Wähler und der Seitenstruktur bzw. der Dateiverwaltung hin und her wechseln.

Vorteile

  • Bessere Navigation bei vielen Nodes
  • Nodes können direkt im Popup-Dialog geändert werden
  • Änderungen stehen sofort im Wähler zur Verfügung

TinyMCE-Picker

Die TinyMCE-Picker, mit denen man Seiten oder Bilder auswählen kann, wurden durch den Contao-Seitenwähler bzw. Dateiwähler ersetzt.

Vorteile

  • Gewohntes Benutzerinterface
  • Die Picker sind navigierbar und durchsuchbar
  • Deutlich einfacher zu verwenden

Klicken und Bearbeiten

Elemente können zur Bearbeitung direkt angeklickt werden, ohne dass die entsprechenden Icons dafür verwendet werden müssen.

Zusammen mit dem Klick muss die Control-Taste (Windows/Unix) bzw. die Command-Taste (Mac OS) gedrückt werden:

  • [Ctrl]+Klick: Element bearbeiten
  • [Ctrl]+[Shift]+Klick: Einstellungen bearbeiten

Beziehungsweise auf Mac OS:

  • [Cmd]+Klick: Element bearbeiten
  • [Cmd]+[Shift]+Klick: Einstellungen bearbeiten

Drag und Drop statt Klick

Alle Elemente, die bisher mittels der grünen Pfeile schrittweise hoch und runter geschoben werden konnten, lassen sich jetzt bequem per Drag und Drop verschieben.

Vorteile

  • Bessere und inuitivere Handhabung
  • Verschieben um mehrere Positionen in einem Schritt
  • Ein einheitliches Icon für Drag und Drop
  • Im Parent View scrollt die Seite beim Verschieben mit

Frontend-Module deaktivieren

Frontend-Module können direkt im Seitenlayout deaktiviert werden und werden dann nicht auf der Webseite angezeigt.

Vorteile

  • Aktivieren/Deaktivieren direkt im Seitenlayout möglich
  • Die Liste der eingebundenen Module muss nicht verändert werden

Details im Popup-Fenster

Die Detailansicht eines Elements wird in einem Popup-Fenster angezeigt.

Vorteile

  • Kein Neuladen der Seite notwendig
  • Schneller Zugriff auf mehrere Elemente nacheinander

Bezogene Elemente bearbeiten

Alle Elemente, die in anderen Elementen verlinkt werden, wie z.B. Aliaselemente in Artikeln oder Frontend-Module im Seitenlayout, können in einem modalen Fenster direkt bearbeitet werden.

Vorteile

  • Schneller Zugriff auf das bezogene Element
  • Die ursprüngliche Eingabemaske wird nicht verlassen
  • Konstistente Zurück-Naviation

Multi-Tab-Unterstützung

Werden im Backend Links in einem neuen Tab oder Fenster geöffnet, bleibt die Browser-Historie davon unbeeinflusst. Jedes Tab bzw. Fenster bekommt seine eigene Historie.

Vorteile

  • Der Zurück-Button funktioniert auch bei mehreren Tabs
  • Speichern und Schließen bringt den Benutzer immer zur korrekten, davor besuchten Seite zurück

Pflichtfelder und Autosubmit

Wird ein Backend-Formular automatisch abgeschickt, z.B. beim Wechsel des Elementtyps, erzeugen leere Pflichtfelder keine Fehlermeldung mehr.

Vorteile

  • Keine Unterbrechung des Workflow
  • Leere Pflichtfelder werden erst beim Speichern des Formulars geprüft

Geschützte Artikel

Artikel können nun genau wie Seiten und Inhaltselemente geschützt werden, so dass nur bestimmte Mitgliedergruppen im Frontend darauf zugreifen können.

Vorteile

  • Mehrere Inhaltselemente auf einmal schützen
  • Teilbereiche einer Seite nur für Mitglieder freigeben

Sprachen und Dialekte

Contao 3.1 unterstützt Sprachdialekte wie z.B. de-CH. Diese können in den Einstellungen einer Website-Startseite oder als Gebietsschema (dann werden sie de_CH geschrieben!) bei der Übersetzung des Systems verwendet werden.

Vorteile

  • Getrennte Webseiten für de-DE, de-AT und de-CH sind möglich
  • Verschiedene Übersetzungen für pt_PT und pt_BR sind möglich

Inserttag-Flags

Die Ausgabe eines Inserttag kann mittels Flags an eine oder mehrere Funktionen weitergereicht und so noch einmal verändert werden. Flags werden dem Inserttag mit einer Pipe (|) angehängt.

Vorteile

  • Steuerung des Cache-Verhalten eines Inserttag
  • Modifikation oder Weiterverarbeitung der Ausgabe eines Inserttag
  • Eigene Flags können mittels Hook hinzugefügt werden

Slider für Inhaltselemente

Auf Basis von swipe.js wurde ein Slider für Inhaltselemente zum Core hinzugefügt. Der Slider unterstützt Wischgesten auf mobilen Endgeräten und lässt sich im Backend mittels Wrapper-Elementen konfigurieren.

Vorteile

  • Unterstützt Desktop und Mobile
  • Funktioniert für Inhaltselemente "out of the box"
  • Einfach einzurichten und zu konfigurieren

Überarbeitete Fehlerseiten

Alle Fehlerseiten, die bislang als gelber Kasten ausgegeben wurden, wurden an das Contao-Design angepasst und können jetzt auch übersetzt werden. Die beinhaltet folgende Meldungen:

  • Allgemeiner Fehler
  • Ungültiger Request-Token
  • Unvollständige Installation (neu)

Models in Contao 3

Was steckt dahinter und warum sollte man sie nutzen

Models

  • Models dienen der Speicherung von Daten
  • Laden und Speichern erfolgt über eine einheitliche API
  • Die Applikation muss nicht wissen, wo und wie die Daten gespeichert werden (z.B. in Dateien oder einer Datenbank)
  • Zwischen Models können Beziehungen definiert werden
  • In Beziehung stehende Daten können direkt mitgeladen werden

Ein Beispiel

Ein neuer Datensatz wird angelegt:

  $author = new AuthorModel();

  $author->name    = 'Leo Feyer';
  $author->company = 'iNet Robots';

  $author->save();

  echo $author->id; // ID des neuen Datensatzes

Ein Beispiel

Ein Datensatz wird abgerufen:

  $author = AuthorModel::findByName('Leo Feyer');

  echo $author->company; // Name der Firma

Ein Beispiel

Anlegen mit der Datenbank-Klasse:

  $set = array();

  $set['name']    = 'Leo Feyer';
  $set['company'] = 'iNet Robots';

  $stmt = $this->Database->prepare("INSERT INTO tl_author %s")
                         ->set($set)
                         ->execute();

  echo $stmt->insertId; // ID des neuen Datensatzes

Ein Beispiel

Abrufen mit der Datenbank-Klasse:

  $author = $this->Database->prepare("SELECT * FROM tl_author WHERE name=?")
                           ->execute('Leo Feyer');

  echo $author->company; // Name der Firma

Erste Erkenntnisse

  • Beim Arbeiten mit der Datenbank-Klasse
    • muss mehr Code geschrieben werden
    • muss der Name der Tabelle bekannt sein
  • Zudem bindet man sich an ein Storage-System:
    • Wenn die Daten statt in der Datenbank in XML-Dateien gespeichert werden sollen, müssen alle Code-Stellen angepasst werden
    • Werden hingegen Models verwendet, muss lediglich die Model-Implementierung angepasst bzw. ausgetauscht werden

Ein umfangreicheres Beispiel

Zu einem Artikel sollen die Daten der beinhaltenden Seite sowie des Autors ausgegeben werden. Es müssen also drei Datensätze aus drei verschiedenen Tabellen geladen werden.

  • Möglichkeit 1: drei Datenbank-Abfragen
  • Möglichkeit 2: eine Datenbank-Abfrage mittels JOIN
  • Möglichkeit 3: Verwendung der Models

Möglichkeit 1

  // Artikeldaten
  $article = $this->Database->prepare("SELECT * FROM tl_article WHERE id=?")
                            ->execute(5);

  // Seitendaten
  $page =    $this->Database->prepare("SELECT * FROM tl_page WHERE id=?")
                            ->execute($article->pid);

  // Autordaten
  $author =  $this->Database->prepare("SELECT * FROM tl_user WHERE id=?")
                            ->execute($article->author);

Nachteile der Möglichkeit 1

  • Die Namen aller Tabellen müssen bekannt sein
  • Es müssen drei Datenbank-Abfragen getätigt werden

Möglichkeit 2

  // Alles in einer Abfrage
  $data = $this->Database->prepare("
            SELECT * FROM tl_article a
              LEFT JOIN tl_page p ON a.pid=p.id
              LEFT JOIN tl_user u ON a.author=u.id
            WHERE a.id=?
          ")->execute(5);

Nachteile der Möglichkeit 2

  • Das Ergebnis enthält nur ein Feld id, pid, tstamp, title
  • Keine Unterscheidung tl_user.id oder tl_page.id möglich
  • Die Namen aller Tabellen müssen bekannt sein

Möglichkeit 3

  // Artikeldaten
  $article = ArticleModel::findByPk(5);

  // Seitendaten
  $page    = $article->getRelated('pid');

  // Autordaten
  $author  = $article->getRelated('author');

Vorteile der Möglichkeit 3

  • Deutlich weniger Code
  • Keine Kenntnis der Tabellennamen notwendig
  • Die Methode getRelated() lädt in Beziehung stehende Models
  • Einige Beziehungen werden automatisch per JOIN verknüpft und mit der initialen DB-Abfrage geladen
    • Der Autordatensatz wurde vorgeladen ("eager")
    • Der Seitendatensatz wurde erst bei Verwendung geladen ("lazy")
    • Die Art der Beziehung wird im DCA definiert

Hilfreiche Abfragen

  // Eine Seite anhand ihrer ID oder ihres Alias finden
  $page = PageModel::findByIdOrAlias('contact');

  // Eine Seite mit ihren vererbten Eigenschaften laden
  $page = PageModel::findWithDetails(3);

  // Die erste reguläre Seite unterhalb einer Seite finden
  $page = PageModel::findFirstPublishedRegularByPid(2);

  // Alle veröffentlichten Inhaltselemente eines Artikels laden
  $elements = ContentModel::findPublishedByPidAndTable(7, 'tl_article');

Was gefällt euch besser?

Beide nachfolgenden Code-Schnipsel machen exakt dasselbe.

  // Model
  $page = PageModel::findFirstPublishedRegularByPid(2);
  // Datenbank-Abfrage
  $query = "SELECT * FROM tl_page WHERE pid=? AND type='regular'";

  if (!BE_USER_LOGGED_IN)
  {
    $query .= " AND published=1
                AND (start='' OR start<" . time() . ")
                AND (stop='' OR stop>" . time() . ")";
  }

  $page = $this->Database->prepare($query)->execute(2);

Blick in die Zukunft

Contao reloaded

Umstellung des zugrundeliegenden PHP-Framework

Die Arbeitsgruppe

Die Arbeitsgruppe hat sich in der Zeit von Februar bis Mai 2013 in regelmäßigen Skype-Konferenzen mit der Frage nach einem möglichen Wechsel des zugrundeliegenden PHP-Frameworks beschäftigt.

Dabei ging es nicht nur um die Entscheidung dafür oder dagegen, sondern auch um den grundsätzlichen Aufbau der Applikation sowie die Implementierung der Kernfunktionen.

Die Berater

Zu verschiedenen Spezialthemen, wie z.B. dynamische Doctrine-Entities oder PHPCR, haben wir externe Berater hinzugezogen, die bereits entsprechende Erfahrungen gemacht haben und teilweise direkt in den Entwicklungsprozess eingebunden sind.

Sowohl die Mitglieder der Arbeitsgruppe als auch die Berater haben ihr Wissen und ihre Zeit ohne Gegenleistung zur Verfügung gestellt. Dafür an dieser Stelle noch einmal ein großes Dankeschön!

Symfony PHP-Framework

  • International bekannt
  • Aktive und nachhaltige Entwicklung
  • Sehr große Community
  • Baut auf den vorhandenen Standards auf
  • Getestete Code-Basis (Unit-Tests)
  • Sehr umfangreiches Angebot an Bundles

Aufgabe der Arbeitsgruppe

  • Grundsätzliche Eignung
    • Erweiterbarkeit
    • Framework für ein Framework
  • Umsetzung der Kernfunktionalität
    • Diskussion möglicher Implementierungen
    • Prüfung der Umsetzung mit Symfony
    • Prüfung eventuell benötigter Drittkomponenten
    • Entscheidung für eine Implementierung

Ergebnis der Arbeitsgruppe

  • Die Umstellung ist grundsätzlich möglich
  • Alle Implementierungsfragen konnten geklärt werden
  • Contao würde von einer Umstellung profitieren

Zum jetzigen Zeitpunkt ist jedoch nicht klar, ob wir genug Zeit und Manpower haben, um die Umstellung durchzuführen. Der Fokus liegt weiterhin auf der Entwicklung von Contao 3, daher haben die damit verbundenen Aufgaben Priorität vor der Arbeit an Contao reloaded.

Sollten wir feststellen, dass sich das Projekt nicht in einem vertretbaren Zeitrahmen neben der Entwicklung von Contao 3 realisieren lässt, werden wir das Vorhaben wieder aufgeben.

Vielen Dank für die Aufmerksamkeit