Custom Controller im Subshop mit URL des Hauptshops aufrufen

Hallo Liebe Shopware Community.

Ich habe ein Plugin geschrieben, dass über einen Widget Controller eine tpl-Datei lädt und den Enthaltenen Wert im Frontend einblendet.

Das Funktioniert im Hauptshop auch tadellos.

 {url module=widgets controller=meinController action=index id=$sArticle.articleDetailsID} 

löst nun im Subshop aber auf zu: meinshop.de/test/widgets/controllername/index/id/5974054

anstatt zu: meinshop.de/widgets/controllername/index/id/5974054

 

Gibt es eine Möglichkeit den Aufruf so anzupassen, dass er sich auf den Hauptshop bezieht? Ich kann ja nicht für jeden Subshop den Controller duplizieren.

 

Wäre über jeden Tipp dankbar.

Gruß Oliver

 

Edit: URL korrigiert.

löst nun im Subshop aber auf zu: meinshop.de/test/widgets/controllername/index/id/5974054

anstatt zu: meinshop.de/test/widgets/controllername/index/id/5974054

In deinem Beispiel sind die Links aber identisch oder ich habe meine Brille nicht geputzt. Vielleicht könnte man im Template etwas mit replace machen? Weiß ja nicht was dann angezeigt werden soll.

Mein Fehler:

Im Mainshop ist es meinshop.de/widgets/controllername/index/id/5974054

Im Subshop dann meinshop.de/test/widgets/controllername/index/id/5974054

D.h. mein Controller müßte in pluginOrdner/Controllers/subshop/widgets liegen um gefunden zu werden

 

Wenn möglich würde ich aber gerne den Controller-Aufruf so anpassen, dass es immer zum Pfad des Hauptshops auflöst.

Die Controller sind auch über die Virtuelle Url erreichbar. Dafür muss man eigentlich nix machen.

Ich bekomm im Frontend die URL ausgegeben anstelle des Inhalts des Templates.

"/test/widgets/ControllerName/index/id/5974054"

Rufe ich die URL ohne “test” auf sehe ich den Inhalt.

Ich bekomm im Frontend die URL ausgegeben anstelle des Inhalts des Templates.

 Müsste es dann nicht heißen:

 { **action** module=widgets controller=meinController action=index id=$sArticle.articleDetailsID} 

 

Ich habe vorher mit einem action tag gearbeitet, da gab es allerdings ein Problem mit dem cache. renderEsiTag() wurde sporadisch auf null aufgerufen und hat die Pagination verhindert. Da wir auch nach Wochen keine Lösung gefunden haben (inkl. Shopware Support und anderen Agenturen), suche ich jetzt nach einem Workaround. Mein Gedanke war das action tag durch den anderen Controller zu tauschen und das Drumherum umzubauen, dass die anzeige nicht mehr dynamisch sein muss.

Ich habe mir das noch mal angeschaut, wenn ich den Link inklusive dem Anteil der virtuellen URL aufrufe wird tatsächlich der Inhalt ebenfalls angezeigt. Gibt es denn eine Möglichkeit den Inhalt direkt anzuzeigen ohne ein action Tag zu verwenden? Oder ist die Verwendung des Controllers mit dem URL tag hier grundsätzlich falsch. Gibt es eine alternative?

Heute ist es wirklich scheiße warm im Büro und ich hoffe ich verstehe dich nicht falsch.

Bei

 {url module=widgets controller=meinController action=index id=$sArticle.articleDetailsID} 

wird nur ein Link zum Controller mit Parameter nur angezeigt.

Bei

 {action module=widgets controller=meinController action=index id=$sArticle.articleDetailsID} 

wird der Controller aufgerufen und derren Inhalt an die Stelle gesetzt wo er im Template aufgerufen wurde. Siehe

https://developers.shopware.com/designers-guide/smarty-plugins/

 

 

1 Like

Ahja, dann hab ich den Controller genau falsch verwendet.

Ich berechne im Controller nen veränderten Preis. Den möchte ich dann im Listing und Detailansicht ausgeben.

So wie es ausschaut kann ich den Controller aber verwerfen. Ich hatte gehofft auf eine andere Weise auf den Controller zuzugreifen und somit das Problem zu umgehen. Mit action tag komm ich ja nicht weiter, weil das plugin sonst das Umblättern des Listings zerlegt.

 PHP Fatal error:  Uncaught Error: Call to a member function renderEsiTag() on null in /var/www/meinserver.de/var/cache/production\_201904021344/templates/frontend\_Mytheme\_de\_DE\_1/50/31/28/503128c6a8625d72bef2fb539020fac6cbaf3579.snippet.box-list.tpl.php:273

 Aus der Cache Datei: <?php echo
$_smarty_tpl->smarty-\>registered\_plugins[Smarty::PLUGIN\_FUNCTION]['action'][0][0]-\> renderEsiTag(array('module'=\>'widgets','controller'=\>'calcPrice','action'=\>'index','id'=\>$\_smarty\_tpl-\>tpl\_vars['sArticle']-\>value['articleDetailsID']),$\_smarty\_tpl);?\>

Mir fehlt grad ne Idee wie ich am geschicktesten den veränderten Preis für jeden Artikel ins Frontend bekomme. Mit dem action tag konnte ich ja jeden preis einzeln im Controller zusammensetzen und direkt anzeigen, wenn der nervige fehler nicht wäre…

Im Regelfall macht man sowas per JavaScript. Du hast einen Widget Controller der einen Json zurück lieferst und renderst dann die Information per JavaScript in das Template.

ESI Tags sind in Sachen Performance nicht die beste Wahl, weil die ganze Seite warten muss.

1 Like

Danke schonmal Euch beiden. Ich habe das ganze jetzt auf Ajax umgebaut. Beim Neuladen der Seite und auf Knopfdruck wird der Preis aktualisiert. Im letzten Schritt fehlt mir noch eine möglichkeit auf das Umblättern zu reagieren. Die Seite wird ja beim umblättern nicht neu geladen, sondern nur per Ajax neu befüllt, richtig? Hat jemand eine Idee wie ich da vorgehen könnte?

Hm, vielleicht das “umblättern” mit Ajax verhindern? Ob das aber die Lösung in deinem Falle ist kann ich nicht beurteilen.

Lässt sich das per Backend abschalten oder meinst du programmatisch?

Für einen Kunden von uns musste ein Zusatzplugin erstellt werden. Hier hatte ich auch das Problem, dass die Ajax-Blätterfunktion von Shopware so ganz und gar nicht kompartibel mit dem Plugin war. Allerdings sollte die nicht ganz abgeschalten, sondern nur bei einem bestimmten Controller. Daraufhin habe ich die „action-pagination.tpl“ manipuliert und das Attribut „data-action-link“ in den Links umgeschrieben. Damit greift die Ajax-Blätterfunktion nicht mehr und mein Ziel war erreicht. Ist zwar nicht die feine englische Art (wie man so schön sagt) aber das gewünschte funktioniert.

1 Like

Danke für den Tipp, hab jetzt die action-pagination extended und die betreffenden blöcke überschrieben.

Klappt wunderbar!