# StateManager undefined - wie spreche ich ihn erst an, wenn er initialisiert ist?

**URL:** <https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019>\
**Category:** Programmierung\
**Created:** [9. Februar 2018 um 09:12 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019 "2018-02-09T09:12:46Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Hancoque2](https://avatars.discourse-cdn.com/v4/letter/h/ce7236/32.png) [@Hancoque2](https://forum.shopware.com/u/Hancoque2)\
**Post date:** [9. Februar 2018 um 09:12 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/1 "2018-02-09T09:12:46Z")

</div>

Hallo!

Ich möchte gern aus einem eigenen Theme auf den StateManager zugreifen, um auf die Methoden addPlugin, removePlugin und destroyPlugin zuzugreifen, um darüber Standard-Shopware-JS-Plugins aus dem Responsive-Theme zu deaktivieren bzw. mit anderen Parametern zu laden. Dazu habe ich in der Theme.php unter&nbsp;javascript das von mir angelegte Script angegeben. Die Datei wird auch geladen, was ich an der Fehlermeldung in der Browser-Konsole sehe, dass window.StateManager (oder auch nur StateManager) undefined ist und die genannten Methoden nicht aufgerufen werden können. Das Problem wird sein, dass die Methodenaufrufe vor der eigentlichen Initialisierung des StateManagers stattfinden und so natürlich fehlschlagen. Wie kann ich nun sicherstellen, dass die Aufrufe erst nach der Initialisierung geschehen? Ich habe verschiedene Wrapper ausprobiert wie "(function () { … });" oder “;(function ($, window) { …&nbsp;})(jQuery, window);”, aber nichts hilft. “document.asyncReady(function() { … });” geht nicht, weil es sich noch um Shopware 5.2 handelt. Sämtliche Beispiele, die ich gefunden habe und die angeblich funktionieren, funktionieren bei mir nicht. window.StateManager oder StateManager sind immer undefined.

Wie müsste eine komplette JS-Datei aussehen, damit es funktioniert, auf den StateManager nach dessen Initialisierung zuzugreifen? Vielen Dank für jegliche Hinweise!

PS: Wenn es auch eine Möglichkeit gäbe, die Liste der Viewports über ein data-Attribut zu verändern, dann wäre das vielleicht auch eine Option, aber dazu habe ich leider nichts finden können.

---

<div class="post-metadata">

**Author:** ![derwunner](https://avatars.discourse-cdn.com/v4/letter/d/e5b9ba/32.png) [@derwunner](https://forum.shopware.com/u/derwunner)\
**Post date:** [9. Februar 2018 um 10:35 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/2 "2018-02-09T10:35:19Z")

</div>

Hallo,

&nbsp;

also eigentlich musst du nur dafür sorgen, dass deine JavaScript Datei nach dem StateManager in der Theme.php steht. Hier ist die Reihenfolge entscheidend. Entsprechend der Reihenfolge landet das auch in der komprimierten JavaScript Datei, wo alles drin ist.

&nbsp;

Du kannst übrigends auch Plugin Methoden direkt überschreiben, du musst nicht über den StateManager gehen, um das zu erreichen.

&nbsp;

&nbsp;

MFG

&nbsp;

derwunner

---

<div class="post-metadata">

**Author:** ![Hancoque2](https://avatars.discourse-cdn.com/v4/letter/h/ce7236/32.png) [@Hancoque2](https://forum.shopware.com/u/Hancoque2)\
**Post date:** [9. Februar 2018 um 10:38 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/3 "2018-02-09T10:38:02Z")

</div>

Aber ich erwähne doch in meinem eigenen Theme nur die von mir zusätzlich hinzugefügten Dateien, oder nicht?

---

<div class="post-metadata">

**Author:** ![derwunner](https://avatars.discourse-cdn.com/v4/letter/d/e5b9ba/32.png) [@derwunner](https://forum.shopware.com/u/derwunner)\
**Post date:** [9. Februar 2018 um 12:38 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/4 "2018-02-09T12:38:40Z")

</div>

Wenn Du dich vom Responsive Theme vererbst, ja. Schau mal was in der web/config\_1.json drin steht. Da muss deine JS Datei nach dem StateManager kommen, dann passts. Die jeweilige Zahl nach config\_ steht für die Shop ID.

---

<div class="post-metadata">

**Author:** ![Hancoque2](https://avatars.discourse-cdn.com/v4/letter/h/ce7236/32.png) [@Hancoque2](https://forum.shopware.com/u/Hancoque2)\
**Post date:** [9. Februar 2018 um 12:43 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/5 "2018-02-09T12:43:17Z")

</div>

So eine Datei existiert hier nicht. Kann es daran liegen, dass es sich noch um Shopware 5.2 handelt? Ansonsten: Wenn ich nur meine eigene JS-Datei angebe, dann kann ich doch auch keine Reihenfolge angeben…

---

<div class="post-metadata">

**Author:** ![Hancoque2](https://avatars.discourse-cdn.com/v4/letter/h/ce7236/32.png) [@Hancoque2](https://forum.shopware.com/u/Hancoque2)\
**Post date:** [9. Februar 2018 um 12:45 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/6 "2018-02-09T12:45:52Z")

</div>

Und das funktioniert als Trick leider auch nicht:  
&nbsp;

```
protected $javascript = [
	'../../../Responsive/frontend/_public/src/js/jquery.shopware-responsive.js',
	'src/js/jquery.override.js'
];

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Hancoque2](https://avatars.discourse-cdn.com/v4/letter/h/ce7236/32.png) [@Hancoque2](https://forum.shopware.com/u/Hancoque2)\
**Post date:** [13. Februar 2018 um 09:46 UTC](https://forum.shopware.com/t/statemanager-undefined-wie-spreche-ich-ihn-erst-an-wenn-er-initialisiert-ist/51019/7 "2018-02-13T09:46:08Z")

</div>

Hab des Rätsels Lösung gefunden. Der StateManager ist doch erreichbar, allerdings klappte folgender Code nicht:

```
window.StateManager
	.addPlugin(...)
	.destroyPlugin(...)
	.destroyPlugin(...)
;

```

Der Grund dafür ist anscheinend, dass nach dem ersten Destroy-Aufruf kein this zurückgegeben wird (weil das Objekt ja zerstört wurde - logisch), und demnach der verkettete Aufruf nicht mehr weiter geht, sondern zu einem Fehler führt.

Allerdings haben&nbsp;separate&nbsp;Aufrufe von destroyPlugin auch nicht geholfen. removePlugin hat jedoch erfolgreich die Plug-ins deaktiviert. Damit klappt auch durchgehend die Verkettung der&nbsp;Aufrufe, weil die Objekte offenbar erhalten bleiben.
