在尝试实现观察者以捕获'cataloginventory_stock_item_save_before'
事件时,我意识到_beforeSave()
中的Mage_CatalogInventory_Model_Stock_Item
方法会覆盖Mage_Core_Model_Abstract
不调用其父,从而阻止系统调度通常的'model_save_before'
和$this->_eventPrefix.'_save_before'
事件......
在Mage_Core_Model_Abstract
:
protected function _beforeSave()
{
//...
Mage::dispatchEvent('model_save_before', array('object'=>$this));
Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
return $this;
}
在Mage_CatalogInventory_Model_Stock_Item
:
protected function _beforeSave()
{
//...some other stuff, but no parent::_beforeSave()!
return $this;
}
虽然我对Magento很新,但这对我来说很奇怪,特别是在查看扩展Mage_Core_Model_Abstract
的许多其他Magento类时,覆盖_beforeSave()
方法,但做 call parent::_beforeSave()
(以各种方式,如以下示例所示)。
例如,在Mage_Catalog_Model_Product
:
protected function _beforeSave()
{
//...
parent::_beforeSave();
//no return in this one!
}
在Mage_Catalog_Model_Product_Compare_Item
:
protected function _beforeSave()
{
parent::_beforeSave();
//...
return $this;
}
或Mage_Catalog_Model_Abstract
:
protected function _beforeSave()
{
//...
return parent::_beforeSave();
}
等
即使更奇怪,Mage_CatalogInventory_Model_Stock_Item
也会覆盖_afterSave()
,但这次会调用父方法:
在Mage_CatalogInventory_Model_Stock_Item
:
protected function _afterSave()
{
parent::_afterSave();
//...
return $this;
}
我的问题是(打算用于那里的Magento大师):
您是否了解在parent::_beforeSave()
中遗漏Mage_CatalogInventory_Model_Stock_Item
是否有任何充分理由?
或者它应该被列为错误?
为了能够捕获'cataloginventory_stock_item_save_before'
个事件,我想到的唯一解决方法是将整个Mage_CatalogInventory_Model_Stock_Item
课程从core
复制到local
,并且将通话添加到parent::_beforeSave()
,或直接发送到Mage::dispatchEvent('cataloginventory_stock_item_save_before', ...)
这个解决方案不是一个糟糕的黑客吗?
在Mage_Core_Model_Abstract
的许多其他直接后代中搜索过(仅凭好奇心),我发现与Mage_CatalogInventory_Model_Stock_Item
一起,只有两个其他子类共享相同的问题,至少就此而言关注_beforeSave()
方法(我还没有检查过_afterSave
等其他基本事件):Mage_XmlConnect_Model_Application``and
Mage_Dataflow_Model_Batch`。
这让我觉得只有三个课程的遗漏可能不是故意的......
所以:这是一个错误,还是我错了?
答案 0 :(得分:4)
在此上下文中不确定“meringue”的含义,但这是目标 Mage_Core_Model_Abstract
自动触发事件的几个示例之一...
......被打破了。
这是由于子类在重写时(如您所述)调用父模板方法失败或由于未能覆盖子类中的_eventPrefix
而导致的。对我来说,这似乎总是一种疏忽而不是一种意图。
在Mage_CatalogInventory_Model_Stock_Item::_beforeSave()
的情况下,这似乎是一个遗漏。通过此类的1.3.2.4 version,该方法复制了目标事件逻辑(尽管它省略了model_save_before
的分派)。此文件的1.4.0.0-alpha2 version会看到添加的_eventPrefix
属性,但无法调用父_beforeSave()
方法会导致此目标事件丢失。
我在这个实例中可以看到的唯一目的可能是强制开发人员在产品保存过程的上下文中操作cataloginventory对象作为stock_item
属性,但这值得代码注释。 / p>