tpi*_*apw 5 magento magento-1.7
当试图实现观察者以捕获'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;
}
Run Code Online (Sandbox Code Playgroud)
在Mage_CatalogInventory_Model_Stock_Item:
protected function _beforeSave()
{
//...some other stuff, but no parent::_beforeSave()!
return $this;
}
Run Code Online (Sandbox Code Playgroud)
虽然我很新的Magento的,这看起来怪我,在这延长许多其他Magento的类别看尤其是Mage_Core_Model_Abstract,覆盖_beforeSave()的方法,但做呼叫parent::_beforeSave()(以各种方式,如可以在下面的例子中可以看出).
例如,在Mage_Catalog_Model_Product:
protected function _beforeSave()
{
//...
parent::_beforeSave();
//no return in this one!
}
Run Code Online (Sandbox Code Playgroud)
在Mage_Catalog_Model_Product_Compare_Item:
protected function _beforeSave()
{
parent::_beforeSave();
//...
return $this;
}
Run Code Online (Sandbox Code Playgroud)
或者在Mage_Catalog_Model_Abstract:
protected function _beforeSave()
{
//...
return parent::_beforeSave();
}
Run Code Online (Sandbox Code Playgroud)
等等.
甚至怪异,Mage_CatalogInventory_Model_Stock_Item也覆盖了_afterSave(),但这次确实调用父类的方法:
在Mage_CatalogInventory_Model_Stock_Item:
protected function _afterSave()
{
parent::_afterSave();
//...
return $this;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是(用于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``andMage_Dataflow_Model_Batch`.
这让我觉得只有三个课程的遗漏可能不是故意的......
所以:这是一个错误,还是我错了?
不确定在这种情况下“蛋白酥皮”是什么意思,但这是目标 Mage_Core_Model_Abstract自动触发事件的几个例子之一......
……坏了。
发生这种情况是由于子类在重写时无法调用父模板方法(正如您所提到的),或者是由于无法重写子_eventPrefix类中的方法。对我来说,这似乎一直是一种疏忽,而不是一种意图。
在这种情况下,Mage_CatalogInventory_Model_Stock_Item::_beforeSave()这似乎是一个遗漏。在此类的1.3.2.4 版本中,该方法会重复目标事件逻辑(尽管它省略了 的分派model_save_before)。该文件的1.4.0.0-alpha2 版本看到_eventPrefix已添加该属性,但调用父_beforeSave()方法失败会导致该目标事件丢失。
在这种情况下,我能看到的唯一目的可能是强制开发人员将 CatalogInventory 对象作为stock_item产品保存过程上下文中的属性进行操作,但这需要代码注释。
| 归档时间: |
|
| 查看次数: |
990 次 |
| 最近记录: |