通过Varien_Event_Observer访问模型

jam*_*mes 3 magento

我在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;
}
Run Code Online (Sandbox Code Playgroud)

我没有得到任何回报(而不是"约 - 我们"或"启用cookie"或CMS页面具有的任何URL路径).但是,以下代码完全正常:

public function getProductUrl(Varien_Event_Observer $observer)
{
    $baseUrl = $observer->getEvent()->getProduct()->getBaseUrl();
    return $baseUrl;
}
Run Code Online (Sandbox Code Playgroud)

有人能通过观察者告诉我访问CMS页面的正确方法是什么吗?

在此先感谢任何帮助/提示/指示:-)

小智 7

事件cms_page_delete_beforecms_page_save_before在被解雇Mage_Core_Model_Abstract.这就是它在beforeSave函数中的样子:

Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
Run Code Online (Sandbox Code Playgroud)

如您所见,它使用变量_eventPrefix来构造事件键.在CMS页面模型中,将其设置为cms_page.

另请注意该部分$this->_getEventData().这就是将模型(在本例中为CMS页面)传递给观察者的方式:

protected function _getEventData()
{
    return array(
        'data_object'       => $this,
        $this->_eventObject => $this,
    );
}
Run Code Online (Sandbox Code Playgroud)

如您所见,该对象有两个名称,data_object以及在变量中定义的名称_eventObject.在产品模型中,名称设置为product,但在CMS页面模型中,缺少变量.显然,Magento团队忘记了这个,因此,使用核心模型的默认名称:

protected $_eventObject = 'object';
Run Code Online (Sandbox Code Playgroud)

这意味着您可以使用getObject以下方法在观察者中获取CMS页面:

public function myObserver(Varien_Event_Observer $observer)
{
    $page = $observer->getEvent()->getObject();
}
Run Code Online (Sandbox Code Playgroud)