2012-03-13 19 views
20

現在のリクエストがバックエンドページ用かフロントエンドページ用かをどのように確認できますか?このチェックはオブザーバ内で行われるため、リクエストオブジェクトにアクセスできるようにします。Magentoリクエスト - フロントエンドまたはバックエンド?

私はのチェックを考えましたが、それは非常に信頼できる方法ではないと思います。私はもっ​​と良い解決策を望んでいます。店舗IDは以下のように設定されていない代替として機能するには

Mage::getDesign()->getArea() == 'adminhtml' 

と併せて

Mage::app()->getStore()->isAdmin() 

答えて

55

これは良い答えがない分野の一つです。 Magento自体はこの情報に明示的なメソッド/ APIを提供していないので、どのような解決策であれ、環境を調べて物事を推測する必要があります。

私はしばらくの間、

Mage::app()->getStore()->isAdmin() 

を使用していたが、それは、これは真実ではない、特定の管理ページ(Magentoの接続パッケージマネージャ)があるが判明しました。なんらかの理由でこのページはストアIDを明示的に1に設定し、isAdminをfalseに戻します。この動作を持つ他のページがあるかもしれません

#File: app/code/core/Mage/Connect/controllers/Adminhtml/Extension/CustomController.php 
public function indexAction() 
{ 
    $this->_title($this->__('System')) 
     ->_title($this->__('Magento Connect')) 
     ->_title($this->__('Package Extensions')); 

    Mage::app()->getStore()->setStoreId(1); 
    $this->_forward('edit'); 
} 

もう一つの良い賭けは、設計パッケージの「面積」プロパティをチェックすることです。

これは、管理領域のデザインテンプレートとレイアウトXMLファイルへのパスに影響するため、管理者のページにはあまりオーバーライドされません。かかわらず、あなたは、環境から推測する新しいMagentoのモジュールを作成し、あなたが管理者にしているかどうかを確認する必要があるとき、それに

class Namespace_Modulename_Helper_Isadmin extends Mage_Core_Helper_Abstract 
{ 
    public function isAdmin() 
    { 
     if(Mage::app()->getStore()->isAdmin()) 
     { 
      return true; 
     } 

     if(Mage::getDesign()->getArea() == 'adminhtml') 
     { 
      return true; 
     } 

     return false; 
    } 
} 

をヘルパークラスを追加し、使用することを選択したものの

このヘルパー

if(Mage::helper('modulename/isadmin')->isAdmin()) 
{ 
    //do the thing about the admin thing 
} 

この方法では、とき/あなたは管理者のチェックロジックの穴を発見した場合、あなたは1つの集中の場所ですべてを修正することができます。

+0

アラン情報ありがとう!私は実際にこれを使用して[IE9修正](http://alanstorm.com/ie9_fix_for_magento)をカスタマイズしています。これは、デザイナーのフロントエンドにいくつかの問題を引き起こしていたためです。それは完全に管理領域で動作するので、その解決策も出てくれてありがとう:) –

+0

小さな世界!また、以下のビープロジックの答えはおそらくあなたの最善の賭けです** **もしあなたの解決策を尋ねるなら。 (管理者側でのみイベントを発生させたい場合)。フロントエンドとバックエンドの両方で作業する単一のオブザーバがあれば、上記は良いスタートです。 –

+0

これは、スクリプトがバックエンドで実行されているかどうかをチェックしませんが、管理者がログインしている場合はチェックされません... – feeela

10

は、あなたが使用したいと思うMage/Core/Model/Store.php内部のメソッドを見てくださいあなたは期待している(Magento接続など)

+0

私はそれが何か簡単だろうと知っていました:Pあなたの助けてくれてありがとう! –

+0

@Colinそれはすべてをキャッチしません。 –

14

オブザーバーを使用できる場合は、「adminhtml」イベントエリアに制限することができます。

<config> 
... 
    <adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
     <observers> 
      <mynamespace_mymodule_html_before> 
      <type>singleton</type> 
      <class>mynamespace_mymodule/observer</class> 
      <method>adminPrepareLayoutBefore</method> 
      </mynamespace_mymodule_html_before> 
     </observers> 
     </core_block_abstract_prepare_layout_after> 
    </events> 
    </adminhtml> 
</config> 
5

私はビープロジックの答えが好きです。オブザーバーの文脈では意味があります。私はまた、アプリケーションとフロントコントローラが初期化された後に入力される状態である「管理者」の機能である、すべてのコンテキストで管理状態を知る方法がないというAlanの点が好きです。

Magentoの管理状態は、コントロールディスパッチから管理アクションコントローラに効率的に作成されます。 Mage_Adminhtml_Controller_Action::preDispatch()を参照してください。これは、Mage_Adminhtml_Model_Observer::bindStore()によって消費されるadminhtml_controller_action_predispatch_startイベントを起動するメソッドです。これは、管理ストアが最初に "設定"されている場所です。実際には、メインアクションコントローラクラスのため、オブザーバ構成領域(adminhtmlとフロントエンド)は "動作"します。は表示されません。Mage::app()->loadArea($this->getLayout()->getArea()); - adminhtmlプレディスパッチで領域情報が設定されています。

どのようにスライスしても、非常に多くのコンテキスト(イベントオブザーバシステムほど高いレベルであっても)に依存する管理者の動作は、コマンド制御構造に依存します。あなたのオブザーバーの定義では

<config> 
    <!-- ... --> 
    <adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
     <observers> 
      <mynamespace_mymodule_html_after> 
      <type>singleton</type> 
      <class>mynamespace_mymodule/observer</class> 
      <method>adminPrepareLayoutAfter</method> 
      </mynamespace_mymodule_html_after> 
     </observers> 
     </core_block_abstract_prepare_layout_after> 
    </events> 
    </adminhtml> 
    <frontend> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
     <observers> 
      <mynamespace_mymodule_html_after> 
      <type>singleton</type> 
      <class>mynamespace_mymodule/observer</class> 
      <method>frontendPrepareLayoutAfter</method> 
      </mynamespace_mymodule_html_after> 
     </observers> 
     </core_block_abstract_prepare_layout_after> 
    </events> 
    </frontend> 
</config> 

class Mynamepace_Mymodule_Model_Observer 
{ 
    public function adminPrepareLayoutAfter() 
    { 
     $this->_prepareLayoutAfter('admin'); 
    } 

    public function frontendPrepareLayoutAfter() 
    { 
     $this->_prepareLayoutAfter('frontend'); 
    } 

    protected function _prepareLayoutAfter($area) 
    { 
     switch($area){ 
      case 'admin': 
       // do admin things 
       break; 

      case 'frontend': 
       // do frontend things 
       break; 

      default: 
       // i'm a moron 
     } 
    } 
} 

TL; DR:でも同じオブザーバモデルを使用して、オブザーバを使用しますが、別の呼び出し方法を指定することで、コンテキストを渡します。

HTH。

編集は:私が間違っているか、いない(しかし、私はそれをテストした)かどうかの出発点

0

としてビープロジックのconfigを使用したサンプルコードを追加し、(controller_front_init_beforeのような)一部のイベントは、内側だけを上書きすることができますグローバルノード。その結果、このオーバーライドはフロントエンドとバックエンドの両方に影響します。

アランとベンマークのソリューションを救助に来て、オブザーバをフロントエンドだけに適用するのか、バックエンドだけに適用するのかを指定します。

関連する問題