Magento Observer генерирует ошибки, а области Magento сбивают с толку

Я сделал controller_front_init_routers наблюдатель события, который извлекает данные из REST Сервис для построения меню. Все было хорошо, пока я не обнаружил, что наблюдатель генерирует ошибки в бэкэнде (например, нет способа сохранить продукты), а также в остальных службах. Я борюсь за любые выводы, поэтому я поднял несколько допросов.

  1. Я попытался создать условие, чтобы активировать методы Observer, только если мы находимся только во внешнем интерфейсе. Но Magento считает, что мы всегда находимся в области интерфейса.

(var_dump (Mage:: app () -> getStore () -> isAdmin ()) всегда возвращает false и то же самое с var_dump(Mage::getDesign()->getArea() == 'adminhtml'))

Can anyone explain what's happened ?
  1. Также одним из решений является размещение наблюдателя событий в области интерфейса в config.xml и загрузить его Mage::app()->loadArea($this->getLayout()->getArea()); но где я должен разместить этот кусок кода? в новом наблюдателе? Это самый подходящий процесс?

  2. Это способ прослушать один раз событие, а затем приостановить слушателя? (как только мое меню зарегистрировано, мне больше не нужно слушать событие)

  3. Является ли использование controller_front_init_routers событие лучший выбор?

  4. Кто нибудь видел такую ​​проблему?

Я работаю над Magento вер. 1.12.0.2

Здесь config.xml

<globals>
....
<events>
<controller_front_init_routers>
<observers>
  <connector_services_observer>
    <type>singleton</type>
    <class>Connector_Services_Model_Observer</class>
      <method>getEvent</method>
       </connector_services_observer>
  </observers>
</controller_front_init_routers>        
</events>
</globals>

Вот функция getEvent в моей модели обозревателя

public function getEvent($observer){

    //model which do post or get requests and return xml and menu
    $_getRest = Mage::getModel('connector_services/RestRequest');
    //the paths
    $_menu_url = Mage::getStoreConfig('connector_service_section/connector_service_url/service_menu_url');
    //put a store config
    $path_nlist = 'veritas-pages-list.xml';

    $_isAdmin = Mage::helper('connector_services');

    $currentUrl=Mage::helper("core/url")->getCurrentUrl();
    //the way I found to trigger methods only in frontend
            //that's not very beautiful I know
        $admin = preg_match("#/admin/#",$currentUrl);
        $api =  preg_match("#/api/#",$currentUrl);
    //
    if ( !$admin && ! $api ){


            $_menuXml = $_getRest->postRequest($_menu_url);

            if( $_menuXml )
            { 
                $_menu = $_getRest->makeMenu($_menuXml);
                Mage::register('menu',$_menu); 
            }  


    }

1 ответ

Вы должны быть в состоянии передать строку запроса остальной службе, подобно тому, как вы просто напечатаете ее в адресной строке. Magento перешлет его наблюдателю, и вы можете использовать его как флаг.

Добавьте что-то вроде следующего в ваш код:

const USE_FRONTEND = 'usefront';

public function getEvent($observer){
    this->request = $observer->getEvent()->getData('front')->getRequest();

    // If the constant is in the query string 
    if ($this->request->{self::USE_FRONTEND}) {
        // Do code related to this request
        die('Frontend flag detected');
    }

}

Звоните на ваш сайт вот так и передайте строку запроса

http://www.yourmagentosite.com/?usefront=true

Я не очень знаком с новым API REST Magento, но я знаю, что он работает в браузере. Может быть, это объяснение может помочь вам.

Другие вопросы по тегам