Symfony2: Ändere die gerenderte Ansicht mit einem Listener

8

Ich möchte in meinem Symfony2-Projekt verschiedene Ansichten in verschiedenen Kontexten darstellen. Ich verwende mehrere Routen für die gleichen Aktionen und möchte eine andere Seite (Ansicht) rendern, aber mit demselben Controller. Zum Beispiel habe ich:

%Vor%

Beide Routen verwenden die gleiche Aktion : ArticlesController: showAction (), sollten jedoch zwei verschiedene Vorlagen (für mobile Nutzer und Stammkunden) rendern.

%Vor%

Ich möchte keine if-Anweisung oder was auch immer in meinem Controller verwenden, also habe ich einen Listener erstellt (ähnlich einer preExecute-Funktion)

Hier ist ein Teil oder meine config.yml , die meinen Listener

definiert %Vor%

Ich habe darüber nachgedacht, so etwas in der listener preExecute-Funktion zu tun:

%Vor%

Leider kann ich keine Möglichkeit finden, $ view zu erhalten oder die Ansicht "on the fly" zu aktualisieren, kurz bevor sie gerendert wird.

Ich hoffe meine Frage ist klar genug, danke im Voraus, jede Idee ist willkommen:)

J.

    
Jonathan Hell 20.08.2012, 08:08
quelle

4 Antworten

13

Hier ist die Lösung :

Zuerst muss ich kernel.view hören, nicht kernel.controller.

Dann benutze ich den " @templating " Service (Danke Marko Jovanovic für den Hinweis)

Also hier ist meine neue config.yml:

%Vor%

Endlich ist meine listener preExecute Funktion

%Vor%

Hoffe, das hilft!

J.

    
Jonathan Hell 13.09.2012, 09:26
quelle
4

Bemerkenswert: Die akzeptierte Lösung funktioniert nicht, wenn Sie ein Response -Objekt direkt zurückgeben (zB wenn Sie $this->render() aufrufen), weil das kernel.view -Ereignis in diesem Fall nicht ausgelöst wird:

  

Wenn der Controller kein Response-Objekt zurückgibt, löst der Kernel ein anderes Ereignis aus - kernel.view .

     

- siehe HTTP-Kernel-Dokumente von Symfony

Ich konnte hier keinen Weg finden, fand aber eine andere interessante Lösung für das gleiche Problem: Du könntest einfach die Render-Engine von twig wie die ZenstruckMobileBundle erweitern oder deinen eigenen Datei-Locator schreiben die LiipThemeBundle .

[edit:] Alternativ könnten Sie auch TemplateNameParser überschreiben.

    
Iris Schaffer 24.09.2014 13:11
quelle
1

Sie können den Dienst "@templating" als Argument für controller.pre_execute_listener hinzufügen.

    
Marko Jovanović 20.08.2012 08:15
quelle
0

Es scheint, dass Ihre Geräteerkennung abgeschlossen ist, bevor Sie zu Ihrer Route kommen, also wette ich, dass Sie erwarten, dass der mobile Benutzer die mobilen Routen dank einer Erkennung vor der Anfrage nutzen wird. Dies scheint in jeder Vorlage mühsam zu sein URL-Generierung

Vielleicht ist es besser, das Gerät früher oder später zu erkennen (Danke an Categorizier oder einige nette Apache-Konfiguration ), aber nicht auf die verwendete Route für die mobile Erkennung angewiesen.

Eine Integration von Categoriz mit so zum Aufrufen von Templates ist vielleicht schön.

Dann verwenden Sie ein nettes Bundle für die Verwendung der richtigen Vorlagen / Themen oder mit einem, der einige allgemeinere Funktionen bietet

    
quelle

Tags und Links