Magento,如何以编程方式禁用模块?

时间:2011-06-29 12:29:14

标签: magento module

我的目标是以编程方式禁用模块(例如在某些观察者事件期间)。 我找到的最早的观察者是 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;
    }
}

2 个答案:

答案 0 :(得分:4)

我认为这取决于您要禁用哪种模块。我的文章适用于我想要禁用的模块,但该模块会仔细检查它是否已激活,而大多数模块都没有这样做。

Magento立即加载所有模块配置。创建一个可以监听此过程的模块是不可能的,因为在进程发生时模块不会被加载。这造成了一个悖论。无法阻止使用其他模块加载模块。

因此,您剩下的唯一选择是:

  1. 编辑核心。
  2. 使用设计得更好的模块,并明确允许通过配置选项或方法禁用它们。
  3. 编辑/扩展要禁用的模块,以便在运行时禁用其功能。
  4. 希望这会有所帮助..如果我能帮您找到一种方法来禁用您正在处理的模块,请告诉我。

答案 1 :(得分:3)