Module de désinstallation

16

J'ai créé une extension qui crée un attribut de catégorie lors de la première installation. Mais maintenant, lorsque je désactive / désinstaller l'extension, je reçois un message d'erreur sur la page "Gérer les catégories".

Je sais que lorsqu'une extension est désactivée via Magento connect, seuls les fichiers sont supprimés et rien n'est supprimé de la base de données.

Donc, afin de surmonter ce problème, nous pouvons fournir un bouton pour supprimer les entrées de base de données qui peuvent être placées sous la section de configuration du système avec d'autres paramètres d'extension. Et lorsque l'administrateur clique sur ce bouton, toutes les entrées de la base de données doivent être supprimées ainsi que les fichiers utilisés par l'extension.

Veuillez me faire savoir si la solution ci-dessus fonctionnera? ou existe-t-il une meilleure solution pour supprimer les entrées indésirables de la base de données lors de la désinstallation de l'extension.

Solution logicielle Trimantra
la source

Réponses:

5

Vous pouvez créer un script shell de désinstallation qui réside dans le shell/dossier. Ce fichier peut supprimer des fichiers, des répertoires, des tables de base de données, des core_resourceentrées et des attributs d'EAV.

Cela ressemblerait à quelque chose comme ceci:

<?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();

Vous pouvez l'exécuter sur la ligne de commande avec:

php shell/uninstall.php

Une fois cela fait, vous pouvez supprimer le fichier shell lui-même.

Ryan Street
la source
6

Il n'y a pas de solution.

Le problème est que désinstaller un module signifie le supprimer, mais quand il est supprimé, il n'y a plus rien qui puisse désinstaller des éléments.

  1. Certains fournisseurs d'extensions fournissent une requête SQL qui efface la base de données.

  2. Un groupe sur l'un de nos hackathons a écrit un module qui rend la fonction principale de magento d'utilisation des scripts de désinstallation utilisable: https://github.com/magento-hackathon/MageTrashApp

Malheureusement, vous avez besoin d'un autre module, qui le fait pour vous, vous pouvez donc y aller avec 1.

Fabian Blechschmidt
la source
1

Je suppose qu'il serait possible de créer un fichier d'autodestruction. J'imagine quelque chose comme ça:

L'utilisateur clique sur «Désinstaller l'extension et supprimer toutes les données» dans la page de configuration des extensions (bien sûr, vous êtes invité à confirmer après le premier clic sur le bouton, CECI EST PERMANENT).

Maintenant, pour la fonctionnalité, si vous pouviez d'abord supprimer tous les fichiers du module, puis supprimez-vous avec unlink(__FILE__).

Une autre idée serait un peu hackish, mais disons que vous avez créé dynamiquement un script d'installation sql, qui était en fait un script de désinstallation. Votre action sur le backend mettrait à jour la version de votre module, injecterait le fichier sql avec le script de désinstallation, qui serait ensuite exécuté lors du prochain chargement de Mage.

Tim Hallman
la source