Inspiriert vom diesjährigen eZ Summercamp…
Dieses Mal versuchen wir den viel gerühmten Symfony2 WebProfiler zu knacken und bauen eine kleine exemplarische Funktion, das Löschen des eZ-Caches, direkt in die Symfony2 Toolbar ein. Dieses Beispiel zeigt lediglich, was mit dem Profiler möglich ist und schafft den Rahmen für weitaus mehr Funktionalitäten rund um das Profiling und Debugging. Sämtliche Dateien zu diesem Tutorial stehen hier zum download bereit.

Wie kommen Daten überhaupt in den Profiler?

Das Stichwort heißt Data Collector, einer von vielen großartigen Ansätzen von Symfony. Vom Prinzip her sammelt der Data Collector, wie der Name schon sagt, permanent Daten in einer Art globalen Stack um daraus sämtliche Profiler Angaben zu holen. Man kann jederzeit etwas zu diesem Sammelbehälter dazu stopfen und hat global diese Daten zur Verfügung. Das Ganze wird mit einem von Symfony kommenden Bundle schön als bedienbares Webinterface ausgegeben. Oder z.B. auch für die aggregierte Darstellungen in der mit Javascript nachgeladenen Toolbar.

 

Ein Profiler Bundle anlegen

Um dieses Profiler Bundle zu bearbeiten setzen wir eine Sandbox Umgebung voraus, wie in einem unserer vorigen Beiträge beschrieben: Ein eigenes Symfon2 Bundle. Ich werde hier nur auf elementare Ausschnitte eingehen. Der komplette Quellcode kann jeweils auf github eingesehen werden. Die Dateien werden wie folgt  im Verzeichnis EzPublishProfilerBundle angelegt.:

Der Data Collector

Zunächst benötigen wir den eigentlichen Data Collector, welcher als PHP-Klasse angelegt wird.
Der Name des Bundle-Verzeichnisses ist natürlich frei wählbar, während die Bezeichnung und Notation des Data Collectors und dessen Verzeichnisses eingehalten werden muss.
src/Ymc/EzPublishProfilerBundle/DataCollector/EzPublishDataCollector.php

Die Methode collect muss gesetzt sein und wird beim Aufruf automatisch ausgeführt. Wir setzen hier lediglich Bsp. Inhalte in die Felder des geschützten Klassenattribut data.

Die Methode getName() muss ebenfalls gesetzt werden, um den Data Collector eindeutig identifizieren zu können.

Über eigene öffentliche Getter-Methoden können dann, wie es beliebt die data-Attribute für die Ausgabe im View zur Verfügung gestellt werden. z.B.

Der Zugriff in einem beliebigen View Script könnte dann so aussehen:

Es wird der String ‘eZ Publish5′ ausgegeben. Selbstverständlich können hier weitaus interessantere Debugging- und Profiling- Daten von eZ Publish 5 kommend eingefügt werden, Mit dem Ziel, diese nachher im Profiler oder in der Toolbar auszugeben.

Die Profiler Erweiterung

Über die Möglichkeit der Dependency Injection, welche uns Symfony 2 bietet, erweitern wir den Profiler. Dies geschieht über die Einbindung einer weiteren Config-Datei services.yml, in der unsere erweiternden Angaben zum Profiler stehen.
src/Ymc/EzPublishProfilerBundle/DependencyInjection/YmcEzPublishProfilerExtension.php

In der Config Datei werden die zusätzlichen Klassen, wie unser eigens erstellter Data Collector angegeben und welches Template genutzt werden soll, etc. /src/Ymc/EzPublishProfilerBundle/Resources/config/services.yml

Das Profiler Template

Versuchsweise werden wir nun das Profiler-Template minimal befüllen, um uns zu vergewissern ob alles funktioniert. Die Notation der Twig-Blöcke sind vorgegeben, damit in den entsprechenden Bereichen eine Ausgabe stattfinden kann. Z.B fügen wir damit ein weiteres Item zur Symfony 2 Toolbar mit einem Hover-Layer hinzu.

Das Ganze wird gespeichert unter: /src/Ymc/EzPublishProfilerBundle/Resources/views/Collector/ezpublishdata.html.twig und sieht dann so aus:

Da es funktioniert, können wir nun ernsthaft überlegen, was wir alles damit anstellen könnten. Als kleine Spielerei könnte man z.B. das Löschen des Caches über den Ez-Admin hier einfügen. Dann hätte man direkt in seiner Development Umgebung die Möglichkeit die Caches zu verwalten oder andere Admin Funktionen auszuführen. Dann fangen wir mal an:
Damit das Anmelde Cookie des Admin auch auf der Seite zur Verfügung steht, damit wir dieses per jQuery abfragen können, bedienen wir uns versuchsweise eines einfachen Hacks: Das einbinden des Admins per nicht sichtbaren iFrame in die Profiler Toolbar:

Die Bilder für die Profiler-Toolbar werden als “data:source” angegeben, da hier wie ich vermute die Pfade zu Bildern nicht zur Verfügung stehen, da die gesamte Toolbar in Symfony per Javascript dynamisch in das Markup nachgeladen wird.
Das gesamte Template erhält nun noch dasselbe Formularelement wie im Admin-Bereich zum Löschen der Caches, und fertig ist unsere vorläufige Admin Funktionalität in der Toolbar: src/Ymc/EzPublishProfilerBundle/Resources/views/Collector/ezpublishdata.html.twig

Zusätzlich werden wir noch etwas jQuery code einfügen müssen um dieses kleine Tool voll funktionsfähig werden zu lassen. Per jQuery prüfen wir ob das Cookie gesetzt ist, welches bei der der Anmeldung über den eZ Admin gesteuert wird. Is das der Fall, kann ein Button eingeblendet werden, welcher das Cache löschen Formular per Ajax triggert und die response entsprechend verarbeitet. Das Ganze dann schön mit einer Ladeanimation verpackt, wird die komplette Javascript-Datei dann doch etwas aufwändiger: src/Ymc/EzPublishProfilerBundle/Resources/public/js/profilertoolbar.js

Damit nun das Javascript noch eingebunden wird, wenn wir uns im Development Mode befinden, ist es als letzter Schritt nötig die Javascript Datei in unserem Page-Layout zu verlinken.

Nun steht die Funktionalität vollständig zur Verfügung: Ein Formular des eZ Publish Admins wir per Ajax aufgerufen und das Ergebnis verarbeiten wir in der Symfony2 Profiler Toolbar.

Bei einem Klick auf das eZ Item geht das eigentliche Profiler Panel auf. Hier können weitere Daten detailliert zu eZ Publish ausgegeben werden, was wir mit Sicherheit in einem der folgenden Artikel genauer erläutern werden:

Das war ein weiterer Blogartikel in unserer “Hands On”-Serie zu eZ Publish 5. Wir freuen uns über Kommentare und Ideen für weitere Artikel.

(This blog post is also available in English)

0 Kommentare

Einen Kommentar abschicken

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