Moduł dezinstalacyjny

16

Utworzyłem rozszerzenie, które tworzy atrybut kategorii przy pierwszej instalacji. Ale teraz, gdy wyłączam / odinstalowuję rozszerzenie, pojawia się komunikat o błędzie na stronie „Zarządzaj kategoriami”.

Wiem, że kiedy rozszerzenie jest wyłączone przez Magento connect, tylko pliki są usuwane i nic nie jest usuwane z bazy danych.

Tak więc, aby rozwiązać ten problem, możemy udostępnić przycisk usuwania pozycji bazy danych, który można umieścić w sekcji konfiguracji systemu wraz z innymi ustawieniami rozszerzenia. A gdy administrator kliknie ten przycisk, wszystkie wpisy bazy danych powinny zostać usunięte wraz z plikami używanymi przez rozszerzenie.

Daj mi znać, czy powyższe rozwiązanie będzie działać? lub czy istnieje jakieś lepsze rozwiązanie w celu usunięcia niepożądanych wpisów z bazy danych podczas odinstalowywania rozszerzenia.

Oprogramowanie Trimantra
źródło

Odpowiedzi:

5

Możesz utworzyć skrypt powłoki odinstalowującej, który znajduje się w shell/folderze. Ten plik może usuwać pliki, katalogi, tabele bazy danych, core_resourcewpisy i atrybuty z EAV.

Wyglądałoby to tak:

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

Możesz uruchomić go w wierszu poleceń za pomocą:

php shell/uninstall.php

Gdy to zrobisz, możesz usunąć sam plik powłoki.

Ryan Street
źródło
6

Nie ma rozwiązania.

Problem polega na tym, że odinstalowanie modułu oznacza jego usunięcie, ale po jego usunięciu nie ma już nic, co mogłoby odinstalować różne rzeczy.

  1. Niektórzy dostawcy rozszerzeń udostępniają zapytanie SQL, które czyści bazę danych.

  2. Jedna grupa na jednym z naszych hackathonów napisała kiedyś moduł, który sprawia, że ​​podstawowa funkcja magento przy użyciu skryptów dezinstalacyjnych jest użyteczna: https://github.com/magento-hackathon/MageTrashApp

Niestety potrzebujesz innego modułu, który zrobi to za Ciebie, więc możesz wybrać 1.

Fabian Blechschmidt
źródło
1

Przypuszczam, że byłoby możliwe utworzenie pliku samozniszczenia. Wyobraziłbym sobie coś takiego:

Użytkownik klika „Odinstaluj rozszerzenie i usuń wszystkie dane” ze strony konfiguracji rozszerzeń (oczywiście monit o potwierdzenie po pierwszym kliknięciu przycisku TO JEST STAŁE).

Teraz dla funkcji, jeśli możesz najpierw usunąć wszystkie pliki modułu, a następnie usuń się za pomocą unlink(__FILE__).

Kolejny pomysł byłby nieco hackerski, ale powiedzmy, że dynamicznie utworzyłeś skrypt instalacyjny SQL, który w rzeczywistości był skryptem odinstalowującym. Twoje działanie na backendie zaktualizowałoby wersję modułu, wstrzyknęło plik sql ze skryptem deinstalacyjnym, który zostałby następnie uruchomiony przy następnym ładowaniu Mage.

Tim Hallman
źródło