Доступ к модели через Varien_Event_Observer - PullRequest
3 голосов
/ 22 января 2012

У меня есть пользовательский наблюдатель в 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;
}

Я ничего не получаю (вместо "about-us", "enable-cookies" или любого другого пути URL, который есть на странице CMS). Следующий код, однако, прекрасно работает:

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

Может ли кто-нибудь сообщить мне, каков правильный способ доступа к странице CMS при прохождении через наблюдателя?

Заранее спасибо за любую помощь / советы / указатели: -)

1 Ответ

7 голосов
/ 22 января 2012

События 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';

Это означает, что вы можете получить страницу CMS в своем наблюдателе, используя getObject:

public function myObserver(Varien_Event_Observer $observer)
{
    $page = $observer->getEvent()->getObject();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...