[SW52] Eigene Einkaufswelt-Emotions werden nach Plugin-Update gelöscht

Ich hab ein Plugin (neues Plugin-System) geschrieben welches die Einkaufswelten um eigene Emotions erweitert. Nun ist es sehr wahrscheinlich das es weitere Emotions oder Anpassungen an bestehenden geben wird.

Füge ich einer Emotion ein weiteres Feld hinzu oder lege eine neue an muss ich das Plugin neu installieren damit die Änderungen greifen. Dummerweise sind danach alle eigenen Elemente und die damit erzeugten Inhalte aus den Einkaufswelten verschwunden. Was muss passieren damit die Inhalte migriert werden?

Folgendes Caches werden nach einer Neu-Installation Neu-Initialisiert:

  • template
  • config
  • router
  • proxy

Moin @gearsdigital‍,

hier kannst du sehen, welche Daten alle beim Neuinstallieren / Deinstallieren eines Plugins im neuen Pluginsystem entfernt werden.
Die Methode bekommt einen Parameter $removeData  übergeben, der aussagt, ob ein Plugin normal deinstalliert oder über „secureUninstall“ deinstalliert wurde.

Theoretisch würde es durchaus Sinn machen die Einkaufswelten Daten beim „secureUninstall“ bestehen zu lassen.
Allerdings kann ich mir vorstellen, dass es dann zu Problemen kommen kann, wenn man ein Plugin per „secureUninstall“ deinstalliert und dann versucht eine Einkaufswelt aufzurufen, die ein entsprechendes Element von dem Plugin genutzt hat.

Da bin ich mir aber, wie gesagt, nicht ganz sicher.
Im Zweifelsfall einfach mal ein Ticket in unserem Issue Tracker öffnen.

Gruß,
Patrick  Shopware

1 „Gefällt mir“

Vielen Dank Patrick,

leider brachte dein Hinweis nicht den gewünschten Erfolg. Wie übergebe ich der Uninstall-Methode im Plugin den $removeData  Parameter? (Ich leitet von der Plugin-Klasse ab)

Ich stimme dir zu das es zu Problemen kommt wenn die referenzierten Elemente nicht mehr da sind. Hast du eine Idee für einen Workaround? Uns reicht es wenn die Daten wieder da sind wenn das Plugin aktualisiert und reaktivert wurde. Wir wollen nur den Datenverlust verhindern. Wurden zwischenzeitlich Änderungen am System oder den Einkaufswelten vorgenommen kann das getrost ignoriert werden. Das ist dann zwar immernoch nicht schön aber durchaus vertretbar.

Ich habe hierzu ein Issue (SW-19226) im Tracker eröffnet. Bei Bedarf stelle ich euch den Plugin-Code gerne zu Verfügung.

1 „Gefällt mir“

Moin,
der $removeData  Parameter wird automatisch übergeben, da musst und kannst du nichts machen. Bei einer Deinstallation wirst du ja gefragt, ob du die Daten löschen willst. Antwortest du mit Ja, wird der Parameter $removeData auf ‚true‘ stehen.

Mir gefällt eure Idee bzgl. der „gelöschten“ Elemente übrigens ziemlich gut.
 
Mir fallen dazu zwei Workarounds ein, die aber Beide nicht sonderlich schön sind.

  1. Du könntest über ein zweites Plugin den PluginInstaller Service dekorieren. Der hängt ja einfach im Container, sodass du den originalen Service dekorieren könntest.
    Problem dabei: Du hast eine Abhängigkeit auf ein zweites Plugin.

  2. Du speicherst dir vor dem Deinstallieren alle Elemente, die von dem Plugin stammen, in eine temporäre Tabelle und liest diese beim Installieren wieder aus.
    Ist aber auch eher in die Kategorie „Bad practice“ einzuordnen.

Gruß,
Patrick  Shopware

1 „Gefällt mir“

Workaround Nr. 2 kam mir auch schon in den Sinn, hab Ihn aber erstmal verworfen weil ich dachte da muss es doch was internes geben  Undecided Nun ja… dann erstmal so.

Okay, danke erstmal für deine Vorschläge! Falls du weiteren Input zu der Idee der “gelöschten” Elemente benötigst schreibe ich Dir gerne eine User-Story. Meine Kontaktdaten sind ja sicher im Issue-Tracker hinterlegt.

Gruß,
Steffen

1 „Gefällt mir“

Gibts da mittlerweile schon ein update dazu? Wenn ich den createOrUpdate Methode des shopware.emotion_component_installer nutze und das Plugin aktualisiere, werden ebenfalls alle bereits platzierten Widgets aus den Einkaufswelten geschmissen, auch wenn sich an der Konfiguration des Emotion-Widgets nichts geändert hat. Das Ticket dazu ist ja schon seit 18 Monaten offen -_- Shopware Issuetracker

 

Frage, kann ich vor dem createOrUpdate nachschauen ob es das component schon gibt und in der Datenbank in der Tabelle s_emotion_element die componentID auf z.B -99999 setzen und nach dem createOrUpdate wieder zurück? Somit würde das orphanRemoval des ORM nicht greifen oder übersehe ich was?

Auch 2021 ist das Verhalten noch ein Thema.
Wie habt Ihr es denn gelöst?

Traurigerweise garnicht. Wir haben Shopware CMS von Dreischild gekauft und machen damit u.A. unsere Einkaufswelten. Dort ist es auch einfacher, eigene Widgets zu erstellen und das erstellen ist generell wesentlich angenehmer als mit den standard Shopware Emotions, meiner Meinung nach. Es ist zwar auch nicht perfekt und ich würde mir dort ebenfalls einige Features wünschen, aber man hat doch mehr Handhabe Dinge umzusetzen und es gibt wenigtens Support.

Ja, das haben wir auch schon bei anderen Shops im Einsatz. Wir wollten jetzt eben mal schauen, ob man mit den Core Funktionen zurecht kommt.
Das hat bis jetzt auch ganz gut geklappt, aber jetzt sind wir dabei den Content aufzubauen und da fällt uns das Löschen von Elementen ziemlich auf die Füße.

@StefanSch Was man sonst auch machen kann (ist bei vielen EKs aber sehr nervig):

Vor dem Update die Einkaufswelt exportieren (gibt dafür bei den Einkaufswelten einen Button), Update machen, neue EK erstellen und Daten wieder importieren.