Пытаясь реализовать наблюдатель для перехвата событий 'cataloginventory_stock_item_save_before'
, я понял, что метод _beforeSave()
в Mage_CatalogInventory_Model_Stock_Item
переопределяет метод Mage_Core_Model_Abstract
без вызова его родителя, тем самым не позволяя системе отправлять обычные 'model_save_before'
и $this->_eventPrefix.'_save_before'
события...
In 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;
}
In Mage_CatalogInventory_Model_Stock_Item
:
protected function _beforeSave()
{
//...some other stuff, but no parent::_beforeSave()!
return $this;
}
Хотя я очень новичок в Magento, это выглядит странно для меня, особенно когда я смотрю на многие другие классы Magento, которые расширяют Mage_Core_Model_Abstract
, переопределяют метод _beforeSave()
, но делают вызов parent::_beforeSave()
(по-разному, как и можно увидеть на следующих примерах).
Например, в Mage_Catalog_Model_Product
:
protected function _beforeSave()
{
//...
parent::_beforeSave();
//no return in this one!
}
In Mage_Catalog_Model_Product_Compare_Item
:
protected function _beforeSave()
{
parent::_beforeSave();
//...
return $this;
}
Or in Mage_Catalog_Model_Abstract
:
protected function _beforeSave()
{
//...
return parent::_beforeSave();
}
И т.п.
Что еще более странно, Mage_CatalogInventory_Model_Stock_Item
также переопределяет _afterSave()
, но на этот раз вызывает метод родителя:
In 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`.
Что наводит меня на мысль, что это упущение только в трех классах могло быть сделано непреднамеренно...
Итак: это баг или я ошибаюсь?