Ready … Set. Go!

pimcore: Content-Management-Framework auf Zend-Basis

Dietmar Rietsch Redaktion

Erst seit einem knappen Jahr wird geschraubt, und dynamisch, schnell und mit edlem Interieur versehen hat pimcore die Herzen im Nu erobert. Aber schauen wir dem Neuen einmal unter die Haube: Im Herzen der sportlichen Powerlimousine werkelt das Zend Framework in seiner aktuellen Fassung. Da ist Performanz gesichert und zwar in jeder Verkehrssituation. Der Innenraum besticht durch hochwertige Komponenten und das klare ExtJS-Interface macht das Navigieren zum Kinderspiel. Kommen Sie, steigen Sie ein! Drücken wir mal aufs Gas.

Aber fangen wir von vorne an – kurzfristig ohne Tuning und tiefer gelegtem Autoverkäufer-Jargon. Pimcore ist ein auf dem Zend Framework basierendes Open-Source- (BSD-Lizenz) Content-Management-System und RAD-Framework. RAD im Sinne von Rapid Application Development. Das Core-System bietet dabei die Features, die man von einem modernen CMS erwarten kann: Angefangen von dem Asset-Management mit integriertem Web-2.0-Bildeditor, der strukturierten Rechtevergabe bis hin zum visuell eindrucksvoll gelösten Versionierungs- und Property-Management. Ein Highlight, neben der Unterbodenbeleuchtung, ist das schicke Backend, über das sämtliche Verwaltungs- und Wartungsfunktionen komfortabel und schnell erreicht werden können. Bei dessen Entwicklung standen ganz klar die Bedürfnisse der Editoren im Vordergrund: Content-Management muss Spaß machen. Und das macht es: Über das Multi-Tab-Interface können gleichzeitig mehrere Dokumente und Objekte im WYSIWYG-Modus bearbeitet werden, und mithilfe der reichhaltigen Drag-and-Drop-Funktionen ist das konkrete Warten der Inhalte ein Klacks.

Ein bewährtes und solides Chassis

Powered by Zend Framework (ZF) heißt es auf der virtuellen Heckscheibe von pimcore. Und wo es draufsteht, ist es auch drin. Architektonisch gesehen basieren die Kernfunktionen für die Verwaltung der Dokumente, Assets und Objekte zu 100% auf dem MVC-Modul des Zend Frameworks. So übernimmt zum Beispiel der Zend_Controller den gesamten Dispatch-/Routing-Prozess. DieZend_Views regeln die ganze Templatethematik. Eine dedizierte Templatesprache à la Smarty gibt es bei pimcore nicht. Wer die Zend_View_Helper kennt, weiß warum. Der Einsatz von PHP selbst als Templatesprache mit den unterstützenden Helpern ist mit ein wenig Disziplin das geeignete Werkzeug für den View-Layer. Des Weiteren ist Zend_Locale für das das Thema der Internationalisierung, Zend_Search_Lucene für die Volltextsuche und Zend_Cache für das objektbasierende und getaggte Caching zuständig. Diese Liste würde sich hier fast beliebig lang fortsetzen lassen. Kurzum: Eine sinnvolle Kooperation zwischen CMS und bestehendem Framework, ohne das Rad neu erfinden zu müssen.

Chromspoiler und Endrohr

Pimcore bietet, obwohl erst in der “jungen” Version 1.1, bereits ein interessantes Featureset für die Umsetzung anspruchsvoller Websites und -applikationen. Um nicht den Umfang des Artikels zu sprengen, möchte ich mich im Zuge dieses Workshops auf den RAD-Aspekt von pimcore konzentrieren. Und wenn man bei pimcore von RAD spricht, sind meistens das Objektmodul und die zusätzlichen Plug-ins gemeint. Das Objektmodul ist eine der drei Core-Komponenten von pimcore. Hauptzweck ist die Verwaltung strukturierter Inhalte und deren Relationen. Das Modul selbst kann in zwei separate Bereiche unterteilt werden: Die Klassenverwaltung, die sich um die Definition der Datenstrukturen kümmert, und den Objekteditor, der für das konkrete Management der strukturierten Daten zuständig ist. Aber bevor wir jetzt richtig los legen und so richtig Gas geben, ein paar einleitende Worte zur Workshopaufgabe.

Das heutige Rennen

Im Zuge dieses Artikels soll ein einfacher Werkstättenfinder inkl. Wartungs-Backend und Frontend-Suche erstellt werden. Die Applikation soll dem Besucher die Möglichkeit geben, anhand verschiedener Kriterien, die passende Autowerkstätte zu finden. Ohne das passende Umsetzungswerkzeug läuft da aber gar nichts – das ist klar. Um dem Achtzylinder pimcore einen satten Röhrer zu entlocken, braucht es PHP 5.3, einen Webserver (mod_php/fastCGI) und MySQL 5. Nach dem Download schnell das pimcore Package installiert und die einfache Setuproutine aufgerufen, und schon kann es losgehen. Noch einfacher? Laden Sie sich das pimcore VMware Image herunter: Ein fertiges Bundle, bestehend aus dem Web Application Server (Zend Server), MySQL 5, der pimcore-Installation und den Sourcen dieses Artikels befördern Sie rasch zur Pole Position. Zend Server unter die Haube zu bringen, ist zwar kein Muss, er macht aber aus dem Serienmodell PHP 5.3 einen ordentlichen Bi-Turbo: Der Optimizer+ beschleunigt als schnellster Opcode-Cache pimcore von 0 auf 100 in wenigen Millisekunden. Und auch die integrierten Cache-Mechanismen (Data Cache in Verbindung mit Zend Framework oder Full Page Cache) kitzeln noch einiges an Leistung aus dem Boliden heraus. Außerdem kann man immer die aktuellste Version von Zend Framework und PHP ohne Komplettaustausch des Motors einsetzen – Updates sind im Zend-Server serienmäßig mit drin. Natürlich finden Sie mehr und detailliertere Informationen zum Setup und zur Konfiguration unter pimcore.org. Aber jetzt lassen Sie uns anfangen. Ganz langsam zum Start rollen. Nur nicht im letzten Moment noch eine Regelüberschreitung kassieren. Und egal, ob Sie das kommende Rennen textuell (hier im Artikel) verfolgen oder per Videoübertragung (dem der aktuellen CD beiliegenden Screencast) mit dabei sind, es wird auf jeden Fall spannend. Schlüsselszenen werden im Artikel mit einem Timecode versehen, damit Sie in der Videoübertragung schnell die gewünschte Szene finden. Viel Spaß!

Definition der Datenstrukturen

Nun zart das Gaspedal antippen. Es geht los. Melden Sie sich unter http://IHR-SERVER/admin mit Ihren Credentials an (Default: admin/admin). Nach der Überprüfung des Ladedrucks und dem Laden der Interfacekomponenten startet pimcore das Backend (Abb. 1).
Abb. 1: Das pimcore Backend-Interface

Abb. 1: Das pimcore Backend-Interface

Bei der Applikationsentwicklung setzt pimcore durchgehend auf das MVC-Pattern. Daher beschäftigt sich der erste Schritt mit der Definition der benötigten Datenmodelle:
  • Kategorien (Arten von Werkstätten)
  • Marken (Markenunterstützung der Werkstätten)
  • Werkstätten
Bei der Definition der Modelle verdeutlicht pimcore seinen RAD-Ansatz. Die Definition erfolgt direkt über das pimcore Backend – vollkommen ohne programmatischen Zwischenschritt. [02:45] Fangen wir mit der Definition des Datenmodells für die Werkstättenkategorien an. Wählen Sie aus dem pimcore-Hauptmenü die Option Einstellungen | Objekt | Klassen aus. Diese Option öffnet die Klassenverwaltung. Über diese werden neue Datenmodelle definiert bzw. bestehende Modelle adaptiert. Mit einem Klick auf Klasse erstellen und der Eingabe eines eindeutigen Modellnamens – in diesem Fall Kategorien – wird ein neues, noch leeres Modell definiert. Klicken Sie nun auf das neue Modell Kategorien, um den Modelleditor zu starten. Der Modelleditor ist das eigentliche Herz der Klassenverwaltung. Ein echtes Multitalent: Er kümmert sich um die Definition der konkreten Datenmodelle und ist für das Layout der korrespondierenden Wartungsinterfaces zuständig. Konkret folgt er einem recht visuellen, designerfreundlichen Ansatz: Im ersten Schritt wird eine Layoutkomponente definiert, die dann mit Datenkomponenten versehen wird. Im Release 1.1 von pimcore stehen die in Abbildung 2 und 3 gezeigten Komponenten zur Verfügung.
Abb. 2: Die Datenkomponenten in pimcore

Abb. 2: Die Datenkomponenten in pimcore

Abb. 3: Die Layoutkomponenten in pimcore

Abb. 3: Die Layoutkomponenten in pimcore

Nun aber wieder zurück zu unserem Projekt. Das Layout des Kategorien-Modells besteht momentan nur aus dem leeren Basiselement Basis. Klicken Sie mit der rechten Maustaste auf das Basiselement und wählen Sie die Option Layoutkomponente hinzufügen | Panel. Das Panel ist ein einfacher Container und dient zur Gruppierung der Datenkomponenten. Klicken Sie nun wiederum mit der rechten Maustaste auf das neue Element Panel und wählen Sie dieses Mal die Option Datenkomponente hinzufügen | Input. Diese Option fügt dem Panel eine klassische Inputdatenkomponente hinzu. Klicken Sie anschließend auf diese neue Komponente, um sie näher zu definieren. Pro Komponente können verschiedene Einstellungen getroffen werden. Geben Sie dieser neuen Datenkomponente den Namen name. Hinweis: Dieser Name muss pro Modell unique sein und identifiziert dieses Feld eindeutig. Der optionale Titel wird für das Label im Wartungsmodus verwendet. In diesem Fall geben wir dem Element den Titel “Werkstättenkategorie”. Danach klicken wir auf den Speichern-Button, der sich am rechten unteren Ende des Modelleditors befindet. Fertig. Das Modell wurde nun angelegt. Bei dem nächsten Modell Marken gehen wir grundsätzlich analog zu den Kategorien vor. Es gibt auch wieder die Datenkomponente name als Child-Element von einem Panel. Zusätzlich fügen wir nun eine neue Bilddatenkomponente ein. Klicken Sie mit der rechten Maustaste auf das Panel und wählen Sie die Option Datenkomponente hinzufügen | Bild. Klicken Sie auf dieses neue Element und geben Sie diesem Bildelement den Namen logo und den Titel “Markenlogo”. So, jetzt nur noch auf Speichern klicken und dann ist auch das Markenmodell fertig. Mittlerweile befinden wir uns in der zweiten Runde. Unser Bolide hat die Strecke gut im Griff. Pimcore brüllt gerade durch die leicht verregnete Schikane. Ohne Probleme. Weiter geht’s. [08:02] Der Aufbau des Hauptmodells Werkstätte ist ein wenig komplexer, und es beinhaltet die nötigen Relationen zu Kategorien und Marken. Die Anlage dieses Modells erfolgt wiederum ähnlich jener der bisherigen Modelle. Lediglich die eingesetzten Layout- und Datenkomponenten unterscheiden sich leicht.
Abb. 4: Komponenten des Werkstättenmodells

Abb. 4: Komponenten des Werkstättenmodells

Das Basiselement Basis beinhaltet nun als erstes Child-Element die Layoutkomponente Tabpanel, die wiederum der Parent der zwei klassischen Panels BaseData und AdditionalData ist. In dieser Konstellation werden die zwei Child Panels als Reiter dargestellt. Da ein Reiter auch ein Label benötigt, muss bei diesen zwei Panels auch ein Name und ein Titel vergeben werden. Wie man sieht, können Layoutkomponenten ineinander verschachteln, um auch komplexe Admin-Interfaces für Modelle zu konstruieren. Bis auf die Datenkomponenten brands und categories dürfte eigentlich alles klar sein. Die Icons in Abbildung 4 geben Aufschluss über den jeweiligen Komponententyp, und der Name der jeweiligen Komponente wird rechts davon angezeigt. Die vorher bereits erwähnten Datenkomponenten brands und categories verhalten sich etwas anders. Diese Komponenten des Typs Objekte dienen dazu, Relationen zu Objekten anderer Modelle herzustellen. Um diesen Datentyp zu konfigurieren, gehen Sie folgendermaßen vor: Fügen Sie mit Datenkomponente hinzufügen | Objekte die Komponente zu dem Panel AdditionalData hinzu. Nachdem Sie den Namen vergeben haben (brands/categories) klicken Sie auf die erstellte Komponente. Danach klicken Sie im Bereich Einstellungen (Objekte) auf Add, um zu definieren, zu welchen Modellen – entweder Kategorien oder Marken – eine Relation aufgebaut werden soll. Bitte das Speichern des Modells nicht vergessen.

Boxenstopp und einmal Volltanken

Auch der stärkste Brummer muss mal einen Boxenstopp einlegen. In diesem Fall nicht um Auszuruhen, um die müden Glieder wieder auf Vordermann zu bringen, sondern um Nachzutanken. Kein Benzin. Kein Kerosin. Content muss es sein. Aber zackig. Um die nächsten Runden zu bewältigen und beim Werkstättenfinder weiterzukommen, müssen bzw. sollten die drei Datenmodelle mit ein paar (Sample-)Daten gefüttert werden. Und so geht’s: [15:00] Am linken Rand des pimcore Backends befindet sich der pimcore-Navigator. Er besteht aus den Bereichen DokumenteAssets und Objekte. Der Navigator beinhaltet sämtliche pimcore-Inhalte, angefangen von Webdokumenten, über digitale Assets bis hin zu den strukturierten Objekten. Und um Letztgenanntes geht es uns in diesem Workshop. Klicken Sie auf Objekte, dann mit der rechten Maustaste auf das Root-Element home. Wählen Sie die Option Ordner hinzufügen und fügen Sie, indem Sie die Schritte wiederholen, die OrdnerMarkenKategorien und Werkstaetten hinzu. Diese Ordner dienen uns als Container für unsere Objekte. Aber keine Angst: Natürlich können die Objekte später einfach via Drag and Drop verschoben werden. Nachdem Sie die Ordner angelegt haben, klicken Sie mit der rechten Maustaste auf den Ordner Marken, wählen Sie im Kontextmenü die Option Objekt hinzufügen | Marke aus. Diese Option erstellt ein leeres Objekt des am Anfang erstellten Datenmodells Marke. Geben Sie diesem einen eindeutigen Namen, z. B. “Audi”. Das Objekt wird geöffnet und die Eingabemaske mit den zwei Eingabefeldern Name und Marken-Logo erscheint. Als Name geben Sie einfach “Audi” ein. Bei dem Bild wird es etwas diffiziler. Warum? Ja, weil wir noch kein Bild hochgeladen haben. Darum. Aber das haben wir gleich … Um ein Asset hochzuladen, klicken Sie im pimcore-Navigator auf den Bereich Assets. Rechtsklick auf das Root-Element home und dann die Option Asset(s) hinzufügen auswählen. Wählen Sie im folgenden Dialog die gewünschten Bilder aus und laden Sie diese in das pimcore Asset Management. Sobald das Bild fertig hochgeladen wurde, erscheint dieses im Baum des Asset-Managements. Und jetzt kommt der große Schritt: Um dieses neue Bild dem Marken-Logo des Audi-Objekts zuzuweisen, ziehen Sie das Bild (ohne es anzuklicken bzw. zu öffnen) mit gedrückter linker Maustaste auf den Marken-Logo-Bild-Platzhalter (rote Zielscheibe). That’s it. Übrigens, die Verknüpfung von Objekten – relevant bei Objekten des Modells Werkstätten – funktioniert ebenfalls nach demselben Prinzip: Ziehen Sie einfach das Objekt in den jeweiligen Container. So, das war jetzt ein kurzer Ausflug in das Wartungsinterface von pimcore. Auch ganz interessant, oder? Vollgetankt und zufrieden können wir nun das Rennen fortsetzen und die nächste technisch hoch interessante Etappe in Angriff nehmen. Aber keine Angst: Pimcore schmeißt Sie nicht ab.

Der Motor dahinter

Eine technische Etappe mit pimcore? Wie sich das anfühlt? Gewaltig! Durch das Zend Framework sportlich, druckvoll und spontan am Gas und dennoch sehr kultiviert. Das M vom MVC haben wir bereits vor ein paar Runden hinter uns gelassen: Die Modelle sind fertig und auch schon mit Sample-Daten gefüllt. Kümmern wir uns nun um das “C” wie Controller. Der Controller ist für die Applikationslogik zuständig und steuert den Ablauf unseres Werkstättenfinders. Die Applikation ist sehr einfach gehalten und hat grundsätzlich nur zwei mögliche Aktionen:
  • listAction
  • detailAction
Über die listAction werden passende Werkstätten gesucht und als Ergebnisliste ausgegeben. Die detailAction ist für die Detaildarstellung der Werkstatt zuständig. Die generelle Projektstruktur bzw. das Filesystemlayout folgt dem Layout der Zend_Controller-Komponente. Die Applikation ist modulartig aufgebaut: Das Frontend-Modul ist, um die Übersicht zu bewahren und eine klare Struktur zu haben, etwas herausgelöst und befindet sich im Verzeichnis /website/. Wie bei Zend-Framework-Projekten üblich, befinden sich die eigentlichen Controller im Verzeichnis /website/controllers/. Bei der Benennung der Controller und der Views gelten die Zend-Framework-Namenskonventionen. [29:06] Nun ein fliegender Fahrerwechsel hin zur favorisierten IDE – in diesem Fall das Zend Studio. Und dort schauen wir uns den Controller einmal im Detail an:
_getParam("brand")){
$condition[] = "brands LIKE '%,".intval($this->_getParam("brand")).",%'";
$this->view->selectedBrand = $this->_getParam("brand");
}
if($this->_getParam("category")){
$condition[] = "categories LIKE '%,".intval($this->_getParam("category")).",%'";
$this->view->selectedCategory = $this->_getParam("category");
}

$shops = Object_Werkstaette::getList(array(
"condition" => implode(" AND ",$condition),"limit" => $limit,
"offset" => $offset, "order" => "ASC", "orderKey" => "name"));
$this->view->shops = $shops;
$this->view->categories = $categories;
$this->view->brands = $brands;
}

public function detailAction (){
$shop = Object_Werkstaette::getById(intval($this->_getParam("id")));
$this->view->shop = $shop;
}
}
?>
Der Controller erweitert die Klasse Website_Controller_Action, einem abstrakten projektspezifischen Controller basierend auf der Zend_Controller_Action-Klasse, der beliebig an die eigene Applikation angepasst werden kann. Unser Controller beinhaltet die zwei Actions listAction und detailAction. Über das pimcore-API stehen dem Controller alle Klassen und Datenobjekte zur Verfügung. In diesem Fall nutzen wir das API für den Zugriff auf die strukturierten Daten (Objekte im pimcore-Jargon). Wenn man im Zuge der Modelldefinition, wie bereits geschehen, ein neues Modell erstellt, wird zusätzlich automatisch eine PHP-Modelldefinition angelegt. Mit allen nötigen Gettern und Settern. Damit kann sehr schnell und einfach – die richtige IDE vorausgesetzt – durch Code-Completion und Code-Assist auf alle möglichen Daten und Methoden zugegriffen werden (Abb. 5).
Abb. 5: Automatische Code-Completion im Zend Studio auf Basis der Modelldefinition

Abb. 5: Automatische Code-Completion im Zend Studio auf Basis der Modelldefinition

Wenn man in pimcore codeseitig mit Objekten arbeitet, ist das Basis-API grundsätzlich folgendermaßen aufgebaut:
Object_Modellname::some_function();
Der Modellname ist dabei natürlich austauschbar. Wenn man zum Beispiel alle Objekte des Modells mit dem Namen Kategorien abrufen möchte, verwendet man die FunktionObject_Kategorien::getList(). Die Funktion getList() liefert in diesem Fall eine Liste aller Kategorien. So geschehen in der listAction, wenn es um die geht. Für die gilt das Gleiche. Und wie man bei den sieht, kann die Funktion getList() noch um weitere Parameter ergänzt werden. Beispiel dafür wäre eine spezielle SQL-Condition. Insofern ist die Aktion listAction einfach aufgebaut: Am Anfang werden über das pimcore-API alle Kategorien und Marken bezogen. Dann wird auf Basis der übermittelten HTTP-Parameter (_getParam()) eine Such-Query erstellt, die dann als Condition für die Funktion Object_Werkstaette::getList() dient. Am Ende werden alle Daten an die View übergeben (->view->…), die in Folge für das konkrete Rendering zuständig ist. Die Struktur der zweiten Aktion detailAction ist noch einfacher: Diese nutzt die API-Methode getById(), um die Daten einer einzelnen Werkstätte abzurufen. Die jeweilige ID wird als HTTP-Parameter zur Verfügung gestellt. Grundsätzlich können so gut wie alle pimcore-Funktionen per API angesteuert werden. So besteht beim Objekt-API natürlich auch die Möglichkeit, Objekte programmatisch anzulegen, zu editieren bzw. zu löschen. Dies ist oft sehr hilfreich, wenn es um die Erstellung von komplexen Importern, etc. geht. Mit dem, was in diesem Kurzworkshop gezeigt werden kann, kratzen wir natürlich nur an der Oberfläche des pimcore-Triebwerks: Erst wenn es um Themen wie die Objektvererbung, das intelligente Caching oder die Versionierung von Objekten geht, brummt der Motor. Aber nie laut – immer dezent. Schließlich heißt es, Performanz in jeder Verkehrssituation zu halten.

Vollgas und trotzdem die View genießen

“Habe die Ehre, Zend Views”, oder “Derre Oida”, wie man in Österreich gerne freundlich die Zend Views begrüßt. Pimcore verwendet wie bereits angesprochen keine eigene Templatesprache. Kein Smarty und kein TypoScript, nichts, Nada. Nur PHP. Und das “on purpose”. Und das macht es – IMHO – einfach. Gerade wenn man die Zend Views und die View Helper kennt. [43:52] Die View-Skrips befinden sich, ebenfalls ganz im Stil der Zend-Frameworks-Projektstruktur, in /website/views/scripts/. Sie werden dort nach dem Schema /controller/action.php abgelegt. Konkret geht es in diesem Beispiel um die Views /finder/list.php und /finder/detail.php. Analog zum MVC-Prinzip werden die Variablen und Datenobjekte vom jeweiligen Controller der zugehörigen View zugewiesen. Ein Beispiel gefällig? Im Controller Listing wird mit ->view->shop ein konkretes Werkstättenobjekt an die zugehörige View übergeben. In der View selbst kann man nun einfach per ->shop auf das betreffende Objekt zugreifen. Das folgende Listing ist ein Auszug aus der /finder/list.php-View und kümmert sich um die Auflistung der Werkstätten:
shops as $shop) { ?>
<img src="getImage()->getThumbnail("list") ?>" /><a href="/shops/getName() . "-" . $shop->getCity()) ?>_getId() ?>">getName() ?>getStreet() ?>, getZip() ?> getCity() ?>
In der Variable $this->shops befindet sich ein Array mit Objekten vom Typ Object_Shop. Innerhalb der foreach-Schleife kann nun komfortabel auf die einzelnen Datenfelder unserer Werkstättenobjekte zugegriffen werden. Nur noch einmal zur Wiederholung: Die verwendeten Objektmethoden getCitygetStreet etc. wurden bereits im Zuge der Klassendefinition angelegt. Die View /finder/detail.php setzt auf das gleiche Prinzip:

Kontakt

shop->getName() ?> shop->getStreet() ?> shop->getZip() ?> shop->getCity() ?> Telefon: shop->getPhone() ?> Fax: shop->getFax() ?> shop>getEmail() ?> <a href="shop->getWebsite() ?>">shop->getWebsite() ?>
Hier wurde vom Controller ein einzelnes Objekt vom Typ Object_Shop an die View übergeben. Mit $this->shop kann nun auf das Objekt zugegriffen werden. Über die diversen Getter erfolgt der konkrete Datenzugriff. Langsam geht es in die Zielgerade. Der Newcomer hält sich gut. Und was für ein Rennen! Spektakuläre Drifts und dröhnendes Motorgeräusch. Da spürt man die Pferdestärken. Und der Newcomer pimcore hält sich gut. Wie von der Faust des Allmächtigen getrieben, bewegt sich der Bolide durch die letzte Runde. Jetzt heißt es cool bleiben – nur nicht die Nerven verlieren.

Mit dem richtigen Routing zum Ziel

Auch die stärkste Engine kommt aus der Puste, wenn sie den Weg nicht findet. Bei einem Rennen darf so ein Fauxpas wirklich nicht passieren. MVC hin oder her, ein wichtiger Bestandteil des Gesamtbilds fehlt noch: Das Routing der konkreten Anfrage. Der Zuschauer möchte was sehen: Am besten etwas Spektakuläres. Im klassischen Dokumentenmodul von pimcore übernimmt das Routing das System selbst. Sobald man in diesem Modul eine Seite anlegt, kann man sie direkt über den Pfad des Dokuments – wie im Baummenü dargestellt – im Browser abrufen. Da greift das KISS-Prinzip. Im Gegensatz dazu basiert unsere kleine Webapplikation auf dem Objektmodul und das Routing ist nicht vergleichbar mit dem der klassischen Webdokumente. Bei dem Routing von Objekten heißt das pimcore-Zauberwort “Static Routes”. [1:03:15] Wählen Sie dazu im Menü die Option Einstellungen | Benutzerdefinierte Routen aus. Bei den benutzerdefinierten Routen kann man selbst Hand anlegen und auf das Routing manuell einwirken. Für unser Beispiel benötigen wir zwei Routen, eine für die Liste und die andere für die Detaildarstellung der Werkstätte. Um diese anzulegen, klicken Sie auf Hinzufügen. Im ersten Schritt wird das Pattern definiert, auf die die Route anspringen soll. Das Pattern ist nichts anderes als eine Regular Expression, die zutreffen muss, damit die Action im gewünschten Controller ausgeführt wird. Die Action und der Controller werden in den zwei folgenden Feldern eingetragen. In den regulären Ausdrücken kann man Platzhalter verwenden, die im Feld Variablen auf einen Parameter abgebildet werden. Auf diese kann im Controller dann wie gewohnt per $this->_getParam(“name”) zugegriffen werden. In der Spalte Vorgabewerte können zusätzlich noch fix definierte Parameter hinzugefügt werden, die dem Controller ebenfalls zur Verfügung stehen sollen. Für unser Beispiel werden die benötigten Routen wie folgt konfiguriert:

Liste

Pattern /^/shops/?$/
Controller finder
Action list
 

Detailseite

Pattern /^/shops/([a-zA-Z-]+)_([0-9]+)/?$/
Controller finder
Action detail
Variablen text,id
Die Konfiguration der Detailseite ist ein gutes Beispiel für eine etwas komplexere Route. Dabei ist es gut ersichtlich, wie die Platzhalter in den regulären Ausdrücken mit den kommagetrennten Variablen zusammenhängen: Der Ausdruck ([a-zA-Z-]+) bezieht sich auf die Variable text, der zweite Ausdruck ([0-9]+) auf die ID. Was heißt das nun alles konkret? Ganz einfach: Die Listendarstellung ist über die Route http://IHR-SERVER/shops/ erreichbar und die Detailseite einer Werkstätte beispielsweise über http://IHR-SERVER/shops/pimpschuppen-mair-3 Die 3 bezieht sich in diesem Beispiel auf die pimcore-ID der jeweiligen Werkstätte. Ein letztes Aufbäumen des Achtzylinders, ein letztes Röhren, das Mark und Bein erschaudern lässt. Schon wird die schwarz-weiße Flagge geschwenkt. Das Rennen ist vorbei und der Sieger steht fest. Die Menge jubelt …

Newcomer mit Profil

… obwohl ihr durchaus bewusst ist, dass es nur ein Testlauf war. Ein Testlauf außer Konkurrenz, auf einer unbekannten Strecke – mitten im Herzen von Österreich. Aber eines ist klar geworden: Der Bolide macht einen wirklich guten Eindruck und damit meine ich nicht nur den ersten. Und sein Wille? Ja, er will mehr! Und er kann bereits mehr, als man vielleicht glaubt. Schon in seinen jungen Jahren. Er ist ein Newcomer mit Profil. Und ich sage es Ihnen: Behalten Sie ihn auf Ihrem Radar.
Geschrieben von

Dietmar Rietsch Redaktion

Kommentare

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


6 − = eins

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>