每个模型保存后的事件

时间:2013-10-12 03:00:35

标签: magento

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

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

5 个答案:

答案 0 :(得分: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不太可能以编程方式生成,因此您不必大惊小怪地猜测{{1} }值。您知道所需的事件后缀,因此只需查看名称以该后缀结尾的事件的配置。

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

答案 1 :(得分:6)

以下是我认为最佳答案将基于您提供的所有信息。

  1. 模型不一定需要在保存/编辑/删除时触发事件,但是如果它扩展了Mage_Core_Model_Abstract类而没有覆盖与save / edit / delete相关联的默认方法,则会触发事件。
  2. 为了使某个事件对该模型唯一,$ this-> _eventPrefix必须对该模型唯一

    1. 记录这些事件通常不起作用
    2. 查找您要查找的特定事件

      如果您使用IDE,这应该更容易,但您也可以使用grep等实用程序。

      1. 在您使用“$ _eventPrefix =”
      2. 的模块中进行搜索
      3. 使用下面的列表查找相应的事件后缀
      4. 将两者连接在一起,你应该举办活动

      5. _load_before

        _load_after

        _save_before

        _save_after

        _save_commit_after

        _delete_before

        _delete_after

        _delete_commit_after

        _clear


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

        Mage::setIsDeveloperMode(true);
        Mage::log($name);
        

答案 2 :(得分:1)

我总是将app/Mage.php的日志记录到dispatchEvent() method

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

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

答案 3 :(得分: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>

答案 4 :(得分: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