Deinstallationsmodul

16

Ich habe eine Erweiterung erstellt, die bei der Erstinstallation ein Kategorieattribut erstellt. Aber jetzt, wenn ich die Erweiterung deaktiviere / deinstalliere, erhalte ich eine Fehlermeldung auf der Seite "Kategorien verwalten".

Ich weiß, dass, wenn eine Erweiterung über Magento Connect deaktiviert wird, nur Dateien gelöscht werden und nichts aus der Datenbank gelöscht wird.

Um dieses Problem zu beheben, können Sie eine Schaltfläche zum Löschen von Datenbankeinträgen bereitstellen, die zusammen mit anderen Erweiterungseinstellungen im Abschnitt Systemkonfiguration abgelegt werden können. Und wenn der Administrator auf diese Schaltfläche klickt, sollten alle Datenbankeinträge zusammen mit den von der Erweiterung verwendeten Dateien gelöscht werden.

Bitte lassen Sie mich wissen, ob die obige Lösung funktioniert. oder gibt es eine bessere Lösung, um unerwünschte Einträge aus der Datenbank zu löschen, während die Erweiterung deinstalliert wird.

Trimantra-Softwarelösung
quelle

Antworten:

5

Sie können ein Deinstallations-Shell-Skript erstellen, das im shell/Ordner enthalten ist. Diese Datei kann Dateien, Verzeichnisse, Datenbanktabellen, core_resourceEinträge und Attribute aus EAV entfernen .

Es würde ungefähr so ​​aussehen:

<?php

include_once 'abstract.php';

class Namespace_Module_Uninstall extends Mage_Shell_Abstract {

    public function run() {
        $this->removeDirectories();
        $this->removeAttributes();
    }

    /**
     * Remove file system files here.
     */
    public function removeDirectories() {
        $file = new Varien_Io_File();

        $file->rmdir(BP . DS . 'app/code/local/My/', true);
        $file->rm(BP . DS . 'app/etc/modules/My_Module.xml');
    }

    /**
     * Remove any attributes here
     */
    public function removeAttributes() {
        $installer = $this->_getSetup();

        $installer->startSetup();

        // repeat this for any other attributes you wish to uninstall
        $installer->removeAttribute('catalog_product', 'your_attribute');

        $installer->endSetup();
    }

    /**
     * Return catalog/customer/core or whichever resource setup class you need
     *
     * @return Mage_Catalog_Model_Resource_Setup
     */
    protected function _getSetup() {
        return Mage::getResourceSingleton('catalog/setup', 'default_setup');
    }
}

$uninstall = new Namespace_Module_Uninstall();

$uninstall->run();

Sie können es in der Befehlszeile ausführen mit:

php shell/uninstall.php

Danach können Sie die Shell-Datei selbst löschen.

Ryan Street
quelle
6

Es gibt keine Lösung.

Das Problem ist, dass das Deinstallieren eines Moduls das Löschen des Moduls bedeutet. Wenn es jedoch gelöscht wird, kann nichts mehr deinstalliert werden.

  1. Einige Erweiterungsanbieter stellen eine SQL-Abfrage bereit, mit der die Datenbank gelöscht wird.

  2. Eine Gruppe auf einem unserer Hackathons hat einmal ein Modul geschrieben, das die Verwendung von Deinstallationsskripten für die Magento-Kernfunktion nutzbar macht: https://github.com/magento-hackathon/MageTrashApp

Leider benötigen Sie ein anderes Modul, das dies für Sie erledigt, so dass Sie mit 1 gehen könnten.

Fabian Blechschmidt
quelle
1

Ich nehme an, es wäre möglich, eine Selbstzerstörungsdatei zu erstellen. Ich würde mir so etwas vorstellen:

Der Benutzer klickt auf der Erweiterungskonfigurationsseite auf "Erweiterung deinstallieren und alle Daten löschen" (natürlich werden Sie aufgefordert, nach dem Klicken auf die erste Schaltfläche zu bestätigen, DIES IST PERMANENT).

Nun zur Funktionalität, wenn Sie zuerst alle Dateien des Moduls löschen könnten, dann löschen Sie sich selbst mit unlink(__FILE__).

Eine andere Idee wäre etwas hackisch, aber sagen wir, Sie haben dynamisch ein SQL-Installationsskript erstellt, das eigentlich ein Deinstallationsskript war. Durch Ihre Aktion im Backend wird die Version Ihres Moduls aktualisiert. Fügen Sie der SQL-Datei das Deinstallationsskript hinzu, das dann beim nächsten Laden von Mage ausgeführt wird.

Tim Hallman
quelle