-
12-12-2019 - |
题
我已经延长了 Mage_Catalog_Model_Category_Attribute_Source_Mode
(以及它的资源模型)添加两种新模式 display_mode
类别的值。现在我想在保存类别时验证该属性的值。具体来说,我想确保 is_anchor
当我选择两种新模式中的任何一种时,始终设置为“否”。
问题是两者都没有 Mage_Eav_Model_Entity_Attribute_Backend_Abstract::beforeSave
也不 Mage_Eav_Model_Entity_Attribute_Backend_Abstract::validate
调度我可以监听的任何事件。
Mage_Catalog_Model_Category
也没有 _beforeSave
方法。
如何在保存时验证类别属性?谢谢!
解决方案
实际上 Mage_Catalog_Model_Category
确实拥有该事件 _beforeSave()
. 。为了看到这一点,你需要睁大眼睛看着那个班级:)
Mage_Catalog_Model_Category
直接不定义 _beforeSave
. 。但是你可以看到,这个类继承自另一个类 Mage_Catalog_Model_Abstract
并且它确实拥有 _beforeSave
. 。看起来像这样
protected function _beforeSave()
{
$this->unlockAttributes();
return parent::_beforeSave();
}
可以看到,这个类又调用了它的父类。那个父类只不过是 Mage_Core_Model_Abstract
. 。在那里你可以看到 _beforeSave
像这样定义。
protected function _beforeSave()
{
if (!$this->getId()) {
$this->isObjectNew(true);
}
Mage::dispatchEvent('model_save_before', array('object'=>$this));
Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
return $this;
}
该函数调度两个事件。第二个在这里很重要。你可以看到,它使用了一个 event prefix
在那次事件中。现在看一下 Mage_Catalog_Model_Category
. 。你可以看到,它实际上在那里定义了一个事件前缀。
protected $_eventPrefix = 'catalog_category';
这意味着, 每当类别部分尝试保存时, _beforeSave
方法生成一个具有名称的唯一事件 catalog_category_save_before
. 我认为,您可以使用该事件来保存任何类别属性
希望有帮助