Pimcore – Interessantes OpenSource CMS
Ein Gastbeitrag von Tim Glabisch
Junger Software und Webentwickler aus Düsseldorf, Vollzeit bei anyMOTION Graphics GmbH und auf jedem Treffen der PHP UG Düsseldorf dabei.
Wir haben regelmäßig die interessante Aufgabe, für Kunden Content Management Systeme zu evaluieren. Typische Vertreter, welche wir eingesetzt haben, sind Drupal, TYPO3 4.x, WordPress und viele weitere.
Daraufhin bin ich tief in mich gegangen und habe mich gefragt, was mich an den Lösungen stört, welche mir bis zu diesem Zeitpunkt bekannt waren. Ich überlegte mir ganz genau was ein CMS für mich erfüllen muss, damit ich effektiv und gerne damit arbeiten kann.
Ich bin recht schnell zu dem Schluss gekommen, dass ich mit keinem CMS, mit dem ich je gearbeitet habe, wirklich zufrieden war – ich gebe zu, ich bin recht anspruchsvoll . Also begab ich mich auf die Suche nach einem für uns brauchbaren System – aber was bedeutet brauchbar? Sicher ist diese Frage nicht einfach zu beantworten und jede Instanz würde eine andere Antwort geben.
Der Projektleitung ist wichtig, dass Timings eingehalten werden. Die Konzeption will ein flexibles System mit dem der Designer sich verwirklichen kann. Der Flasher möchte saubere API’s für den Datenzugriff, idealerweise AMF, XML und Json. Nicht zu vergessen die arme, studentische Aushilfe, die den Content einfach, logisch und intuitiv pflegen können soll, um zeitaufwendige Rückfragen oder gar weitreichende Pflegefehler zu vermeiden.
Natürlich gibt es viele weitere Instanzen, welche ich euch nun mal vorenthalten möchte, um den Entwicklerhut anzuziehen und mich zu fragen, was alle gemeinsam haben.
Alle wollten in alle Richtungen ein flexibles und robustes System.
Wenn ich mich als Entwickler frage, was ein flexibles und robustes System ausmacht, wäre meine intuitive Antwort:
- Standardisierte Datenhaltung,
- Nutzung von Standards (MVC, Frameworks, …),
- Strukturierter und durchdachter Aufbau
Ich war also auf der Suche nach einem CMS, welches diese eigentlich nicht besonderen Punkte beherrschen sollte. Jedoch hatte ich bis dato die Erfahrung gemacht, dass viele Systeme mir mehr Arbeit machten, als mir abnahmen. Zu diesem Zeitpunkt habe ich häufig Projekte mit CakePHP “gebacken” und konnte mir nicht erklären, warum die breite Masse der Systeme kein solides und etabliertes Framework als Basis nutzt. Meine einzige sinnvolle Erklärung wäre auf die Zielgruppe zurückzuführen. Viele Systeme sind nicht darauf ausgelegt, dass ein fähiger Entwickler oder gar ein Softwarearchitekt mit diesen arbeiten. Vielmehr wird auch damit geworben, dass keinerlei Programmierfähigkeiten benötigt werden, um das System zu verstehen und eine Webseite damit aufzubauen. Ich halte dies für einen folgeschweren Fehler und würde es befürworten, wenn Entwickler Seiten aufbauen und allen anderen Instanzen die Möglichkeit geben, diese effektiv zu pflegen und Datenstrukturen zu betreuen.
Über viele Umwege bin ich daraufhin auf Pimcore(.org) gestoßen und möchte meinen weiteren Beitrag diesem CMS widmen.
Pimcore ist ein recht neues CMS, welches von der österreichischen Firma elements.at entwickelt wird. Es steht unter OpenSource und baut auf PHP 5.3. Das Backend wird vollständig von ExtJs generiert und ist somit recht elegant bedien- und erweiterbar.
Solltet Ihr ein Baukastensystem suchen, mit dem Ihr euch eine Webseite zusammen klicken wollt, so ist Pimcore definitiv nicht das richtige für euch. In diesem Fall empfehle ich euch an dieser Stelle abzubrechen und euch mit Systemen wie TYPO3 4.x oder WordPress auseinanderzusetzen. Pimcore ist kein fertiger Homepagebaukasten. Also – auf die Wunsch-IDE und weiter geht’s =).
Pimcore basiert vollständig auf dem Zend Framework und setzt dessen MVC Konzept elegant und sauber um. Im Klartext bedeutet dies: Alles was mir eine Zend MVC Application bietet, bietet mir auch Pimcore.
Wenn man sich mit Pimcore auseinandersetzt, lernt man häufig nicht, wie Pimcore arbeitet und was es tut, sondern wie das Zend Framework elegant mit ExtJS im Einklang steht. Dies hat den gewaltigen Vorteil, dass man selbst dann nichts unnötiges gelernt hat, wenn man sich später gegen das System entscheiden sollte.
Ich hoffe daraus ist klar geworden, weswegen mir Standards in einem CMS sehr wichtig sind. Ich suche kein CMS welches das Rad neu erfindet, sondern möchte mit einem erprobten und soliden Design Anforderungen effektiv und elegant lösen können. Nicht wie es das CMS vorschreibt, sondern so, wie es Bücher zur guten Softwarearchitektur seit vielen Jahren vormachen.
Mit einer leeren Pimcore Installation wird man nicht weit kommen. Controller, Views und die Seitenstruktur müssen wie in einem Zend MVC Projekt angelegt werden. Hier ist es definitiv von Vorteil bereits mit einem MVC Framework Erfahrung gemacht zu haben. Ansonsten empfehle ich vorab ein Grundtutorial für Zend MVC.
Das Pimcore Entwicklerteam bietet ein Example Package. Die Beispieldaten sind für Entwickler welche Erfahrung mit CakePHP, ZF MVC oder ähnlichen Systemen gesammelt haben, leicht zu verstehen. Pimcore richtet sich durchweg nach den Zend Framework Konventionen.
Ich empfehle jedem Pimcore in seine IDE zu laden. Ihr habt ein CMS vor euch, welches euch erlaubt euren Beruf nachzugehen und zu Entwickeln. Dies geht so weit, dass Ihr selbst Grundelemente wie eine Breadcrumb oder ein Menu selber implementieren dürft. Das Example Package zeigt u.a. wie dies elegant gelöst werden kann.
Aber die Dokumentation?
Früher oder später werdet ihr euch fragen, warum die Dokumenation noch so knapp ist und es keinen stört. Zum einen ist die Zielgruppe der erfahrende Entwickler, zum anderen stellt sich eigentlich kaum die Frage wie Pimcore funktioniert. Viel wichtiger ist, dass man Erfahrung mit dem Zend Framework und ExtJS sammelt und sich mit dessen Dokumentationen auseinandersetzt.
Hier zwei kleine Beispiele:
Pflegen von Objekten (Daten)
Pimcore ermöglicht das Erstellen von völlig freien Datenstrukturen. Um dies ein wenig besser verstehen zu können, möchte ich euch von einem Gespräch zwischen mir und einem anderen Entwickler berichten. Ich habe diesen Entwickler gefragt, wo für Ihn die Unterschiede zwischen einem Newsartikel und einem Händlerdatensatz seien. Der Entwickler guckte mich verdutzt an und wusste nicht so wirklich wie er antworten sollte. Ich löste die etwas beklemmte Stimmung und erzählte, dass es für mich kaum Unterschiede gibt. Die Datenstruktur variiert von den Feldern, die Grunddatentypen sind jedoch identisch. Die API für den Zugriff auf die Daten ist minimal erweitert. Lediglich die Views unterscheiden sich vollständig.
Dennoch liegt im Hintergrund nur eine Datenbank welche mit Grunddatentypen arbeitet. Mit Hilfe dieser Grunddatentypen ist es mir quasi möglich jede erdenkliche Datenstruktur abzubilden.
Nehmen wir als Beispiel mal den Workflow zum Einrichten eines Newsbereichs in TYPO3 4.x. tt_news wird installiert, daraufhin können News eingepflegt werden. Sollten wir eine Händlersuche haben, so gibt es ein Plugin, welches uns ermöglicht Händler zu pflegen. Sollten wir Flash Elemente haben, so gibt es ein Plugin um Flash zu pflegen. Wollen wir was komplizierteres wie WebGL nutzen, so müssen wir halt unser Plugin selber schreiben. Für mich ist dieser Weg fatal, weil jedes Plugin sein eigenes Süppchen kocht und ich nicht mal innerhalb des Systems irgendeinen Standard feststellen kann.
Pimcore zwingt dazu, für alles, wofür man Daten speichern möchte, eine Datenstruktur anzulegen. Ihr hört richtig, es gibt kein Plugin in Pimcore um News anzuzeigen oder ähnliches. Nicht weil es nicht möglich wäre, sondern einfach weil es überflüssig wäre.
Ich möchte euch anhand eines kurzen Beispiels zeigen, wie man mit Pimcore eine Datenstruktur anlegt.
Als erstes muss man sich überlegen, aus welchen Feldern der Datensatz bestehen soll. Daraufhin wird eine Grundstruktur in Form einer Klasse angelegt.
Hier ein Screenshot aus einem einfachen von mir angelegten Newsobjekt:
Pimcore generiert anhand dieser Struktur Eingabeoberflächen für diese Objekte.
Hier ein kleiner Ausschnitt:
Selbstverständlich lassen sich auch komplexere Layouts umsetzen. Es ist quasi alles möglich, was ExtJs bietet. Panels, Accordions und selbst Google Maps ist einbindbar. Pimcore geht hier noch einige Schritte weiter. So werden im Hintergrund Klassen für den Zugriff auf die Objekte generiert.
Es ist auch möglich von Objektstrukturen zu erben oder Beziehungen zwischen Objekten aufzubauen. Dieses Konzept der Datenhaltung ermöglicht dem Entwickler einen sehr strukturierten, natürlichen und freien Umgang mit Daten. Zudem werden die Eingabeoberflächen auf das beschränkt, was wirklich benötigt wird. Nebeneffekte, wie eine saubere API und eine standardisierte Importmöglichkeit, runden das Gefühl der eleganten Datenhaltung ab.
CMS Seiten
Obwohl diese mit diesem Objekt-Konzept theoretisch auch abdeckbar wären, haben sich die Pimcore Entwickler etwas ganz besonderes einfallen lassen. Jede CMS Seite wird einem Controller und einem View untergeordnet. Der Controller erbt (wie sollte es auch anders sein) u.a. auch vom Zend_Controller_Action, der View ist auch nichts anderes als ein Zend_View. Selbstverständlich können Seitentypen vordefiniert werden, somit kann z. B. unser Produktbereich einen oder mehrere eigene Controller besitzen. Im Controller können wir dann elegant auf unsere Objekte zugreifen und dem View übergeben. Was ist aber mit normalem Content wie Bildern, Text, Links u.s.w.? Ganz einfach, im View gibt es verschiedene “Editables” (Block, Checkbox, Date, Href (1 to 1 Relation), Image, Input, Link, Multiselect, Numeric, Renderlet, Select, Snippet (embed), Table, Textarea,Video, WYSIWYG). Diese können direkt im View aufgerufen werden, Beispiel $this->image(‘some_unique_name’);. Im Hintergrund wird eine Instanz der Klasse Pimcore_Document_Tag_[EDITABLE] erzeugt, welche im ($this->)editmode ein Platzhalter für ein Drag&Drop Bilder bereitstellt. Im Frontend wird durch die __toString Methode ein Imagetag ausgegeben. Selbstverständlich könnte man im Frontend (oder Backend) auch nur die Source des Bildes ausgeben, oder banale Dinge wie das Altattribut hash’en und unsere Source durch mcrypt laufen lassen – Wir sind Entwickler, wir sind frei .
Sehr interessant ist die Nutzung von Blöcken innerhalb von Pimcore. Angenommen man möchte eine Seite haben, auf der ein Redakteur die Möglichkeit haben soll, beliebig viele WYSIWYG Fehler zu erzeugen, so ist dies sehr einfach möglich:
<? while ($this->block("contentblock")->loop()) { ?> <h2><?= $this->input("subline"); ?></h2> <?= $this->wysiwyg("content"); ?> <? } ?>
Selbstverständlich ist es auch möglich Blöcke in Blöcke zu schachteln, Limits anzugeben o. ähnliches. Ich würde empfehlen kurz damit zu spielen und sich daraufhin dies anzugucken:
<? while ($this->block("contentblock")->loop()) { if($this->editmode) { echo $this->select("blocktype",array( "store" => array( array("wysiwyg", "WYSIWYG"), array("contentimages", "WYSIWYG with images"), array("video", "Video") // Template, Label ), "onchange" => "editWindow.reload.bind(editWindow)" )); } if(!$this->select("blocktype")->isEmpty()) { $this->template("content/blocks/".$this->select("blocktype")->getData().".php"); } } ?>
Das Beispiel zeigt, wie mächtig dieses Konstrukt ist. Im Editmode wird eine Selectbox angezeigt und der Redakteur kann ein Template auswählen. Daraufhin wird das Template (content/blocks/[templatename]/.php) geladen und bietet die vom Entwickler festgelegten Datenstrukturen. Die Templates sind nichts als PHP Dateien in der ähnliche Funktionalität wieder enthalten sein kann. Wenn man dieses Grundprinzip einmal verstanden hat, kann man quasi jede erdenkliche Datenstruktur abbilden. Selbstverständlich wird alles vollständig WYSIWYG, im Kontext der Seite gepflegt.
Wir sind wie Pimcore.
Das für mich interessanteste an Pimcore habe ich euch noch vorenthalten, werde nun jedoch meiner Schuld Genüge tun. Pimcore registriert intern Module wie das CMS, die Webseite und den Pimcore Kern (Lib). Daraus ergibt sich, dass der Kern fast identisch aufgebaut ist wie die Webseite, weshalb alles schnell gefunden ist und man sehr elegant auf bestehende Funktionalität zurückgreifen kann. Am einfachsten verdeutlicht dies wohl ein Model.
So einfach kann es sein, eine neue Seite im CMS anzulegen…
Selbstverständlich gibt es für alles, was der Kern erledigt, Zugriffsmöglichkeiten. So könnten wir auch neue User erzeugen, oder auch exotischere Sachen, wie z.B. den Core updaten.
Zu guter Letzt
Pimcore bringt viele weitere innovative und sehr elegante Möglichkeiten mit. Beispielsweise die Anbindung zum Pixlr Bilderbearbeitungstool, einen wirklich brauchbaren In- und Export, globale Übersetzungen, eine Google Maps/Analytics Anbindung, ein nettes Rechtemanagement (Gruppenmanagement lässt noch etwas zu wünschen über), Versionierung, Schedule Tasks und vieles mehr. Ich hoffe ich konnte euch ermutigen, das System mal etwas genauer anzugucken.
Abschließend möchte ich mich noch beim Pimcore Entwickler Team für das CMS Bedanken.
Solltet Ihr Lust bekommen haben euch das System mal testweise anzugucken, empfehle ich die Demo Seite, welche hier zu finden ist:
http://demo.pimcore.org/admin/ german:demo oder english:demo.
Vielen Dank für eure Aufmerksamkeit, selbstverständlich freue ich mich über Feedback aller Art.