有些情况下你希望禁用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”,事件将不会被执行。 (责任编辑:最模板) |