通过Varien_Event_Observer访问模型

时间:2012-01-22 17:02:36

标签: 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;
}

我没有得到任何回复(而不是“关于我们”或“启用cookie”或CMS页面具有的任何URL路径)。但是,以下代码完全正常:

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

有人可以通过观察员告诉我访问CMS页面的正确方法吗?

提前感谢任何帮助/提示/指示: - )

1 个答案:

答案 0 :(得分: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();
}