当试图实现一个观察者来捕捉'cataloginventory_stock_item_save_before'
事件时,我开始意识到,在不调用其 parent_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
、覆盖_beforeSave()
方法但确实调用的 Magento 类时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 大师):您是否了解省略in
是否有任何充分的理由?
还是应该将其列为错误?parent::_beforeSave()
Mage_CatalogInventory_Model_Stock_Item
为了能够捕获'cataloginventory_stock_item_save_before'
事件,我想到的唯一解决方法是将整个Mage_CatalogInventory_Model_Stock_Item
类从core
to复制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`。
这使我认为,仅在三个班级中的这种遗漏可能不是故意的……
所以:这是一个错误,还是我错了?