我的目标是以编程方式禁用模块(例如在某些观察者事件期间)。 我找到的最早的观察者是 controller_front_init_before 。
所以我的模块正在听它,然后执行下一步:
Mage::getConfig()->getModuleConfig('IG_LightBox')->active=(string)'false';
但是所选模块在每个页面上仍处于活动状态。
我也试过这种方法(相同但不同的方式):
Mage::getConfig()->getNode('modules/IG_LightBox')->active=(string)'false';
此外,我尝试重新启动配置,再次尝试loadModules,但两者都没有帮助。
Mage::getConfig()->loadModules(); // won't help
Mage::getConfig()->reinit(); // won't help
是否可以通过编程方式禁用模块?
更新1 。 该解决方案完美适用于后端。 active = false确实禁用了模块,但我也需要它用于前端。所以我继续搜索。
更新2 app / Mage.php中有两个方法,称为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;
}
}
答案 0 :(得分:4)
我认为这取决于您要禁用哪种模块。我的文章适用于我想要禁用的模块,但该模块会仔细检查它是否已激活,而大多数模块都没有这样做。
Magento立即加载所有模块配置。创建一个可以监听此过程的模块是不可能的,因为在进程发生时模块不会被加载。这造成了一个悖论。无法阻止使用其他模块加载模块。
因此,您剩下的唯一选择是:
希望这会有所帮助..如果我能帮您找到一种方法来禁用您正在处理的模块,请告诉我。
答案 1 :(得分:3)