簡體   English   中英

Magento請求 - 前端還是后端?

[英]Magento Request - Frontend or Backend?

如何判斷當前請求是針對后端還是后端頁面? 此檢查將在觀察者內部完成,因此如果有幫助,我可以訪問請求對象。

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

這是沒有好答案的領域之一。 Magento本身不為此信息提供顯式方法/ API,因此對於任何解決方案,您都需要檢查環境並推斷事物。

我在用

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

有一段時間了,但事實證明,某些管理頁面(Magento Connect Package Manager)並非如此。 由於某種原因,此頁面顯式將商店標識設置為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
}

這樣,當您在管理檢查邏輯中發現漏洞時,您可以在一個集中位置更正所有內容。

如果您能夠使用觀察者,則可以將其限制為“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>

看看你想要使用的Mage/Core/Model/Store.php中的方法:

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

和這個結合

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

充當后備,其中商店ID未按預期設置(Magento連接等)

我喜歡嗶嗶邏輯的答案 - 它在觀察者的背景下是有意義的。 我也很喜歡Alan的觀點,即無法知道所有上下文中的管理狀態,這是“管理員”的一個功能,它是在應用程序和前端控制器初始化后輸入的狀態。

Magento的管理狀態是從控制調度到管理動作控制器有效創建的; 請參閱Mage_Adminhtml_Controller_Action::preDispatch() 這是觸發adminhtml_controller_action_predispatch_start事件的方法,該事件由Mage_Adminhtml_Model_Observer::bindStore() ,這是管理存儲最初“設置”的位置。 實際上,觀察者配置區域(adminhtml vs frontend)“工作”因為主要的動作控制器類 - 請參閱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; dr :使用觀察者,甚至使用相同的觀察者模型,但通過指定不同的調用方法來傳遞上下文。

HTH。

編輯 :使用beep logic的config作為起​​點添加了示例代碼

無論我是否錯誤(但我已經測試過),一些事件(如controller_front_init_before)只能在全局節點內覆蓋。 因此,此覆蓋將影響前端和后端。

然后來看看Alan和Benmark的救援解決方案,以指定是否只在前端或后端應用觀察者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM