… ich beschreibe das Problem nochmal genauer, weil mir da bestimmt jemand einen Tipp geben kann:
Ich erstelle mittels bin/console theme:create
ein neues Theme. In der Datei theme.json entsteht dabei auch der Eintrag
"script": [
"@Storefront",
"app/storefront/dist/storefront/js/my-theme.js"
],
Neuerdings übrigens mit einer falschen Pfadangabe, was dazu führt, dass das frisch erstellte „Standard-Theme“ keinem Verkaufskanal zugeordnet werden kann. Nach einer Korrektur klappt es dann aber.
Danach läuft es eigentlich so, wie unter Add SCSS Styling and JavaScript to a Theme | Shopware Documentation beschrieben:
Wenn man in der Datei /MyTheme/src/Resources/app/storefront/src/js/main.js
den JavaScript Code einträgt, speichert und danach auf der Konsole bin/build-storefront.sh
ausführt, wird der JS-Code minimiert und unter /MyTheme/src/resources/app/storefront/dist/storefront/js/my-theme.js
abgelegt.
Im Beispiel wird der Befehl console.log('SwagBasicExampleTheme JS loaded‘);
eingetragen. Dieser Befehl landet auch korrekt in der minimierten Form in /MyTheme/src/resources/app/storefront/dist/storefront/js/my-theme.js
Wenn das neue Theme zugewiesen ist und die Storefront aufgerufen wird, sehe ich in der Browser-Konsole auch die Log-Ausgabe. Bis dahin klappt also eigentlich alles, wie beschrieben.
Wenn ich jetzt aber JS-Funktionen erstelle, beispielsweise function showAlert(){alert("test");}
die ich später im Twig-Template aufrufen möchte, gibt es die Probleme. Beim späteren Aufruf im Template, über onClick="showAlert();"
kommt die Fehlermeldung "Uncaught ReferenceError: showAlert is not defined at HTMLImageElement.onclick
“.
Der minimierte JS-Code der Funktion ist auch nicht in /MyTheme/src/resources/app/storefront/dist/storefront/js/my-theme.js
enthalten.
Wenn ich nun statt console.log('SwagBasicExampleTheme JS loaded‘);
mal die Funktion aufrufe, also showAlert();
dann wird die Funktion bei jeder Seite in der Storefront ausgeführt. Der Aufruf im Template über onClick='…'
scheitert aber weiterhin.
In der Datei /MyTheme/src/resources/app/storefront/dist/storefront/js/my-theme.js
ist jetzt der folgende Code zu finden: (self.webpackChunk=self.webpackChunk||[]).push([["my-theme"],{5350:()=>{alert("Das ist ein Test")}},e=>{var s;s=5350,e(e.s=s)}]);
Im Endeffekt sieht es so aus, als wenn in /MyTheme/src/resources/app/storefront/dist/storefront/js/my-theme.js
immer nur der JS-Code steht, der direkt aufgerufen wird. Der Code von Funktionen fehlt dort.
Wenn ich jetzt den Code der Funktion nachträglich in /MyTheme/src/resources/app/storefront/dist/storefront/js/my-theme.js
eintrage, klappt es wieder. Aber dass kann es ja nicht sein. Ich würde also sagen, der grundsätzlich beschriebene Ablauf funktioniert, aber es wird eben nicht der komplette JS-Code minimiert und übertragen.
Wie bekomme ich es hin, das auch der JS-Code meiner Funktionen berücksichtigt wird?
Viele Grüße