我对 magento 扩展开发真的很陌生。我向其他人学习并为 magento 1.7.0 扩展创建了一个简单的演示。它运行良好,在其安装脚本中,我向“catalog_product”添加了一个属性,它也在运行。
现在我想知道,当这个扩展从系统中删除,或者从系统中卸载时,我该如何删除这个属性,如何编写代码来处理卸载?谢谢。
我对 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;
}
即使您在脚本中手动调用它,它也不会做任何事情,因为_modifyResourceDb
当第一个参数是self::TYPE_DB_UNINSTALL
('uninstall') 时,它内部调用的方法什么也不做。它只处理参数self::TYPE_DB_INSTALL
('install')和self::TYPE_DB_UPGRADE
('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
. 然后您的升级/卸载脚本将运行,然后才删除扩展。