Wie kann ich das gesamte Form() meines Plugins löschen?

Hallo,

Ich möchte alle Konfigurationselemente meines Plugins löschen, gibt es dafür einen API-Weg?

Finde keinen, und ein manueller DELETE Query bringt mich nicht weiter da dann meine anschließenden addElement() Aufrufe (will die Config neuerstellen) einen “duplicate key” werfen…

Scheinbar werden die INSERTs partout vor den DELETE sortiert. Das der DELETE Part funktioniert habe ich nach Testlauf in der DB kontrolliert, daran liegt’s definitiv nicht. Eine Transaction um den DELETE herum, oder um alles, führt zum gleichen Ergebnis. Aber das wäre ja eh “geschummelt”, lieber wäre mir ein API-Call dafür…

Da muss es doch etwas geben das ich übersehen habe?

Finde keinen, und ein manueller DELETE Query bringt mich nicht weiter da dann meine anschließenden addElement() Aufrufe (will die Config neuerstellen) einen „duplicate key“ werfen…

Ich vermute weil nicht alles sauber gelöscht wurde. Im Prinzip steht alles hier drin:

  • s_core_config_elements
  • s_core_config_element_translations
  • s_core_config_forms
  • s_core_config_form_translations

 

1 „Gefällt mir“

Hmmm stimmt an die Translations habe ich nicht gedacht, teste ich nachher mal. 

Aber da muss es doch trotzdem bestimmt einen besseren Weg geben? 

Vielleicht gibt es auch einen, aber da fällt mir zur Stunde nichts ein.

Habe es gerade noch mal angeschaut, die anderen Tabellen enthalten keine Einträge für mein Plugin, mal abgesehen vom Form selbst natürlich. Der Index der den Fehler wirft existiert auch so nur in elements. Muss also daran liegen.

Was den „richtigen“ Weg angeht, da habe ich jetzt mehrere probiert und alles endet wieder mit dem „duplicate key“ wenn ich die Elemente neu hinzufügen will.

z.B:

foreach ($this->Form()->getElements() as $element) {
    $this->Form()->removeElement($element);
}
Shopware()->Models()->flush();

… oder …

$this->Form()->getElements()->clear();
Shopware()->Models()->flush();

… bin echt ratlos.

Nachtrag: Erinnert mich daran warum ich es ursprünglich mit Query machen wollte: https://forum.shopware.com/discussion/22475/plugin-konfiguration-removeelement-funktioniert-nicht :stuck_out_tongue: Aber das wird es ja wohl kaum sein. Allerdings teste ich derzeit tatsächlich in 5.0, aber zumindest das manuelle löschen per SQL sollte ja gehen.

Nachtrag 2: Die Variante aus Shopware Issuetracker funktioniert auch nicht. Selber „duplicate key“ Fehler. Foot-in-Mouth

Nachtrag 3: Ich habe jetzt sogar den Code aus der Namespace::removeForm() ausprobiert, selbes Ergebnis. Was zum…?!

Nur mal so jetzt nachgefragt, der Fehler “duplicate key” zeigt auch die jeweilige Tabelle an. Was steht denn da komplett?

Sorry für die späte Antwort, bin immer nur Abends daran.

… elements.

"Unable to update, got exception:\nAn exception occurred while executing 'INSERT INTO s_core_config_elements (name, value, description, label, type, required, position, scope, options, form_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [$weggekuerztFuerLesbarkeit]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '315-opMode' for key 'form_id_2'\n"

Und diese Meldung kommt wie gesagt immer, egal ob SQL oder die genannten API-Wege. Ich bin mir aber dreizillionen Prozent sicher das der DELETE funktioniert, gerade noch mal validiert - siehe Screenshot, der stammt von unmittelbar nach dem fehlgeschlagenen Update. (Nachtrag: und ja, ich schaue auch in die richtige DB  Grin Habe einige Test-DBs in so fern wäre das bei der Kontrolle des DELETE wirklich möglich gewesen - aber nein, auch das kann ich ausschließen) Bin mittlerweile so weit das ich morgen ein Mini-Plugin explizit zur Demonstration dieses Verhaltens machen werde und dann ein Issue aufzumachen. Vermutlich kombiniert mit vollständigen query_log durch/von MySQL direkt.

Das muss irgendein obskures cache Problem gewesen sein. (Damit meine ich MySQL, Doctrine oder keine Ahnung - Shopwarecache hatte ich bei vorherigen Versuchen immer wieder geleert)

Habe heute ein Miniplugin geschrieben das lediglich ein einziges Config-Element anlegt und einen leeren Frontend Event Handler registriert.

Dabei konnte ich bestätigen das, in 5.0 und 5.4.0, removeElement() nicht funktioniert - jedenfalls nicht so wie es aus der phpdoc hervorgeht. Aber das neuanlegen nach löschen per SQL funktionierte plötzlich. Dachte erst, es lag daran das ich das löschen im Demoplugin in einer separaten Methode erledigt habe. Also Testcase-Plugin abgeändert und das löschen diesmal in der selben Methode wie das neuanlegen erledigt, aber es ging immer noch (removeElement() aber immer noch nicht). [Falls es jemanden interessiert, das Testplugin ist unter Dropbox - bugdemo-plugin-and-output.zip - Simplify your life zu finden]

Darauf hin war ich natürlich erst recht neugierig, das eigentlich betroffene Plugin deinstalliert - Altversion installiert, Form gespeichert. Neue Version hochgeladen, Update angeschmießen und siehe da - auch in dem Plugin funktioniert es jetzt per SQL.

Ich habe nicht den blassesten Schimmer warum es jetzt geht, aber die ganzen letzten Tage nicht… Der Code des eigentlichen Plugins ist unverändert. Nur neu hochgeladen nach dem erfolgreichen (bzw. eigentlich fehlgeschlagenen, wollte ja einen Fehler dokumentieren ) Demoplugin. Jedenfalls hat sich das Problem erledigt.

Es würde mich aber trotzdem interessieren wie denn der eigentlich angedachte, quasi “Shopware way of life”, Weg zum löschen ist…

Sorry für die späte Antwort, bin immer nur Abends daran.

Kein Problem, ich bin auch nicht jeden Tag im Forum, nur so wie ich Zeit und Lust habe. 

Das mit der Fehlermeldung konnte ich so noch nicht nachvollziehen. Wenn ich ein Datensatz lösche, war er wirklich weg. Vermute aber auch, dass die Fehler schlicht und einfach noch aus dem Cache kam.