当你开发你的Magento模块或者通过事件监听做修改时,选对合适的事件是非常重要的。

一个方法是在你的PHP IDE里搜索Magento核心文件“Mage::dispatchEvent(“,结果大概会出现400处。大部分这些方法调用静态字符串作为事件名称,如:

Mage::dispatchEvent('catalog_product_is_salable_before', array('product' => $this));

也有些事件的名字是由一些变量串联到静态字符串组成的,如:

Mage::dispatchEvent($this->_eventPrefix.'_validate_before', array($this->_eventObject=>$this));

在这种情况下,我们不能确定最终的事件名称。由于Magento不允许我们同时观察超过一个事件,我们要想办法得到一个确定需求的所有事件。

如果我们查看app/Mage.php中声明的Mage::dispatchEvent,你可以看到以下代码:

public static function dispatchEvent($name, array $data = array())
    {
        Varien_Profiler::start('DISPATCH EVENT:'.$name);
        $result = self::app()->dispatchEvent($name, $data);
        #$result = self::registry('events')->dispatch($name, $data);
        Varien_Profiler::stop('DISPATCH EVENT:'.$name);
        return $result;
    }

我们不能重写Mage类去添加事件名称抓取功能。Mage::dispatchEvent方法从Mage_Core_Model_App调用dispatchEvent方法。我们也不能重写Mage_Core_Model_App,因为应用程序对象被直接实例化,而不是从Mage::getModel工厂方法。所以,获取指定需求的所有事件名称的唯一方法就是在Mage::dispatchEvent中添加一个简单的硬编码行。我们可以加类似这样的东西:

Mage::log($name, null, 'events.log', true);

它记录需求中被调用的每一个事件的名称。app/Mage.php里的dispatchEvent方法被修改后看起来像是这样的:

public static function dispatchEvent($name, array $data = array())
    {
        // log event name
        Mage::log($name, null, 'events.log', true);
 
        Varien_Profiler::start('DISPATCH EVENT:'.$name);
        $result = self::app()->dispatchEvent($name, $data);
        #$result = self::registry('events')->dispatch($name, $data);
        Varien_Profiler::stop('DISPATCH EVENT:'.$name);
        return $result;
    }

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