Plugin Einstellungen sauber löschen?

Beim Testen fällt mir auf, das Plugin-Einstellungen nach dem Deinstallieren und sogar Löschen nicht wirklich gelöscht werden. Installiere ich mein Test-Plugin erneut (Cache vorher natürlich gelöscht) dann stehen plötzlich meine alten Einstellungen wieder im Plugin.

Warum ist so? Wie kann ich diese Einstellungen sauber löschen? (wenn möglich ohne Console)

Weil nur das Plugin selbst auf “File-Ebene” gelöscht wird, nicht aber die Inhalte die in der Datenbank stehen. Manche Plugins löschen auch die zugehörige Tabelle, die meisten jedoch nicht. Müsste man dann manuell machen. Nervt mich auch immer wieder … 

In diesem Falle ist es mein Plugin. Aber wohl die Einstellungen aus der Config werden nicht sauber gelöscht.

Hallo,

das Plugin muss natürlich selber dafür sorgen, dass es Sachen, die es in Datenbanken schreibt beim Deinstallieren wieder löscht. In unserem PayPal Plugin machen wir das für die Plugin Konfiguration z.B. so: SwagPayPal/InstallUninstall.php at master · shopwareLabs/SwagPayPal · GitHub

Viele Grüße aus Schöppingen

cool Michael Telgmann

Ohje, Danke für das Beispiel. Wie ich das in einem einfach Plugin umsetze ist mir noch schleierhaft. Ich bin aber davon ausgegangen, dass die Einstellungen beim Deinstallieren bzw. Löschen automatisch raus fliegen.

Ich mach das jetzt so:

/* delete old config */
private function removeConfiguration() {
  $connection = $this->container->get(Connection::class);
  $delQuery = "DELETE FROM system_config WHERE configuration_key REGEXP ? ";
  $result = $connection->executeQuery( $delQuery, Array('MeinPluginName') );
}

Und zack ist der Mist raus wenn das Plugin deinstalliert wird. Zumindest in der Testphase sehr nützlich.

auf was prüft denn die regular Expression genau bei dir?

auf die Übergabe von

Array('MeinPluginName')

Hallo, 

Das Löschen von Plugin eigenen Einstellungen sollte auch im Plugin selber gehandelt werden. Shopware kann nicht wissen, was gelöscht werden darf, oder unter welchem Key, die Einstellungen in der System-Config gespeichert sind. Es gibt natürlich eine Vorgabe, die man annehmen könnte, aber dann wäre die Fragen, wann wird gelöscht? Immer? oder nur wenn KeepUserData auf false steht? 
Das Löschen von seinen eigenen Konfigurationen ist auch nicht schwierig. Ich bin gerade dabei die Dokumentation für die Plugin Config zu überarbeiten. https://docs.shopware.com/en/shopware-platform-dev-en/internals/plugins/plugin-config In dem Zuge werde ich auch das Beispiel-Plugin updaten. Dort könnt ihr euch dann das Löschen abschauen. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

4 „Gefällt mir“

Hallo Michael,

erst einmal Danke für deine Ausführung. Ich bin fest davon ausgegangen das Shopware sehr wohl erkennt, wenn ich auf den Button/Link “Löschen” klicke. Shopware erkennt ja auch den Zustand installieren/deinstallieren eines Plugins. Ist ja nicht weiter dragisch, man muss es eben nur wissen als Entwickler. Aktuell habe ich ja einen Weg gefunden und mit nur 3 Zeilen Code ist alles sauber raus.

Bei mir kommt allerdings ein You have requested a non-existent service vor der Installation, wenn ich die Funktion in die uninstall einbinde.

public function uninstall(UninstallContext $uninstall): void {
  $this->removeConfiguration();
}

private function removeConfiguration() {
  $connection = $this->container->get(Connection::class);
  $delQuery = "DELETE FROM system_config WHERE configuration_key REGEXP ? ";
  $result = $connection->executeQuery( $delQuery, Array('exampleplugin') );
}

 

Ja, ganz oben fehlt noch:

use Doctrine\DBAL\Connection;

 

1 „Gefällt mir“

cool danke. Funktioniert.

Hallo,

evtl. könnte man beim Löschen von einem Plugin über die Administration auch den Deinstallations-Prozess des Plugins anstoßen. Halte ich erstmal für keine schlechte Idee. Könntest du dafür vielleicht ein Ticket aufmachen?

Viele Grüße aus Schöppingen

cool Michael Telgmann

Wenn ich ein Plugin manuell deinstalliere über das Backend erhalte ich keine Abfrage bzgl. keepUserData.

Muss man im Plugin selbst noch etwas tun, damit diese Abfrage für den Nutzer beim Deinstallieren auch erscheint?

 

// SW6.2.0RC1

@zenit‍

Ist imo nur für das deinstallieren des Plugins via console, hätte auch gerne den confirm im backend… 

2 „Gefällt mir“

@Moorleiche‍ Danke für die schnelle Rückmeldung. Wollte nur sicher gehen, dass man in SW6 eine solche Abfrage vor dem Deinstallieren nicht erst noch irgendwie im Plugin implementieren müsse -  also zusätzlich zum keepUserData-Kram  Smile

Hallo,

keepUserData wird im Admin leider noch nicht abgefragt. Es gibt dazu aber bereits Tickets.

Viele Grüße aus Schöppingen

cool Michael Telgmann

So mache ich es bisher:

 

keepUserData()) {
            return;
        }

        $this->removeConfiguration($uninstallContext->getContext());
    }

    private function removeConfiguration(Context $context): void
    {
        /** @var EntityRepositoryInterface $systemConfigRepository */
        $systemConfigRepository = $this->container->get('system_config.repository');
        $criteria = (new Criteria())->addFilter(new ContainsFilter('configurationKey', $this->getName() . '.config.'));
        $idSearchResult = $systemConfigRepository->searchIds($criteria, $context);

        $ids = array_map(static function ($id) {
            return ['id' => $id];
        }, $idSearchResult->getIds());

        if ($ids === []) {
            return;
        }

        $systemConfigRepository->delete($ids, $context);
    }
}

 

@Michael Telgmann schrieb:

Hallo,

keepUserData wird im Admin leider noch nicht abgefragt. Es gibt dazu aber bereits Tickets.

Viele Grüße aus Schöppingen

cool Michael Telgmann

Ich habe dazu dieses Issue gefunden: Shopware Issuetracker. Es ist geschlossen und die Funktionalität scheint bei SW 6.2.2 nicht vorhanden zu sein.

Ich wünsche dem SW-Team viel Erfolg bei der Umsetzung des Features und werde versuchen, die Lücke vorerst mit Eigengebastel zu überbrücken.