每个模型保存后的事件

aja*_*olf 1 magento

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

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

koj*_*iro 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;
}
Run Code Online (Sandbox Code Playgroud)

无论你想要这个还是

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


aja*_*olf 6

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

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

为了使事件对该模型唯一,这个 - > _ 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);
Run Code Online (Sandbox Code Playgroud)