我在Magento 1.6.2.0中有一个自定义观察者,在保存或删除CMS页面时调用它(事件cms_page_delete_before / cms_page_save_before)。我已经验证(使用Mage :: log())观察者正在工作,但是当我尝试以下内容时:
public function getCmsUrl(Varien_Event_Observer $observer)
{
$url = $observer->getEvent()->getPage()->getIdentifier();
return $url;
}
我没有得到任何回复(而不是“关于我们”或“启用cookie”或CMS页面具有的任何URL路径)。但是,以下代码完全正常:
public function getProductUrl(Varien_Event_Observer $observer)
{
$baseUrl = $observer->getEvent()->getProduct()->getBaseUrl();
return $baseUrl;
}
有人可以通过观察员告诉我访问CMS页面的正确方法吗?
提前感谢任何帮助/提示/指示: - )
答案 0 :(得分:7)
事件cms_page_delete_before
和cms_page_save_before
会在Mage_Core_Model_Abstract
中触发。这就是它在beforeSave
函数中的样子:
Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
如您所见,它使用变量_eventPrefix
来构造事件键。在CMS页面模型中,此设置为cms_page
。
另请注意部分$this->_getEventData()
。这就是模型(在本例中为CMS页面)传递给观察者的方式:
protected function _getEventData()
{
return array(
'data_object' => $this,
$this->_eventObject => $this,
);
}
如您所见,该对象有两个名称data_object
和一个在变量_eventObject
中定义的名称。在产品模型中,名称设置为product
,但在CMS页面模型中,缺少变量。显然,Magento团队忘记了这个,因此,使用核心模型的默认名称:
protected $_eventObject = 'object';
这意味着您可以使用getObject
:
public function myObserver(Varien_Event_Observer $observer)
{
$page = $observer->getEvent()->getObject();
}