# Lagerbestand ESI Action-Tag

**URL:** <https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246>\
**Category:** Programmierung\
**Created:** [3. November 2017 um 13:34 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246 "2017-11-03T13:34:07Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [3. November 2017 um 13:34 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/1 "2017-11-03T13:34:07Z")

</div>

Hallo,&nbsp;

ich würde gerne den Lagerbestand {$sArticle.instock} in einer Badge im Shop anzeigen. Leider wird der Lagerbestand im Theme gecached, sodass mir der Hinweis gegeben wurde, über die ESI-Tags den Cache für diesen Bereich auszuschalten.

Wie kann ich also in einem Theme oder Plugin den Lagerbestand mit Hilfe der ESI-Tags aus dem Cache holen? Die Werte werden ja von Shopware bereitgestellt. Jemand eine Idee?&nbsp;

&nbsp;

---

<div class="post-metadata">

**Author:** ![sschreier](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sschreier/32/23296_2.png) [@sschreier](https://forum.shopware.com/u/sschreier)\
**Post date:** [3. November 2017 um 17:29 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/2 "2017-11-03T17:29:57Z")

</div>

Hallo,

im Prinzip musst du dir nur ein eigenes Plugin erstellen, dort einen Widget-Controller implementieren und das Widget dann automatisch im Frontend ausliefern, damit du dann beispielsweise über {action module=widgets controller=GetInStock action=show articleId=$sArticle.articleID} die entsprechende Ausgabe erzeugst (du fütterst sozusagen das Widget mit der Artikel-ID und lässt dir dann den instock - Wert zurückgeben).

Andernfalls gibt es auch Plugins dafür, die hoffentlich den Cache auch berücksichtigen:

> **[Artikel Bestand anzeigen | Meldung fast ausverkauft](https://store.shopware.com/kdz2433618297986/artikel-bestand-anzeigen-meldung-fast-ausverkauft.html)**
>
> Pluginbeschreibung: Zeige Deinen Kunden eine Mitteilung an, wenn sich der Lagerbestand des Artikels dem Ende neigt um die Kaufabschlussrate…

> **[Labels & Badges | individuell | Listing & Detailseite](https://store.shopware.com/zenit31487954214/labels-badges-individuell-listing-detailseite.html)**
>
> Individuelle Artikel Labels / Badges im Listing und in der Detailseite Hebe Produkte im Artikellisting hervor, indem Du sie mit weiteren…

[http://store.shopware.com/zenit53271346922/lagerampel/lagerbestand-advanced.html](http://store.shopware.com/zenit53271346922/lagerampel/lagerbestand-advanced.html)

Beste Grüße

Sebastian

---

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [4. November 2017 um 10:47 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/3 "2017-11-04T10:47:27Z")

</div>

Hallo @sschreier‍,

vielen Dank für deine Hilfe!&nbsp;

Ich fasse mal zusammen, wie weit ich das verstanden oder auch nicht verstanden habe. Ich würde mich freuen, wenn Du mich dann nochmal in die richtige Richtung schubsen könntest. Ich versuche hierbei auch zu lernen und möchte daher kein externes&nbsp;Plugin verwenden.&nbsp;

1. Ich muss ein eigenes Plugin erstellen. Check. Und dort in der bootstrap.php (altes Plugin-System) einen Controller implementieren, quasi eine solche Action? Oder vermische hier etwas? Du schreibst, ich soll einen Widget-Controller erstellen. Woanders habe ich gelesen, dass es mit einem Action-Controller funktioniert.&nbsp;

Den Code habe ich von&nbsp;[https://forum.shopware.com/discussion/31656/action-plugin-esi-tag-include-externe-live-bestandsabfrage](https://forum.shopware.com/discussion/31656/action-plugin-esi-tag-include-externe-live-bestandsabfrage)&nbsp;

Ganz verstehe ich diesen Code nicht. Verstehe ich das richtig, dass ich nicht mehr mit $sArticle.instock arbeite, sondern mir den aktuellen Wert selbst aus der Datenbank holen muss, weil ich die “offizielle” Variable nicht vom Cache befreien kann?

&nbsp;

1. Dann könnte ich innerhalb meines Plugins eine Datei in widgets/getinstock/instock.tpl erzeugen. Ist das notwendig? Also ruft die {action} eine tpl-Datei auf, welche nicht gecached wird und sich dort die Variable für den Bestand geholt wird oder greift diese eigentlich direkt auf die action zu und der Wert könnte in einer Variable gespeichert werden - also ohne, dass es wirklich diese tpl-Datei gibt?:

&nbsp;

1. Nun binde ich in die frontend/listing/product-box/product-badges.tpl diesen ESI-Action-Tag ein.

&nbsp;

Vielen Dank für deine Hilfe!

---

<div class="post-metadata">

**Author:** ![EikeBrandtWarneke](https://avatars.discourse-cdn.com/v4/letter/e/cdc98d/32.png) [@EikeBrandtWarneke](https://forum.shopware.com/u/EikeBrandtWarneke)\
**Post date:** [4. November 2017 um 11:14 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/4 "2017-11-04T11:14:58Z")

</div>

Du solltest evtl. noch mal dein Konzept überdenken. Mit deiner Lösung feuerst du in jedem Listing für jeden Artikel einen weiteren request ab. Ich will nicht wissen, wie lahm der Shop hinterher sein wird…

Viele Grüße

---

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [4. November 2017 um 12:56 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/5 "2017-11-04T12:56:37Z")

</div>

[@Aquatuning GmbH]([http://forum.shopware.com/profile/11752/Aquatuning](http://forum.shopware.com/profile/11752/Aquatuning) GmbH “Aquatuning GmbH”)‍

hmmm… hast du eine Idee für eine bessere Umsetzung?

---

<div class="post-metadata">

**Author:** ![simkli](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/simkli/32/13124_2.png) [@simkli](https://forum.shopware.com/u/simkli)\
**Post date:** [4. November 2017 um 13:13 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/6 "2017-11-04T13:13:04Z")

</div>

Also ESI Tags (action)&nbsp;sind dafür definitiv ungeeignet. Möglichkeiten wäre:

- (sehr einfach)&nbsp;Brauchst du den HTTP-Cache wirklich? Ggf. deaktivieren, dann kannst du die Daten auch direkt im Listing ausgeben. Die Seite sollte trotzdem schnell sein außer du hast sehr viel Besucheraufkommen gleichzeitig.
- (mittel) Auf den Client auslagern. Z.B. ein data-Attribute mit Artikelnummer ausgeben und die Daten gesammelt für alle angzeigten Artikel via Ajax laden und am besten beim Client über den sessionStorage cachen.&nbsp;
- (schwieriger) ein eigenes Cache-Tag für den Lagerbestand. =\> Cache invalidieren, falls sich der Bestand ändert

Viele Grüße

---

<div class="post-metadata">

**Author:** ![sschreier](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sschreier/32/23296_2.png) [@sschreier](https://forum.shopware.com/u/sschreier)\
**Post date:** [4. November 2017 um 13:57 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/7 "2017-11-04T13:57:48Z")

</div>

Hallo,

nein mit einem Controller meine ich auch einen Controller (keine Action, sondern ähnlich wie hier: [https://forum.shopware.com/discussion/comment/182029/#Comment\_182029](https://forum.shopware.com/discussion/comment/182029/#Comment_182029) ), nicht das subscriben auf ein Event oder die Erweiterung der View. Bei der View-Variante würde ich auch sagen, dass das die Performance betreffen wird.

Ebenso würde ich auch kein Plugin mehr über die alte Pluginstruktur erstellen, da diese irgendwann eh nicht mehr funktionieren wird.

Ja genau, du verwendest nicht die gecachte Variable, sondern holst dir den Wert mit dem Controller selbst aus der Datenbank.

Und es ist ein normales action - Tag, kein ESI-Action-Tag.

Beste Grüße

Sebastian

---

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [4. November 2017 um 14:51 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/8 "2017-11-04T14:51:42Z")

</div>

Hm, okay.&nbsp;

In meinem Plugin hole ich mir bereits über das Search Bundle und dem LegacyStructConverter eine andere Variable aus der Datenbank und füge sie zu sArticles hinzu. Die liegen allerdings auch im Cache. Ich kann über den LegacyStructConverter mir auch nochmal den Lagerbestand holen und erneut in sArticles.irgendwas speichern.&nbsp;

Das Problem: das wird auch gecached. Kann ich das vll. aus dem Cache holen und so auf Vorhandenem aufbauen?

---

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [6. November 2017 um 19:07 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/9 "2017-11-06T19:07:01Z")

</div>

Hi @sschreier‍&nbsp;

Ich habe nun einen eigenen Controller erstellt:

```
public function getLiveStockAction()
	{
		$this->Front()->Plugins()->ViewRenderer()->setNoRender(true);

		$articleId = $this->Request()->getParam('articleId');

		echo $articleId;

	}

```

&nbsp;Welchen ich in den Bagdes aufrufe:&nbsp;

```
{extends file="parent:frontend/listing/product-box/product-badges.tpl"}

{block name='frontend_listing_box_article_hint'}

    {action module=widgets controller=Livestock action=getLiveStock articleId=$articleId}

{/block}

```

Zur Testweisen Funktionsprüfung habe ich auch mal eine Ausgabe mittels der widgets/livestock/get\_live\_stock.tpl-Datei erzeugt. Das hat auch funktioniert. Leider bekomme ich keine Ausgabe der Artikelnummer aus der&nbsp;getLiveStockAction().

&nbsp;

1. Der nächste Schritt wäre nun anhand der Artikelnummer den Lagerbestand zu ermitteln? Das würde ich in der&nbsp;getLiveStockAction() machen?!
2. Wie komme ich hier an den Lagerbestand?
3. Und wie performant wäre das?&nbsp;
4. Wie bereits oben angesprochen, nutze ich im Plugin das SearchBundle mit dem LegacyStructConverter. Kann man das hier irgendwie wieder anwenden?

&nbsp;

---

<div class="post-metadata">

**Author:** ![sschreier](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sschreier/32/23296_2.png) [@sschreier](https://forum.shopware.com/u/sschreier)\
**Post date:** [6. November 2017 um 19:53 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/10 "2017-11-06T19:53:32Z")

</div>

Hallo,

wie ich es schon gesagt und Aquatuning gemeint hatte, ein Widget - Controller ist das nicht wirklich, was du da machst, sondern du manipulierst ja nur die View und feuerst einen weiteren Request bei jedem Artikelaufruf auf, das auf die Performance geht (ich hab ja oben einen Link zu einem Beispiel gepostet).

Und bist du dir überhaupt sicher, was: $this-\>Front()-\>Plugins()-\>ViewRenderer()-\>setNoRender(true); macht oder hast du das nur irgendwo her rein kopiert?

Ich glaub das kannst du nicht wirklich verbinden.

Beste Grüße

Sebastian

---

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [7. November 2017 um 08:53 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/11 "2017-11-07T08:53:17Z")

</div>

Hallo @sschreier‍,

ich habe einen Controller nach&nbsp;[https://forum.shopware.com/discussion/comment/182029/#Comment\_182029](https://forum.shopware.com/discussion/comment/182029/#Comment_182029) und der Shopware Doku unter:&nbsp;[Shopware controller](https://developers.shopware.com/developers-guide/controller/#plugin-controllers) erstellt.&nbsp;

Dabei habe ich diesen Controller mit&nbsp;class Shopware\_Controllers\_Widgets\_Livestock&nbsp;extends Enlight\_Controller\_Action in der Livestock.php erstellt und ein wenig damit herumgespielt. Habe mir in views/widgets/livestock/get\_live\_stock.tpl mal eine Ausgabe gemacht und über den Action-Tag eingefügt. Das hat funktioniert.&nbsp;

Dann habe ich&nbsp;$this-\>Front()-\>Plugins()-\>ViewRenderer()-\>setNoRender(true); hinkopiert. Ich gehe davon aus, dass dies dafür zuständig ist, dass der controller nicht gerendert und aufgerufen wird?!

Ich dachte, das wäre der Weg, den ich laut deinem Link gehen sollte?

---

<div class="post-metadata">

**Author:** ![mdsw](https://avatars.discourse-cdn.com/v4/letter/m/94ad74/32.png) [@mdsw](https://forum.shopware.com/u/mdsw)\
**Post date:** [8. November 2017 um 14:54 UTC](https://forum.shopware.com/t/lagerbestand-esi-action-tag/49246/12 "2017-11-08T14:54:39Z")

</div>

Hab ich es falsch verstanden?
