我的目标是以编程方式禁用该模块(例如在某些观察者事件期间)。 我发现的最早的观察者是controller_front_init_before。
所以我的模块正在监听它,然后执行下一步:
Mage::getConfig()->getModuleConfig('IG_LightBox')->active=(string)'false';
但是所选模块在每个页面上仍然处于事件状态。
我也尝试了这种方法(相同但方式不同):
Mage::getConfig()->getNode('modules/IG_LightBox')->active=(string)'false';
我还尝试重新初始化配置并再次加载模块,但两者都没有帮助。
Mage::getConfig()->loadModules(); // won't help
Mage::getConfig()->reinit(); // won't help
是否可以通过编程方式禁用该模块?
更新 1。 该解决方案非常适合后端。 active=false 确实禁用了该模块,但我也需要它用于前端。所以我继续寻找。
更新2 app/Mage.php 中有 2 个方法,称为 init 和 initSpecified,它们允许仅使用选定数量的模块运行 Magento。但这些方法在默认流程中不会被调用。
更新3 我们可以使用一个观察者事件来动态激活或停用支付模块。它称为 payment_method_is_active。此代码示例使支票汇票付款方式不活动:
public function payment_method_is_active(Varien_Event_Observer $observer)
{
if($observer->getMethodInstance()->getCode()=='checkmo')
{
$observer->getResult()->isAvailable=false;
}
}
最佳答案
我认为这取决于您要禁用哪种模块。我的文章适用于我想要禁用的模块,但该模块会仔细检查它是否已激活,而大多数模块不会这样做。
Magento 立即加载所有模块配置。不可能创建一个监听此进程的模块,因为在该进程发生时该模块尚未加载。这就产生了一个悖论。不可能阻止一个模块使用另一个模块加载。
因此,您剩下的唯一选择是:
- 编辑核心。
- 使用设计更好并明确允许通过配置选项或方法禁用自身的模块。
- 编辑/扩展您要禁用的模块,以便您可以在运行时禁用其功能。
希望这会有所帮助..如果我可以帮助您找到一种方法来禁用您正在处理的模块,请告诉我。
关于Magento,如何以编程方式禁用模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520634/