2012-01-22 98 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

相關問題