1

我会假设每个模型保存后都会发生一个事件。这是如何格式化的,有没有办法记录所有这些事件?

如果您要扩展的模块中没有声明标准事件,这将很有用。

4

5 回答 5

7

我认为最好的答案是基于您提供的所有信息。

  1. 模型不一定需要在保存/编辑/删除时触发事件,但是如果它扩展了 Mage_Core_Model_Abstract 类而不覆盖与保存/编辑/删除关联的默认方法,则将触发事件。

为了使事件对该模型唯一,$this->_eventPrefix 必须对该模型唯一

  1. 记录这些事件通常不起作用

查找您正在寻找的特定事件

如果您使用的是 IDE,这应该会容易得多,但您也可以使用 grep 等实用程序。

  1. 在您正在使用的模块中搜索“$_eventPrefix =”
  2. 使用下面的列表查找适当的事件后缀
  3. 将两者连接在一起,你应该有你的事件

_load_before

_load_after

_save_before

_save_after

_save_commit_after

_delete_before

_delete_after

_delete_commit_after

_清除


要记录所有事件,请转到 app/Mage.php 第 446 行并添加:

Mage::setIsDeveloperMode(true);
Mage::log($name);
于 2013-10-12T18:37:57.167 回答
6

看看Mage_Core_Model_Abstract::afterCommitCallback - 它有一个通用事件一个由正在保存的特定模型的前缀调度的事件。

/**
 * Callback function which called after transaction commit in resource model
 *
 * @return Mage_Core_Model_Abstract
 */
public function afterCommitCallback()
{
    Mage::dispatchEvent('model_save_commit_after', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_commit_after', $this->_getEventData());
    return $this;
}

不管你想要这个还是

/**
 * Processing object after save data
 *
 * @return Mage_Core_Model_Abstract
 */
protected function _afterSave()
{
    $this->cleanModelCache();
    Mage::dispatchEvent('model_save_after', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
    return $this;
}

取决于您在运行事件处理程序时是否关心数据是否已实际写入数据库。

当 Magento 看到对它的调用时Mage::dispatchEvent,它将调用为该特定事件名称注册的任何公共模型类。因此,查找事件的真正位置是在您感兴趣的模块/模型的 config.xml 中。xml 不太可能以编程方式生成,因此您不必大惊小怪地猜测_eventPrefix值。您知道所需的事件后缀,因此只需在配置中查找名称以该后缀结尾的事件即可。

如果您有安装的商店,您可以使用n98-magerun搜索 config.xml。(它有一个 config:get 命令可用于搜索,但我更喜欢config:dump文件,然后使用 xml 解析器和 xpath 搜索结果。)

于 2013-10-12T03:18:34.003 回答
1

我总是把日志放进app/Mage.phpdispatchEvent() method

...
Mage::log($name, array_keys($event_data));
...

然后我在需要应用自定义事件操作的浏览器中刷新页面,然后查看 system.log 以查看我的页面上发生了哪些事件。

于 2013-10-12T12:17:47.713 回答
0

只需在 config.xml 中添加如下内容:

    <global>
    <events>
        <catalog_entity_attribute_save_commit_after>
            <observers>
                <yourextension_save_commit_after_observer>
                    <type>singleton</type>
                    <class>yourextension/save_commit_after_observer</class>
                    <method>yourMethod</method>
                </yourextension_save_commit_after_observer>
            </observers>
        </catalog_entity_attribute_save_commit_after>
    </events>
</global>
于 2013-10-12T04:33:33.450 回答
0

这是正确的。每次模型保存后都有一个_save_before和_save_after事件,如catalog_product_before_save、catalog_product_after_save、customer_address_before_save、customer_address_after_save等。

您可以参考下面的此链接以获取有关如何使用它的更完整信息以及 Magento 中所有事件的完整列表。

来源:http ://www.vjtemplates.com/blog/magento/events-and-observers

于 2013-10-12T14:40:22.843 回答