Magento请求 - 前端还是后端?

Col*_*ell 22 php magento magento-1.x

如何判断当前请求是针对后端还是后端页面?此检查将在观察者内部完成,因此如果有帮助,我可以访问请求对象.

我考虑过检查,Mage::getSingleton('admin/session')->getUser()但我不认为这是一种非常可靠的方法.我希望有更好的解决方案.

Ala*_*orm 59

这是没有好答案的领域之一.Magento本身不为此信息提供显式方法/ API,因此对于任何解决方案,您都需要检查环境并推断事物.

我在用

Mage::app()->getStore()->isAdmin()
Run Code Online (Sandbox Code Playgroud)

有一段时间了,但事实证明,某些管理页面(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');
}
Run Code Online (Sandbox Code Playgroud)

可能有其他页面出现此行为,

另一个好的选择是检查设计包的"区域"属性.

对于管理员中的页面,这似乎不太可能被覆盖,因为该区域会影响管理区域设计模板和布局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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,只要您需要检查是否在管理员中,请使用此帮助程序

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

这样,当您在管理检查逻辑中发现漏洞时,您可以在一个集中位置更正所有内容.


bee*_*gic 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>
Run Code Online (Sandbox Code Playgroud)


Ben*_*ssi 11

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

Mage::app()->getStore()->isAdmin()
Run Code Online (Sandbox Code Playgroud)

和这个结合

Mage::getDesign()->getArea() == 'adminhtml'
Run Code Online (Sandbox Code Playgroud)

充当后备,其中商店ID未按预期设置(Magento连接等)


ben*_*rks 5

我喜欢哔哔逻辑的答案 - 它在观察者的背景下是有意义的.我也很喜欢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>
Run Code Online (Sandbox Code Playgroud)

在你的观察者定义中:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

tl; dr:使用观察者,甚至使用相同的观察者模型,但通过指定不同的调用方法传递上下文.

HTH.

编辑:使用beep logic的config作为起​​点添加了示例代码