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

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 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) { … })(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.

Hallo,

 

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.

 

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

 

 

MFG

 

derwunner

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

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.

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…

Und das funktioniert als Trick leider auch nicht:
 

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

 

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 separate Aufrufe von destroyPlugin auch nicht geholfen. removePlugin hat jedoch erfolgreich die Plug-ins deaktiviert. Damit klappt auch durchgehend die Verkettung der Aufrufe, weil die Objekte offenbar erhalten bleiben.