Módulo de desinstalação

16

Eu criei uma extensão que cria um atributo de categoria quando instalado pela primeira vez. Mas agora, quando desabilito / desinstalo a extensão, recebo uma mensagem de erro na página "Gerenciar categorias".

Eu sei que quando uma extensão é desativada via conexão Magento, apenas os arquivos são excluídos e nada é excluído do banco de dados.

Portanto, para superar esse problema, podemos fornecer um botão para excluir as entradas do banco de dados que podem ser colocadas na seção de configuração do sistema, juntamente com outras configurações de extensão. E quando o administrador clica nesse botão, todas as entradas do banco de dados devem ser excluídas juntamente com os arquivos usados ​​por extensão.

Informe-me se a solução acima funcionará? ou existe alguma solução melhor para excluir entradas indesejadas do banco de dados durante a desinstalação da extensão.

Solução de Software Trimantra
fonte

Respostas:

5

Você pode criar um script de shell de desinstalação que mora na shell/pasta. Esse arquivo pode remover arquivos, diretórios, tabelas de banco de dados, core_resourceentradas e atributos do EAV.

Seria algo como isto:

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

Você pode executá-lo na linha de comando com:

php shell/uninstall.php

Feito isso, você pode excluir o próprio arquivo shell.

Ryan Street
fonte
6

Não há solução.

O problema é que desinstalar um módulo significa excluí-lo, mas quando ele é excluído, não há mais nada que possa desinstalar coisas.

  1. Alguns provedores de extensão fornecem uma consulta SQL que limpa o banco de dados.

  2. Um grupo em um de nossos hackathons escreveu uma vez um módulo que faz com que o magento funcione com o uso de scripts de desinstalação: https://github.com/magento-hackathon/MageTrashApp

Infelizmente, você precisa de outro módulo, que faça isso por você, então você pode optar por 1.

Fabian Blechschmidt
fonte
1

Suponho que seria possível criar um arquivo de autodestruição. Eu imaginaria algo assim:

O usuário clica em "Desinstalar extensão e excluir todos os dados" na página de configuração das extensões (é claro, solicite a confirmação após o primeiro clique no botão, ISSO É PERMANENTE).

Agora, para a funcionalidade, se você puder excluir todos os arquivos do módulo primeiro, exclua-se com unlink(__FILE__).

Outra idéia seria um pouco tola, mas digamos que você tenha criado dinamicamente um script de instalação sql, que na verdade era um script de desinstalação. Sua ação no back-end atualizaria a versão do seu módulo, injetaria o arquivo sql com o script de desinstalação, que seria executado na próxima carga do Mage.

Tim Hallman
fonte