Módulo de desinstalación

16

He creado una extensión que crea un atributo de categoría cuando se instala por primera vez. Pero ahora, cuando desactivo / desinstalo la extensión, aparece un mensaje de error en la página "Administrar categorías".

Sé que cuando una extensión se deshabilita a través de Magento connect, solo se eliminan los archivos y no se elimina nada de la base de datos.

Entonces, para superar este problema, podemos proporcionar un botón para eliminar las entradas de la base de datos que se pueden colocar en la sección de configuración del sistema junto con otra configuración de extensión. Y cuando el administrador hace clic en ese botón, todas las entradas de la base de datos deben eliminarse junto con los archivos utilizados por extensión.

Avíseme si la solución anterior funcionará. ¿O hay alguna solución mejor para eliminar entradas no deseadas de la base de datos mientras se desinstala la extensión?

Solución de software Trimantra
fuente

Respuestas:

5

Puede crear una secuencia de comandos de desinstalación que viva en la shell/carpeta. Ese archivo puede eliminar archivos, directorios, tablas de bases de datos, core_resourceentradas y atributos de EAV.

Se vería algo así:

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

Puede ejecutarlo en la línea de comando con:

php shell/uninstall.php

Una vez hecho esto, puede eliminar el archivo shell en sí.

Ryan Street
fuente
6

No hay solución.

El problema es que desinstalar un módulo significa eliminarlo, pero cuando se elimina, no hay nada más que pueda desinstalar cosas.

  1. Algunos proveedores de extensiones proporcionan una consulta SQL que borra la base de datos.

  2. Un grupo en uno de nuestros hackathons escribió una vez un módulo que hace que la función principal de magento sea usar scripts de desinstalación utilizables: https://github.com/magento-hackathon/MageTrashApp

Desafortunadamente, necesita otro módulo, que lo hace por usted, por lo que puede ir con 1.

Fabian Blechschmidt
fuente
1

Supongo que sería posible crear un archivo de autodestrucción. Imaginaría algo como esto:

El usuario hace clic en "Desinstalar extensión y eliminar todos los datos" de la página de configuración de extensiones (por supuesto, solicitar confirmación después de hacer clic en el primer botón, ESTO ES PERMANENTE).

Ahora para la funcionalidad, si se pudiera eliminar todos los archivos del módulo primero, y luego borrarse a sí mismo con unlink(__FILE__).

Otra idea sería un poco difícil, pero digamos que creó dinámicamente un script de instalación sql, que en realidad era un script de desinstalación. Su acción en el backend actualizaría la versión de su módulo, inyectaría el archivo sql con el script de desinstalación, que luego se ejecutaría en la próxima carga de Mage.

Tim Hallman
fuente