Hallo, ich möchte gern das fertige HTML parsen und leicht modifizieren bevor es gecached und an den Client ausgeliefert wird. Ich muss warten bis das ganze HTML fertig gebaut ist, da ich das finale HTML benötige. Meine Frage ist, an welches Event muss ich mein Plugin registrieren um das finale HTML zu bekommen und wie bekomme ich das HTML? Mit fetch() oder mit render()? Und wenn ich es dann modifiziert habe, wie kann ich die Änderungen wieder zurückspielen, so dass sie für alle weiteren Abläufe von Shopware zur Verfügung stehen? Vielen Dank für eure Tipps Robert
Könnte glaube ich noch spezieller und genauer beantwortet werden wenn Du genauer beschreiben könntest, was du genau erreichen möchtest. Klingt nämlich etwas ungewöhnlich und eher nach einer Modifizierung von Logik und nicht Markup … Schöne Grüße, Niklas
Ok, ich versuch es Ich möchte eine dynamische CSS und Javascript Generierung erstellen. Also pro Shop-Seite nur das CSS und JS laden welches die aktuelle Seite wirklich benötigt. Dazu würde ich das finale HTML parsen und anhand spezifischer Attribute dann die notwendigen CSS und JS Dateien im Hintergrund zusammensetzen, cachen und im finalen HTML verlinken. So würde am Ende z.B. folgendes im HEAD stehen:
<link href="http://shop.de/css/abc.css" rel="stylesheet" type="text/css" media="screen"><script src="http://shop.de/js/abc.js" type="text/javascript"></script>
Um das zu realisieren benötige ich Zugriff auf das fertig generierte HTML und zwar bevor es gecached wird. Da ich ja noch meine beiden Einträge im HEAD ergänzen muss. Meine Idee ist, das ich mich auf ein Event registriere wie z.B. Enlight_Controller_Action_PostDispatch und mir da dann das finale HTML holen, parsen und meine Änderung im HEAD eintragen kann. Nun bin ich auf der Suche nach dem richtigen Event. In Enlight_Controller_Action_PostDispatch scheint das HTML noch nicht zusammengebaut zu sein. Auch bin ich mir noch nicht so recht sicher wie ich das finale HTML abfragen kann. Hilft diese Erklärung weiter? Vielen Dank Robert
Ich glaube ich habe jetzt eine Lösung gefunden, bin mir aber noch nicht zu 100% sicher ob das der richtige Weg ist. Ich benutze das Event Enlight_Plugins_ViewRenderer_PostRender. Mein Code schaut dann wie folgt aus: public function onEnlightPluginsViewRendererPostRender(Enlight\_Event\_EventArgs $arguments) { /\*\* \* @var $enlightPlugin Enlight\_Controller\_Plugins\_ViewRenderer\_Bootstrap \*/ $enlightPlugin = $arguments-\>getSubject(); /\*\* \* @var $template Enlight\_Template\_Default \*/ //$template = $arguments-\>getTemplate(); $response = $enlightPlugin-\>Front()-\>Response(); $request = $enlightPlugin-\>Front()-\>Request(); $view = $enlightPlugin-\>Action()-\>View(); if (!$request-\>isDispatched() || $response-\>isException() || $request-\>getModuleName() != 'frontend' || !$view-\>hasTemplate()) { return; } if ($response-\>getBody()) { // finales HTML auslesen $response-\>getBody() } }