redirect() aus einem plugin bootstrap

Hallo, wie kann ich aus einer bootstrap einer plugins geschickt auf die redirect() Methode zugreifen? Ich greife so auf das event zu: $this-\>subscribeEvent( "Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_ProductInfoPhp", "onGetFrontendControllerProductInfoPhp" ); und muss dann über Umwege die redirect() Methode aus dem Controller nachbauen: public function onGetFrontendControllerProductInfoPhp(Enlight\_Event\_EventArgs $arguments) { $controller = $arguments-\>getSubject(); $request = $arguments-\>getRequest(); $url = array( 'sViewport' =\> "detail", 'sArticle' =\> "170" ); // hier wird die redirect() Methode aus Enlight\_Controller\_Action kopiert if (is\_array($url)) { $url = $controller-\>Front()-\>Router()-\>assemble($url); } if (!preg\_match('#^(https?|ftp)://#', $url)) { if (strpos($url, '/') !== 0) { $url = $request()-\>getBaseUrl() . '/' . $url; } $uri = $request()-\>getScheme() . '://' . $request()-\>getHttpHost(); $url = $uri . $url; } $controller-\>Response()-\>setRedirect($url, 301); } In $arguments->getSubject() existiert die Methode forward() nicht… Wie kann ich also „korrekt“ auf die redirect() Methode der Enlight_Controller_Action Klasse zugreifen? Gruß & vielen Dank

Auf die forward() Methode kannst du nur zugreifen, wenn du eine Controller Instanz hast, also wenn du etwa ein Controller Event hast - etwa Enlight_Controller_Action_PreDispatch_Frontend_Checkout, dann kannst du über das Subject auch auf die forward() Methode zugreifen. Ich verstehe den Subscribe von dir nicht so ganz, was soll Enlight_Controller_Dispatcher_ControllerPath_Frontend_ProductInfoPhp sein?

[quote=„shredding“]Auf die forward() Methode kannst du nur zugreifen, wenn du eine Controller Instanz hast[/quote] Genau das ist mein Problem :confused: Weißt du einen besseren Umweg, als den den ich gegangen bin?! [quote=„shredding“]Ich verstehe den Subscribe von dir nicht so ganz, was soll Enlight_Controller_Dispatcher_ControllerPath_Frontend_ProductInfoPhp sein?[/quote] Dieses event wird ausgelöst, wenn Shopware versucht auf den ProductInfoPhp controller zu routen. Ich versuche gerade alte xt:commerce Links abzufangen, die etwa so aussehen: http://www.domain.de/product_info.php/i … tikel.html Durch die schönen neuen developer tools habe ich gesehen, dass ich mich an das Event „Enlight_Controller_Dispatcher_ControllerPath_Frontend_ProductInfoPhp“ hängen kann, was eben genau dann ausgelöst wird, wenn ein alter xtc Link aufgerufen wurde. Oder gibt es auch andere Events, an die ich mich hängen kann? Gruß & vielen Dank

Ich hab leider keine Ahnung wovon du redest. Was sind die schönen neuen Developer Tools? Das Event von dir gibt’s im Core nicht. Ich vermute es ist Teil des Migrationsplugins?

[quote=“shredding”]Ich hab leider keine Ahnung wovon du redest. Was sind die schönen neuen Developer Tools? Das Event von dir gibt’s im Core nicht. Ich vermute es ist Teil des Migrationsplugins?[/quote] Dieses Event wird dann “gefeuert”, wenn im Frontend der Controller ProductInfoPhp aufgeruden wird. Anders gesagt: wenn der Shop so aufgerufen wird, wird der o.g. Controller aufgerufen: http://meinshop.de/ProductInfoPhp (evtl auch /product_info.php). Zum Thema selbst: evtl. könnte man beim Aufruf des Controllers einen Flag setzen und in einem später aufgerufenen Event den Flag analysieren und den Kunden weiterleiten?

Müsste das dann nicht Enlight_Controller_Action_PreDispatch_Frontend_ProductInfoPhp sein? Und wenn dem so wäre, könnte man ja auch die redirect() Methode aus dem Subject aufrufen …

Nein, (eigene) Controller werden auf diese Weise eingebunden: Enlight_Controller_Dispatcher_ControllerPath_Frontend_<controller_name> (oder Backend, wenn das ein Backend Controller ist).</controller_name>

[quote=„shredding“]Was sind die schönen neuen Developer Tools?[/quote] Siehe http://store.shopware.de/administration … bar?c=2153 Vielleicht eine etwas irritierende Bezeichnung von mir. [quote=„waldicom“]Dieses Event wird dann „gefeuert“, wenn im Frontend der Controller ProductInfoPhp aufgeruden wird[/quote] Korrekt - und da befinde ich mich nicht innerhalb eines controllers, um redirect() aufzurufen. Hast du vlt noch Ideen waldicom? Mein aktueller Ansatz: ich klinke mich in das Event Enlight_Controller_Action_Init_Frontend_Index ein und prüfe den controller aus dem request. Dieses event wird ausgelöst, nachdem kein ProductInfoPhp controller gefunden wurde und direkt auf die Startseite weitergeleitet wird: public function onInitFrontendIndexEvent(Enlight\_Event\_EventArgs $arguments) { $controller = $arguments-\>getSubject(); $request = $arguments-\>getRequest(); $params = $request-\>getParams(); switch ( $params['controller'] ) { // product details case "product\_info.php": // product\_info.php/info/p1234\_Artikelname.html $this-\>redirectProductInfo( $controller, $params ); break; // ... } } Das ist mir nur ein wenig zu unsauber, da dieses Event bei jedem Aufruf der Startseite gefeuert wird :confused: Gruß

Also bei einem onPostDispatch Event habe ich wie folgt die “Redirect Methode” verwendet: public function onPostDispatch(Enlight\_Event\_EventArgs $args) { $request = $args-\>getSubject()-\>Request(); $response = $args-\>getSubject()-\>Response(); $view = $args-\>getSubject()-\>View(); if (!$request-\>isDispatched() || $response-\>isException() || $request-\>getModuleName() != 'frontend' || !$view-\>hasTemplate() ) { return; } $ControllerName = $request-\>getControllerName(); if ($ControllerName == 'index') { $articleId = 1; $request-\>setParams(array('sArticle' =\> $articleId)); $request-\>setControllerName('detail'); $request-\>setActionName('index')-\>setDispatched(false); } } Eventuell hilft dir das weiter?