Magento - 扩展开发,处理卸载


Magento - Extension Development, deal with uninstall

我对magento扩展开发真的很陌生。我向其他人学习并为magento 1.7.0扩展创建了一个简单的演示。它运行良好,在其安装脚本中,我在"catalog_product"中添加了一个属性,它也在工作。

现在我想知道,当这个扩展从系统中删除或从系统中卸载时,我该如何删除此属性,如何编写代码来处理卸载?谢谢。

嗯...你不能。Magento有一些未完成的事情。有一种方法可能用于此Mage_Core_Model_Resource_Setup::_uninstallResourceDb($version)但这不称为任何软件。

protected function _uninstallResourceDb($version)
{
    $this->_modifyResourceDb(self::TYPE_DB_UNINSTALL, $version, '');
    return $this;
}

即使您在脚本中手动调用它,它也不会执行任何操作,因为当第一个参数self::TYPE_DB_UNINSTALL("卸载"(时,在其中调用的方法_modifyResourceDb什么也不做。它只处理参数self::TYPE_DB_INSTALL("安装"(和self::TYPE_DB_UPGRADE("升级"(。
即使您尝试从扩展管理器中卸载扩展,这也只会删除文件。

public function processUninstallPackage($chanName, $package, $cacheObj, $configObj)
{
    $package = $cacheObj->getPackageObject($chanName, $package);
    $contents = $package->getContents();
    $targetPath = rtrim($configObj->magento_root, "''/");
    foreach ($contents as $file) {
        $fileName = basename($file);
        $filePath = dirname($file);
        $dest = $targetPath . DIRECTORY_SEPARATOR . $filePath . DIRECTORY_SEPARATOR . $fileName;
        if(@file_exists($dest)) {
            @unlink($dest);
            $this->removeEmptyDirectory(dirname($dest));
        }
    }
    $destDir = $targetPath . DS . Mage_Connect_Package::PACKAGE_XML_DIR;
    $destFile = $package->getReleaseFilename() . '.xml';
    @unlink($destDir . DS . $destFile);
}

在这些情况下,道德上要做的是在您的扩展中包含一个小的 txt 文件(自述文件或类似的东西(,解释需要从数据库中删除哪些内容才能卸载。如果您可以提供确切的查询,那就更好了。
[编辑] - 丑陋的解决方法
您可以尝试像这样模拟卸载。假设扩展的版本为 1.3.0。创建一个升级文件,该文件的名称upgrade-1.3.0-2.0.0.php实际上包含卸载脚本。对于卸载,只需告诉使用它的人将版本更改为config.xml 2.0.0 .然后,您的升级/卸载脚本将运行,并且仅在此之后删除扩展。