2

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. また、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); 
            }  


    }
4

1 に答える 1

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 にあまり詳しくありませんが、ブラウザーで動作することは知っています。たぶん、この説明はあなたを助けることができます。

于 2013-01-07T18:42:38.310 に答える