2012-03-13 108 views
20

如何判斷當前請求是否用於後端或前端頁面?這個檢查將在觀察者內完成,所以如果有幫助的話,我確實可以訪問請求對象。Magento請求 - 前端還是後端?

我認爲檢查Mage::getSingleton('admin/session')->getUser()但我不認爲這是一個非常可靠的方法。我希望有更好的解決方案。

回答

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 
} 

這樣,當/如果你發現在你的管理員檢查邏輯孔,可以糾正在一個集中的地方的一切。

+0

感謝您的信息艾倫!實際上,我用這個自定義[您IE9修復(http://alanstorm.com/ie9_fix_for_magento),因爲它導致對前端爲我們的設計師的一些問題。它在管理區域完美運作,所以感謝您提出解決方案:) – 2012-03-14 14:53:39

+0

小世界!此外,下面的嘟嘟邏輯的答案可能是您最好的選擇**如果**它與您的解決方案一起玩。 (即如果你只想在管理員端激活你的事件)。如果你有一位觀察者在前端和後端做事情,那麼上述是一個好的開始。 – 2012-03-14 18:08:44

+0

好了,不檢查一個腳本在後臺運行,但如果有一個管理員登錄... – feeela 2012-06-15 13:09:19

10

看一看裏面Mage/Core/Model/Store.php的方法,你需要使用:

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

在結合

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

要充當了店鋪ID沒有被設置爲備用你期望(Magento連接等)

+0

我知道這將是一些簡單:對你有所幫助P謝謝! – 2012-03-13 23:16:47

+0

@Colin這不會抓住一切。 – 2012-03-13 23:30:10

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()。這是觸發adminhtml_controller_action_predispatch_start事件的方法,該事件由Mage_Adminhtml_Model_Observer::bindStore()消耗,這是管理存儲最初「設置」的地方。事實上,觀察者配置區域(adminhtml VS前端)「作品」,因爲主要動作控制器類的 - 見Mage_Core_Controller_Varien_Action::preDispatch(),特別是Mage::app()->loadArea($this->getLayout()->getArea()); - 只需要注意的佈局對象在adminhtml predispatch設置它的區域的信息。

不管你如何切它,我們賴以在如此衆多的環境管理行爲 - 甚至一些高層次的事件觀察系統 - 依賴於指揮控制結構。

<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;博士:使用一個觀察者,甚至使用相同的觀察者模式,而是通過指定不同的調用方法的背景下通過。

HTH。

編輯:使用蜂鳴邏輯的配置爲出發點

0

不管我是不是錯了(不過我測試過它),有些事件(如controller_front_init_before)只能覆蓋裏面添加示例代碼全局節點。結果,這個覆蓋會影響前端和後端。

然後來到艾倫和benmark的解決方案,以拯救指定是否要應用僅前端或後端僅觀察者。