Magento Observer产生错误,Magento区域令人困惑

时间:2012-10-31 11:50:28

标签: magento observers

我制作了controller_front_init_routers事件观察者,它从REST服务中检索数据以构建菜单。 一切都很好,直到我发现观察者在后端产生错误(例如无法保存产品)以及其他服务。 我正在努力争取任何结论,所以我提出了一些讯问。

  1. 我试图创造条件以触发我的观察者 我们只在前端的方法。但是Magento认为我们是 总是在前端区域。
  2.   

    (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. 谁见过这样的问题?

    5. 我在Magento ver工作。 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 个答案:

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

我对Magento的新REST api并不是非常熟悉,但我知道它在浏览器中有效。也许这个解释可以帮助你。