Pluginentwicklung BestPractices

Hallo zusammen, ich bin neu hier und gerade dabei eine erstes Plugin zu entwickeln. Shopware macht dabei die Entwicklung über das sehr gute Plugin Event- und Hook-System sehr einfach und dank der guten Dokumentation ist die Lernkurve auch sehr steil. Danke dafür! Während der Entwicklung und Einarbeitung haben sich natürlich auch schon ein paar Fragen ergeben und ich würde mich über Feedback dazu freuen: 1.) Plugins und Templates Prinzipiell ist es ja möglich eigenständige Templates für die Plugins direkt im Pluginverzeichnis zu hinterlegen. Vorteil ist sicherlich die Kapselung und die Plugins sind einfacher zu deployen. Andererseits gibt es ja in /templates/TEMPLATE_NAME/frontend/plugins ebenfalls ein Verzeichnis dafür? Was ist besser geeignet? In den Templates lassen sich mit s und se (Vorbereitung für Shopware 4) Textsnippets erstellen. Definitiv eine schöne Sache! Wie sieht es hier mit der Kapselung aus? Ließe sich da eine Exportdatei im Pluginordner hinterlegen o.ä. was die Distribution erleichert? 2.) Kickstarter (SwagKick) Gefällt mir sehr gut - leider scheint dieser nicht mehr weiterentwickelt zu werden und enthält auch einige [bekannte] Bugs. Was bisher nicht erwähnt wurde: Der Kickstarter erstellt automatisch eine uninstall-Methode. Diese ist in den meisten Fällen nicht notwendig, da Shopware dies in den meisten Fällen automatisch hervorragend erledigt. Falls diese enthalten ist und true zurückliefert, muss man sich um die Entfernung der hooks und events in der Tabelle s_core_subscribes manuell kümmern. 3.) Frontendcontroller Ich verwende die Version 3.5.6 mit deaktiviertem RouterOld-Plugin. Im Plugin selbst habe ich einen Frontendcontroller erstellt. in der install-Methode: //Creating controller event for Frontend - testc $event = $this-\>createEvent('Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_testc','onGetControllerPathFrontendTestcl'); $this-\>subscribeEvent($event); Und die Methode „onGetControllerPathFrontendTestcl“ ist ebenfalls vorhanden. public static function onGetControllerPathFrontendTestcl(Enlight\_Event\_EventArgs $args) { die('TEST'); return dirname(\_\_FILE\_\_).'/Controllers/Frontend/testc.php'; } Selbstverständlich ist das Plugin installiert, aktiviert und der Event ist auch in der s_core_subscribes vorhanden. Leider feuert dieser nicht, wenn ich den Shop mit meine-domain.de/testc aufrufe. Es wird zur Indexsseite weitergeleitet. Auch der Aufruf über die „alte“ Viewport-Schreibweise schlägt fehlt. Woran könnte dies liegen? 4.) Events Im Wiki habe ich für die Events folgende Beschreibung gefunden: Enlight_Controller_Action_PreDispatch_MODULE_CONTROLLER_ACTIONNAME Ich habe das so verstanden, dass für jede Action in einem Controller ein Pre- bzw. Post-Event registriert werden kann. Jedoch kann ich maximal diese Länge für Controller verwenden Enlight_Controller_Action_PreDispatch_MODULE_CONTROLLER (ohne die Action)? 5.) Seo Das Rewriting funktioniert bei mir ganz prima. Bei Klick auf das Impressum kommt /impressum etc. Bei einigen Links wie Warenkorb oder Registrierung stehen jedoch die englischen Bezeichnung dran, z.B. /checkout/cart oder /register. Weiß jemand woran das liegt und ob die s_core_rewrite_urls dafür verantwortlich ist? Hier habe ich nur einen Eintrag sViewport=basket -> Warenkorb und keinen „checkout“ etc. Eintrag? Ist das SEO-Plugin evtl. nicht uptodate? Über Antworten würde ich mich freuen! Vielen Dank! Viele Grüße

Ufff… dann fangen wir langsam an :slight_smile: [quote]Prinzipiell ist es ja möglich eigenständige Templates für die Plugins direkt im Pluginverzeichnis zu hinterlegen. Vorteil ist sicherlich die Kapselung und die Plugins sind einfacher zu deployen. Andererseits gibt es ja in /templates/TEMPLATE_NAME/frontend/plugins ebenfalls ein Verzeichnis dafür? Was ist besser geeignet?[/quote] Aus meiner Sicht natürlich die erste Variante (im Plugin Ordner). Wenn Du die Templates im “/templates/TEMPLATE_NAME/frontend/plugins” platzieren möchtest, muss Du entweder dem Kunden sagen, dass er die Datei dahin kopieren soll oder in der install() Methode dafür sorgen, dass die Datei dahin kopiert wird. Da gibt es aber bestimmt Probleme mit den Rechten. Also die einzig akzeptable Möglichkeit für mich - im Plugin Ordner. [quote]In den Templates lassen sich mit s und se (Vorbereitung für Shopware 4) Textsnippets erstellen. Definitiv eine schöne Sache! Wie sieht es hier mit der Kapselung aus? Ließe sich da eine Exportdatei im Pluginordner hinterlegen o.ä. was die Distribution erleichert?[/quote] Für die Textbausteine kann man ja ein Wort/einen Satz eingeben der verwendet wird, wenn der Textbaustein nicht da ist. Wäre das eine Möglichkeit für Dich? [quote]…Selbstverständlich ist das Plugin installiert, aktiviert und der Event ist auch in der s_core_subscribes vorhanden. Leider feuert dieser nicht, wenn ich den Shop mit meine-domain.de/testc aufrufe. Es wird zur Indexsseite weitergeleitet. Auch der Aufruf über die “alte” Viewport-Schreibweise schlägt fehlt. Woran könnte dies liegen?..[/quote] Was sagt Firebug (Tab Network)? Was kommt vom Server zurück? Kommt da ein 404/503 Fehler? [quote]4.) Events Im Wiki habe ich für die Events folgende Beschreibung gefunden: Enlight_Controller_Action_PreDispatch_MODULE_CONTROLLER_ACTIONNAME Ich habe das so verstanden, dass für jede Action in einem Controller ein Pre- bzw. Post-Event registriert werden kann. Jedoch kann ich maximal diese Länge für Controller verwenden Enlight_Controller_Action_PreDispatch_MODULE_CONTROLLER (ohne die Action)?[/quote] Die Frage habe ich gestern gestellt. Ab hier und die letzten drei Posts lesen: programmierung-f13/hook-funktioniert-nicht-args-getreturn-gibt-null-zuruck-t4441.html#p23981

1 „Gefällt mir“

Guten Morgen und herzlichen Dank für die Antwort! 1.) Die Möglichkeit die Texte direkt im Template zu hinterlegen (mit der Möglichkeit zur Änderung) ist mir bekannt. Ich nehme an, dass funktioniert auch mit se - bisher habe ich nur Beispiele mit s dazu gesehen. Schöner fände ich jedoch trotzdem eine Plugin-Snippet-Api, die entsprechende Texte beim install des Plugins übernimmt. (Feature-Wunsch :D) 3.) Dieser Punkt hat sich irgendwie von selbst erledigt. Kann leider nicht rekonstruieren woran es lag, aber es funktioniert jetzt. 4.) Danke für den Link. Den Beitrag habe ich mir aufmerksam durchgelesen. Jedoch verstehe ich die Antworten nicht ganz, den sie erscheinen mir widersprüchlich. Gibt es für jeden Controller und jede Action nun einen Event in der Form: Enlight_Controller_Action_[Pre|Post]Dispatch_MODULE_CONTROLLER_ACTIONNAME ? Ich gehe nicht davon aus, da Enlight_Controller_Action_PreDispatch_Frontend_Search_searchAction nicht funktioniert - jedoch Enlight_Controller_Action_PreDispatch_Frontend_Search und die Unterscheidung der Action selbst getroffen werden muss. Nun stellt sich die Frage, warum die Events bei manchen Actions vorhanden sind, bei anderen wiederum nicht? 5.) Kann ich für die eigenen Controller Seo-URLs definieren über die Plugin-API? Viele Grüße