Eine Helper Funktion für Plugin erstellen

Hallo Community, gibt es eine Möglichkeit, innerhalb von einem Plugin eine Funktion zu erstellen, die dann aus Bootstrap.php, Backend Controllers, Frontend Controller usw. aufrufbar ist? Ich habe erstmal gedacht, dass man so eine Funktion im Models Repository erstellt. Die Funktion wird zwar aufrufbar sein, aber meiner Meinung nach ist das nicht die richtige Stelle dafür, da die Funktion anhand von übergebenen Daten nur etwas berechnen soll und greift in meinem Fall nicht auf DB zu. So wie ich das verstanden habe, wird das mit einem Controller auch nicht gehen, da ich aus der Bootstrap.php nicht darauf zugreifen kann. Hat vielleicht schon jemand damit Erfahrung gemacht? Grüße Nikita

Ein wenig Code Beispiel und was passieren soll wären hilfreich zur Hilfe.

Du kannst zb eine eigene Komponente registrieren - siehe http://community.shopware.com/Plugin-En … _1077.html Auszug: /\*\* \* Oben registrierte Callback-Methode des Events \* Enlight\_Bootstrap\_InitResource\_MEINEKOMPONENTE \*/ public function onInitMyComponent(Enlight\_Event\_EventArgs $arguments) { // Registriert den Namespace der eigenen Komponente $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\_Components', $this-\>Path() . 'Components/' ); // Erzeugen einer Instanz der eigenen Komponente $meineComponente = new Shopware\_Components\_MEINEKOMPONENTE(); // Rückgabe der Instanz return $meineComponente; } Deine Methode kannst du dann zb via Shopware()->DeineKomponente()->Methode() aufrufen. Viele Grüße

1 Like

Ich glaube, Du meinst sowas. Hier ein Beispiel für ein Backend-Plugin: Shopware()-\>Plugins()-\>Backend()-\>PrefixMyPlugin()-\>getFoo(); Hier für den Frontend Namespace Shopware()-\>Plugins()-\>Frontend()-\>PrefixMyPlugin()-\>getFoo(); getFoo() ist eine ganz normale Funktion (public) in der Plugin-Bootstrap. Schöne Grüße, Niklas

1 Like

Um noch einen dritten Weg aufzuführen: /\*\* \* ... \* \* @return void \*/ public function afterInit() { // register the namespace $this-\>Application()-\>Loader()-\>registerNamespace( 'Shopware\DeinPlugin', $this-\>Path() ); } Damit kannst du nun zb auf Komponenten zugreifen, deren Ordnerstruktur und namespace korrekt vergeben ist. Beispiel: $komponente = new \Shopware\DeinPlugin\Components\Bla(); Hier muss nun eine Klasse “Bla” im Components Ordner liegen, die den namespace \Shopware\DeinPlugin\Components trägt. Der autoloader sorgt dafür, dass die Datei korrekt geladen wird. Viele Wege führen nach Rom… Ich würde nur darauf verzichten aus deiner bootstrap eine god Klasse zu machen und öffentlich zugängliche, mehrfache verwendete Funktionalitäten auslagern. Viele Grüße

Danke für die Hilfe. Ich werde gleich alle drei Sachen ausprobieren. Ich will ja nicht die Helper Funktionen in der Bootstrap.php erstellen und somit die Bootstrap.php zu eine „god Klasse“ machen. Ich will eine Klasse/Komponente erstellen mit paar Helper Methoden auf die ich aus Bootstrap.php oder aus Controller zugreifen kann. Ich glaube, dass der Beispiel mit erstellen von eine Komponente genau das ist, was ich gesucht habe. Grüße Nikita

[quote=„Aquatuning GmbH“]Damit kannst du nun zb auf Komponenten zugreifen, deren Ordnerstruktur und namespace korrekt vergeben ist.[/quote] Jau, das habe ich auch für eigene Klassen genau so drin. [quote=„Aquatuning GmbH“]Viele Wege führen nach Rom… Ich würde nur darauf verzichten aus deiner bootstrap eine god Klasse zu machen und öffentlich zugängliche, mehrfache verwendete Funktionalitäten auslagern.[/quote] Definitiv, aber es gibt (in unseren Beispielen) definitiv eine handvoll Funktionen die Logik der Bootstrap benutzen bzw. Daten halten, die definitiv in anderen Controller-Klassen nichts zu suchen hätten. Es gibt da ja definitiv Anwendungsfälle in der das Sinn macht. Wenigstens sind hier alle Wege einmal aufgeführt, find ich gut :slight_smile: Niklas

[quote=“TeichDatensysteme”]Definitiv, aber es gibt (in unseren Beispielen) definitiv eine handvoll Funktionen die Logik der Bootstrap benutzen[/quote] Die bootstrap sollte keine Logik beinhalten. Im Notfall übergebe deiner Komponente deine bootstrap zb im constructor. [quote=“TeichDatensysteme”]die definitiv in anderen Controller-Klassen nichts zu suchen hätten[/quote] Das ist wohl richtig - controller haben ihre eigenen, spezifischen Aufgaben. Daher solltest du möglichst abstrakte Komponenten einsetzen. Ich weiß zwar nicht, wie groß der “Umfang” deiner helper Funktionen ist - aber sie haben in der bootstrap nichts verloren. Viele Grüße

[quote=“Aquatuning GmbH”]Die bootstrap sollte keine Logik beinhalten. Im Notfall übergebe deiner Komponente deine bootstrap zb im constructor. Ich weiß zwar nicht, wie groß der “Umfang” deiner helper Funktionen ist - aber sie haben in der bootstrap nichts verloren.[/quote] Fakt ist, dass selbst Shopware in Ihren Bootstraps einige Hilfsfunktionen haben, und das über einige (!) Plugins verteilt. Wenn Du das ablehnst ist das völlig OK - aber dann lass doch wenigstens andere Meinungen zu :wink: Schöne Grüße, Niklas

[quote=„TeichDatensysteme“]Fakt ist, dass selbst Shopware in Ihren Bootstraps einige Hilfsfunktionen haben[/quote] Und deswegen ist es die korrekte / optimale Vorgehensweise?! Viele Grüße

Du, das wird hier zu Offtopic, wir pushen nur den Beitrag nach oben :wink: Ich lasse mir nur ungerne schlechten Programmierstil nachsagen, ohne das hier eine Zeile davon gezeigt oder kommentiert wurde - das kann und wollte ich nur nicht so stehen lassen :wink: Aber, anscheinend willst Du gar nicht diskutieren, Du hast Deine Meinung zu dem Thema - okay. Ist nicht meine - auch das ist für mich ebenfalls okay :wink: Schöne Grüße, Niklas

Bei Shopware 5 Docus habe auch folgende Tutorial gefunden: https://developers.shopware.com/developers-guide/services/