2012-01-22 44 views
3

我在保存或删除CMS页面(事件cms_page_delete_before/cms_page_save_before)时调用的Magento 1.6.2.0中有一个自定义观察者。我已经验证(使用法师::日志())观察者的工作,但是当我尝试以下方法:通过Varien_Event_Observer访问模型

public function getCmsUrl(Varien_Event_Observer $observer) 
{ 
    $url = $observer->getEvent()->getPage()->getIdentifier(); 
    return $url; 
} 

我什么也没得到恢复(而不是“关于美”或“启用曲奇”或CMS页面的任何URL路径)。下面的代码,但是,工作完全正常:

public function getProductUrl(Varien_Event_Observer $observer) 
{ 
    $baseUrl = $observer->getEvent()->getProduct()->getBaseUrl(); 
    return $baseUrl; 
} 

有人可以让我知道什么访问CMS页面的正确方式,当通过观察者通过的?提前为任何帮助/提示/指针:-)

回答

7

事件cms_page_delete_beforecms_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得到您的观察员CMS页面:

public function myObserver(Varien_Event_Observer $observer) 
{ 
    $page = $observer->getEvent()->getObject(); 
} 
+0

感谢您的帮助!我从那以后学会了在其他事件上运用你的技巧。我还发现get_class_methods()帮助我了解发生了什么。 – james

相关问题