2012-03-13 65 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的解决方案,以拯救指定是否要应用仅前端或后端仅观察者。