当试图实现一个观察者来捕捉'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类从coreto复制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``andMage_Dataflow_Model_Batch`。
这使我认为,仅在三个班级中的这种遗漏可能不是故意的……
所以:这是一个错误,还是我错了?