Gleiches JavaScript/jQuery in mehreren Plugins einbinden

Liebes Forum :slight_smile: :slight_smile:

ich habe zwei Plugins, die das gleiche JavaScript bzw. jQuery benötigen (jquery-ui-…js). Wie kann ich das einbinden, dass zum einen die Plugins „autark“ sind, also in jedem Plugin einzeln eingebunden werden, sie aber nicht doppelt eingebunden werden. Das gleiche gilt auch für eigene JavaScript-Programme, die man in mehreren Plugins benötigt.

Wie macht man das sauber ?

Liebe Grüße

Kerstin

… würde mich auch interessieren.

Ich habe das mal so gemacht, dass ich das JS im theme eingebunden habe. Ist aber nicht optimal.

Hallo, habt ihr schonmal nach requireJS ausschau gehalten? http://requirejs.org/

naja, eigentlich nicht. Ich dachte auch mehr an eine shopware-Lösung. Soll ja möglichst ein autarkes Plugin weden…

Hallo,

 

also ich denke die einfache Lösung wäre es, die JavaScript Dateien in einem eigenen Theme einzubinden. Also am besten die Business Logik von jQuery extrahieren und dann in der Plugin View nur noch die jQuery Aufrufe machen und an die jeweiligen JavaScript Klassen weitergeben.

Oder wenn es nicht unbedingt jQuery sein muss, dann ist eigentlich Angular 1 oder 2 genau für dieses Vorhaben gemacht. Denn dort kann man Module per Dependency Injection einbinden, also eine gemeinsame geteilte Code Basis, wenn man so will. Im Angular 2 Slang wären das dann also Services oder Provider, die man in die Direktiven injected.

 

 

MFG

 

derwunner

danke.

also ich denke die einfache Lösung wäre es, die JavaScript Dateien in einem eigenen Theme einzubinden.

dann ist das Plugin nur leider nicht mehr „autark“. Und es soll kein Angular sein, sondern jQuery.

Es muss doch eine Lösung dafür geben. Wie machen das denn andere ?

Warum prüfst du nicht, ob das jeweils andere Plugin installiert ist, bevor du die Dateien zum Compiler hinzufügst?

 

Also sowas:

if.... { 
$this->subscribeEvent(
Theme_Compiler_Collect_Plugin_Javascript',
'addJavascriptFiles'
);
}

Dann kannst du das ja direkt beim Install prüfen. Wenn das Plugin dann schon da ist, dann registriert er das Event ja erst garnicht im Plugin. Bin selbst kein Programmierer, aber so würde ich das probieren.

Danke, das ist eine Möglichkeit, zumindest solange es sich um eigene Plugins handelt. Wie könnte die if-Bedingung denn aussehen ?

Und wenn das andere Plugin dann deinstalliert wird ? Was dann ?

Würde dich folgende if Abfrage weiterbringen, jQuery Version abfragen: 

jQuery.fn.jquery

@Kerstin83 schrieb:

Danke, das ist eine Möglichkeit, zumindest solange es sich um eigene Plugins handelt. Wie könnte die if-Bedingung denn aussehen ?

Und wenn das andere Plugin dann deinstalliert wird ? Was dann ?

Ist sicherlich nicht die beste Lösung. Du könntest ja über die Datenbank abfragen ob das Plugin installiert ist:

$sql = "SELECT installation_date FROM s_core_plugins WHERE name LIKE '%swag%'";
$result = Shopware()->Db()->fetchAll($sql);

Danach kannst du mit dem $result ja weiterarbeiten und deine If-Bedingung aufbauen. Bei Deinstallation müsste man dann drauf hinweisen, dass das jeweils andere Plugin über „reinstall“ nochmal initialisiert werden muss.

Ich glaube das geht bestimmt noch eleganter - war jetzt nur meine spontane Idee. 

ok, mit Datenbankabfrage… Danke. Das Problem mit der Deinstallation des anderen Plugins kann man so lösen, dass man nicht das ganze Event in die if-Abfrage steckt, sondern nur das Einbinden selbst. Dann wird es beim nächsten Themeaufbau wieder eingebunden. Schön ist allerdings anders :slight_smile:

jQuery.fn.jquery

Es geht ja nicht um jQuery selbst, sondern um jQuery Zusatzbibliotheken, wie jQuery-ui. Kann man das evtl. auch abfragen ? Am besten in php.

Hat denn bisher noch niemand dieses Problem gehabt ? Bzw. bindet ihr in eure Plugins jQuery oder auch JS-Bibliotheken einfach ein, ohne darauf zu acheten, ob ein anderes Plugin (nicht unbedingt ein eigenes) das auch schon eingebunden hat ?