Aktuelles:
Konfigurationstool den Onlineshop von SOS-Kinderdorf (04.10.11)
Konfigurator für Weihnachts- und Grußkarten jetzt auch für den Shop des SOS-Kinderdorfs
digitoxic.com - digital und giftig (27.01.11)
Unser langjähriger Kooperationspartner Ben Dörries, hat den Launch seines digitoxic.com Projektes...
audite.de Zend_Framework Portation
Die erste PHP-Version der Audite Musikproduktion Website stammt aus dem Jahr 2002. Damals gab es noch kein PHP5 und die OOP Unterstüzung in PHP war rudimentär, sodass man heute vieles anders und besser machen könnte. Wie die meisten anderen Projekte aus dieser Zeit implementierten wir audite.de damals auch mit unserem eigenen Framework.
Sieben Jahre sind in der Softwareentwicklung eine halbe Ewigkeit und an audite.de wurde immer viel geschraubt und erweitert, wobei wir immer zeitgemäße Technik und Verfahren einsetzten. Dies hatte zur Folge, dass wir verschiedene Techniken für die gleichen Aufgaben hatten, man schleppte historische Altlasten mit. So gab es zum Beispiel zwei Mechanismen für die Übersetzungen und gleich mehrere für das Konfigurationsmanagement. Dieser Sachverhalt machte es in der letzten Zeit aufwändig und fehleranfällig Neuerungen zu implementieren. Zur Erledigung einer Sache musste man an verschiedenen Stellen im Programmquellcode ansetzen.
Anfang 2009 entstand der Wunsch ein besseres Ranking durch suchmaschinentaugliche URL zu erreichen. Allerdings hätte dies nur mit großem Aufwand mit unserem alten Framework umgesetzt werden können. Obwohl unser Framework auch nach dem Grundprinzip MVC (Model View Controller) arbeitete, wurden die Requests nicht von einer einzelnen Bootstrap-Datei, sondern von unterschiedlichen PHP-Dateien abgehandelt. Hierdurch hätten die SEO-URLs nur durch ein aufwändiges Mapping über .htaccess und ein manuelles Umschreiben jeden Links erzeugt werden können.
Diesen Wunsch und die obigen Misstände vor Augen wurde der Entschluss getroffen audite.de auf das Zend_Framework zu portieren. Die Beauftragung der Firma Audite Musikproduktion, ermöglichte uns in diesem Zuge eine Generalüberholung des Quellcodes durchzuführen. Die Mechanismen und Funktionen wurden vereinheitlicht und - wo sinnvoll - die Komponenten aus dem Zend_Framework eingesetzt. Der gesamte Quellcode wurde auf Schwachstellen durchleuchtet und in vielen Teilen optimiert. PHP4 spezifische Objektorientierung wurde entfernt und durch aktuelle PHP5 Möglichkeiten ersetzt.
Sehr arbeitsaufwändig war das Umstellen des Datenbankadapters. Auf audite.de wurde noch das sehr alte PEAR::DB eingesetzt, welches wir durch das wesentlich stabilere und schnellere Zend_Db mit PDO Treiber ersetzten. Durch eine Wrapperklasse, welche die Grundmethoden der PEAR::DB Klasse auf die der Zend_Db mappt, konnten die Updates und Selects zwar weitestgehend übernommen werden, die Inserts jedoch wurden bei PEAR::DB nicht über das mysql-spezifische auto_increment, sondern über Sequenztabellen realisiert und mussten dementsprechend komplett neu geschrieben werden.
Zusätzlich zu den Arbeiten "unter der Haube" haben wir die Prozesslogik im Warenkorb neu implementiert. Unter anderem sind die Formulare in dem Bereich auf das dojo-Toolkit umgestellt und es wurde eine neue Registernavigation für den Warenkorb entwickelt.
Die einzelnen Seiten von audite.de waren schon vor der Portation gut bei google.de vertreten und vergleichsweise gut gerankt. Um die Links von Google und von den vielen anderen Seiten im Internet nicht ins Leere laufen zu lassen, entwickelten wir einen Migrations-Controller. Dieser wird über eine Regex-Route ('([a-zA-Z]+)\.php') für jeden php-Datei-Aufruf aufgerufen, stellt für die wichtigsten alten Seiten die Objekte her und stößt einen Redirekt auf die entsprechende aktuelle Seite her. Als Status-Code wird 301 (Moved-Permanently) mitgegeben, der dem Client sagt, dass er am besten beim nächsten mal gleich die aktuelle Seite aufruft. Dieser Mechanismus ist aktuell für die folgenden Seiten implementiert.
- CD-Detailseite
- Ensemble-Detailseite
- Künstler-Detailseite
- Künstlertermin-Detailseite
- Newseintrag
Der Rest der Aufrufe wird mit 404 (File-Not-Found) quittiert und auf den ErrorController weitergeleitet.
Einige der genutzten Zend-Komponenten:
Zend_Loader_Autoloader
Wie vorgefertigt genutzt, um die Zend_Framework-Klassen zu laden. Für die eigenen Klassen haben wir einen Audite_Autoloader geschrieben, der das Zend_Loader_Autoloader_Interface implementiert, der die alten Business-Object-Klassen lädt. Hierbei kam uns zu gute, dass wir uns auch schon vor 7 Jahren ein einheitliches Schema zur Benennung von Klassen und Dateien verwendet haben. Über einen Pear_Autoload laden wir die alten Klassen aus dem PEAR Projekt (bis auf DB natürlich)
Zend_Auth_Authentifizierung
Über den Authentifizierungsmechanismus des Frameworks vereinheitlichten wir die verschiedenen Logins der Klassen. Den verschiedenen vorhanden Klassen, Distributor, Artist, User und Customer wurde hierbei eine gemeinsame Rolle über ein Interface Audite_Auth_Object gegeben.
Zend_Translate
Um den Translate-Mechanismus des Frameworks nutzen zu können implementierten wir einen eigenen Datenbank-Adapter. Dieser lädt die Übersetzungen aus einer Tabelle und legt die Einträge an, sofern es zu dem Key noch keine Übersetzung gibt. Hierdurch wird dem Kunden ermöglicht die Übersetzungen selbst über den Administrationsbereich zu pflegen. Für die vorhandenen Sprachdateien entwickelten wir Migrationsscripte, welche die Übersetzungen aus den Dateien in die neue i18n Tabelle schrieben.
Zend_Controller_Router_Route
Den Standardrouter der Anwendung nutzen wir nur im Backend (Adminstrationsbereich). Im Frontend leiteten wir auch diese Klasse ab. Wir überschrieben die Methoden assemble(...) so, dass an jede URL, die über den Url-View-Helper generiert wird (diese greift auf die assemble-Methode der aktuellen Route zurück) ein ".html" gehängt wird und die Methode match(), die prüft ob die Route auf die aktuelle url passt, genau dieses ignoriert. So haben wir für das Projekt mit ca. 20 Zeilen Code urls generiert, die klassische html Seite simulieren. Auch die PDF und XML Dateien, die an vielen Stellen des Projekts runter geladen werden können, bekommen durch diesen Mechanismus dem Dateityp entsprechende Namen.
Zend_Log
wird für das Logging eingesetzt. In Abhängigkeit von der Umgebung (Livesystem, Entwicklungssystem) setzen wir den Log-Level.
Als Ergebnis der ca. dreimonatigen Entwicklungsarbeit haben wir eine Anwendung geschaffen, welche wieder fit und offen für die nächsten zehn Jahre ist und mit geringem Aufwand gepflegt und erweitert werden kann. Ein großes Todo bleibt jedoch noch der HTML-Quelltext, der nur parziell optimiert wurde. Ansonsten stammt das tabellenbasierte Layout noch aus 2002. Damals wohl zeitgemäß, wäre es heute eine auch Überarbeitung wert.
Arne Reith




