Herstellerslider mittels Controller selbst schreiben und in Template auslesen - aber wie?

Hallo,

ich möchte einen eigenen Herstellerslider schreiben. Diesen brauche ich außerhalb der Einkaufswelten. Ich dachte mir, ich übernehme einfach den Code der Einkaufswelt-Komponente. Blöderweise sind dort die Hersteller schon geladen. Ich bräuchte also wohl einen eigenen Controller, der mir für eine übergebene Kategorie-ID alle Hersteller lädt und an die Frontend-Komponente zurückgibt. Ich möchte den Slider auf verschiedenen Seiten platzieren mit jeweils anderer Kategorie. Deshalb muss es möglich sein, eine Kategorie-ID zu übergeben.

Geht sowas?

Das ist der Originalcode:

{foreach $Data.values as $supplier}
    ...
{/foreach}

statt $Data.values müssten meine Daten also on-the-fly aus meinem Controller kommen… geht sowas? Wenn ja, wie kann ich die Daten im Template vom Controller laden?

Hab das mit dem Aufruf und Datenladen zumindest hingekriegt und die Daten werden auch geladen.

{block name="frontend_index_manufacturer_slider_test"}
    {action controller=loadmanufacturer action=manufacturer categoryId="7"}
    {foreach from=$Manufacturers item=manufacturer}
        {$manufacturer.name}
    {/foreach}
{/block}

 mit diesem Code rufe ich den Controller auf. Dort lade ich die Daten und setze sie mit $this-\>View()-\>assign ins Template. 

Wenn ich in meinem Block ein {debug} mache, sehe ich auch die beiden geladenen Hersteller für Kategorie 7.

Doch die foreach macht einfach gar nichts… wie kann ich die Daten denn jetzt noch durchschleifen?

ein print_r gibt leider nur „1“ aus …

 

liegt es evtl daran, dass die Scope falsch gesetzt ist?

Smarty_Variable Object (3)
->value = Array (2)
  0 => Shopware\Models\Article\Supplier Object (0)
  1 => Shopware\Models\Article\Supplier Object (0)
->nocache = null
->scope = "Smarty root"

wie krieg ich die Scope denn geändert?

 

habe schon versucht, das zu setzen aber es bringt nichts…

$this->View()->assign('Manufacturers', $manufacturers, null, Enlight_Template_Manager::SCOPE_PARENT);

 

Ich verstehe nicht, was der Code soll?!?
Action ist ein Smarty-Tag. Was dort ausgeführt wird, wird nicht im Template zur Verfügung stehen, sondern nachträglich in die gerenderte „Seite“ eingefügt.
Die Seite wird normal gerendert, und der Code vom Action bleibt zunächst so erhalten. Wenn nun die Seite ausgeliefert wird, wird der Action-Teil nachgeladen - also ein erneuter Controller-Aufruf, und in die bereits gerenderte Seite eingefügt. Ist so eine art „Platzhalter“.
Was im Action ausgeführt wird, liefert keine zusätzlichen Daten im Theme.

action: Erstes Argument der Controller. Zweites Argument die „action“ selber und ditter Parameter halt die ID. Aber der Aufruf liefert Dir keine Variable ins Template zurück.
Und wieder der Verweis auf die Devdocs - zum letzen Mal: On action tags

Kurz und knapp: action ist kein include!

@sonic‍

dass ein action kein include ist, ist mir klar. Aber ich habe keine andere Möglichkeit gefunden, meinen eigenen Controller zu „triggern“. Ein Anhängen an ein Event geht ja nicht, da ich pro Controlleraufruf eine Kategorie-ID mitgeben möchte. Wenn ich im Controller einen var_dump mache, erscheint ja auch der Wert im Theme in dem Block wo er hinsoll… Wenn bei einem Action nicht im Template zur Verfügung steht, was dort ausgeführt wird, verstehe ich nicht, warum ein {debug} die Rückgabe des Actions als Smartyvariable ausgibt…

Das Einzige, was mir jetzt einfällt ist, den ganzen HTML-Code schon im Controller zu erzeugen und mit echo auszugeben…

Ich weiß Dev Docs … aber ich finde nun mal nicht was ich suche… weder in den Dev Docs noch bei Google…

Wie bekomm ich die Daten denn dann von meinem Controller ins Theme?

War vielleicht etwas voreilig von mir  Wink
„loadmanufacturer“ ist wohl Dein Controller.
Der „Controller“ sollte im action-tag keine Variablen liefern, sondern tatsächlich a) den einzubindenen HTML-Code oder b) einen Datensatz für ggf. Javascript liefern.
Für Dich wäre es tatsächlich a) - Dein Controller liefert an der Stelle den fertigen Slider aus [HTML-Code-Fragment]… Das wäre übrigens das, was z.B. im Theme unter Widgets liegt.
Wie es jetzt genau geht, würde ich mir auf Git einfach mal zu den einzelnen EKW-Komponenten abgucken.
Du müsstest in Deinem Controller also Dein widget/slider.tpl laden, an dem die Vars übergeben, es rendern und ausgeben (also ohne Header, Seitenlayout etc…)

Oder Du hängst Dich in den „Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing(_Index)“ , und hängst dort alle Daten für den Slider rein und baust die Slider-Daten dann über die eigene z.B. listing/index.tpl ein. Ggf. kannst Du die Variablen gleich so benennen, dass Du in der tpl gleich per include den Orig-Slider einbinden kannst. Bei der Variante käme dann aber auch der fertige Slider aus dem HTTP-Cache, wenn er an ist. Wenn sich also da was ändert, müsste ggf. auch ab und an mal der Cache geleert werden.  Wink
Ich kann mir nicht vorstellen, dass Du über action Variablen ans Theme übergeben kannst.

Das Problem mit Deinem action könte auch werden, dass ja immer dir gleiche Kat-ID aus dem ESI-Tag kommen kann :slight_smile:

Wenn es etwas rüde rüberkommt oder ich nicht gleich eine Lösung habe: Bin eigentlich urlaubsreif, muss aber noch zwei Wochen überstehen *lol*

Danke für die Antwort @sonic‍! Dann weiß ich jetzt wenigstens, dass ich nicht ganz blöd war keine andere Lösung zu finden.

Du müsstest in Deinem Controller also Dein widget/slider.tpl laden, an dem die Vars übergeben, es rendern und ausgeben (also ohne Header, Seitenlayout etc…)

wie das geht, muss ich mal schauen… wusste gar nicht, dass man ein TPL einfach in nem Controller laden kann. Aber das wär ja gut!

Das heißt aber, mein {action}-Tag was ich verwenden wollte, war schon korrekt oder?

Das Problem mit Deinem action könte auch werden, dass ja immer dir gleiche Kat-ID aus dem ESI-Tag kommen kann 

was ist damit denn gemeint?

 

Jeder Controller lädt ja irgendwo sein Template, sonst könnte er ja nichts ausgeben.
An der Stelle muss ich aber tatsächlich passen, einen eigenen Controller habe ich noch nicht benötigt.
Ich stöbere einfach immer mal bei Git durch den Code, wenn ich etwas verstehen möchte.  Wink

Edit: Wenn Cache, dann steht ja “action blablabla” im Cache, da geht es dann nicht mehr, wenn für ID eine Variable benutzt wird. Denn die erste Var landet im Cache, weil sie ja von Smarty ersetzt wird.

Für das was Du möchtest ist action ja gedacht. Du musst halt an der Stelle den ganzen HTML-Code liefern, der dort erscheinen soll. Korrekt  Thumb-Up

So - Wochenende

Guck Dir z.B. den Warenkorb im Header an. Der Header ist statisch, aber der Warenkorb (Count) wird nachgeladen… über action.

1 Like