有些情况下你希望禁用Magento事件。例如,在一个我们的项目中,我们决定禁用所有的“Mage_Log”事件来减少数据库的sql查询。我们将在这篇文章中描述我们是怎么做的,但我相信这个方法可以在很多场景中应用。

Magento事件是怎么定义的呢?例如,你到Magento模型“Mage_Log”config.xml文件中,你会发现下一个内容在“events”标签里。

“Events”标签包含子事件,你可以看config.xml文件中的块。

<frontend>
	<events>
            <controller_action_predispatch>
                <observers>
                    <log>
                        <class>log/visitor</class>
                        <method>initByRequest</method>
                    </log>
                </observers>
            </controller_action_predispatch>
            .... other events
        </events>
</frontend>

例如,如果你想要禁用 “controller_action_predispatch” 事件,你需要创建自己的模型并将它放到你的config.xml文件中。

<frontend>
	<events>
		<controller_action_predispatch>
			<observers><log><type>disabled</type></log></observers>
		</controller_action_predispatch>
	</events>
</frontend>

也许你注意到了,我们添加值为“disable“的“type”标签。进入Magento类 “Mage_Core_Model_App” ,在“dispatchEvent”方法中,你将看到:

 foreach ($events[$eventName]['observers'] as $obsName=>$obs) {
                $observer->setData(array('event'=>$event));
                Varien_Profiler::start('OBSERVER: '.$obsName);
                switch ($obs['type']) {
                    case 'disabled': // if we set disabled type, event will not be executed.
                        break;
                    case 'object': case 'model':
                        $method = $obs['method'];
                        $observer->addData($args);
                        $object = Mage::getModel($obs['model']);
                        $this->_callObserverMethod($object, $method, $observer);
                        break;
                    default:
                        $method = $obs['method'];
                        $observer->addData($args);
                        $object = Mage::getSingleton($obs['model']);
                        $this->_callObserverMethod($object, $method, $observer);
                        break;
                }
                Varien_Profiler::stop('OBSERVER: '.$obsName);
            }

如果设置事件type为“disabled”,事件将不会被执行。

360magento提供专业的基于magento系统的电商网站开发服务,如有需求或相关咨询,请与我们联系