Modulo di disinstallazione


16

Ho creato un'estensione che crea un attributo di categoria alla prima installazione. Ma ora quando disabilito / disinstallo l'estensione, ricevo un messaggio di errore nella pagina "Gestisci categorie".

So che quando un'estensione è disabilitata tramite Magento Connect, vengono eliminati solo i file e nulla viene eliminato dal database.

Quindi, al fine di ovviare a questo problema, possiamo fornire un pulsante per eliminare le voci del database che possono essere inserite nella sezione di configurazione del sistema insieme ad altre impostazioni di estensione. E quando l'amministratore fa clic su quel pulsante, tutte le voci del database devono essere eliminate insieme ai file utilizzati dall'estensione.

Per favore fatemi sapere se la soluzione sopra funzionerà? o esiste una soluzione migliore per eliminare le voci indesiderate dal database durante la disinstallazione dell'estensione.

Risposte:


5

È possibile creare uno script della shell di disinstallazione che risiede nella shell/cartella. Tale file può rimuovere file, directory, tabelle di database, core_resourcevoci e attributi da EAV.

Sarebbe simile a questo:

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

Puoi eseguirlo dalla riga di comando con:

php shell/uninstall.php

Una volta fatto, puoi eliminare il file shell stesso.


6

Non c'è soluzione

Il problema è che disinstallare un modulo significa eliminarlo, ma quando viene eliminato non c'è più nulla che possa disinstallare roba.

  1. Alcuni provider di estensione forniscono una query SQL che cancella il database.

  2. Un gruppo su uno dei nostri hackathon ha scritto una volta un modulo che rende utilizzabile il core di magento usando script di disinstallazione: https://github.com/magento-hackathon/MageTrashApp

Sfortunatamente hai bisogno di un altro modulo, che fa questo per te, quindi potresti andare con 1.


1

Suppongo che sarebbe possibile creare un file autodistruggente. Immaginerei qualcosa del genere:

L'utente fa clic su "Disinstalla estensione ed elimina tutti i dati" dalla pagina di configurazione delle estensioni (ovviamente richiede conferma dopo il primo clic del pulsante, QUESTO È PERMANENTE).

Ora per la funzionalità, se potessi prima eliminare tutti i file del modulo, quindi cancellalo con unlink(__FILE__).

Un'altra idea sarebbe un po 'hacker, ma dire che hai creato dinamicamente uno script di installazione sql, che in realtà era uno script di disinstallazione. La tua azione sul back-end aggiorna la versione del tuo modulo, inietta il file sql con lo script di disinstallazione, che verrebbe quindi eseguito al successivo caricamento di Mage.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.