문제

현재 요청이 백엔드 또는 프론트 엔드 페이지의 경우 어떻게 알 수 있습니까?이 검사는 옵저버 내에서 수행되므로 도움이되는 경우 요청 객체에 액세스 할 수 있습니다.

Mage::getSingleton('admin/session')->getUser()를 확인하는 것으로 간주하지만 매우 신뢰할 수있는 방법이라고 생각하지 않습니다.나는 더 나은 해결책을 원한다.

도움이 되었습니까?

해결책

이것은 좋은 대답이없는 해당 지역 중 하나입니다. Magento 자체는이 정보에 대해 명시적인 방법 / API를 제공하지 않으므로 환경을 조사하고 사물을 추론하는 데 필요한 모든 솔루션을 사용하십시오.

i

를 사용 중입니다.
Mage::app()->getStore()->isAdmin()
.

잠시 동안이지만, 이는 사실이 아닌 특정 관리 페이지 (Magento Connect Package Manager)가 있습니다. 어떤 이유로이 페이지에서는 Store 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
}
.

이 방법으로, 관리자 검사 논리에서 구멍을 발견하면 하나의 중앙 집중식 장소에서 모든 것을 수정할 수 있습니다.

다른 팁

옵저버를 사용할 수있는 경우 '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가 기대되는 것처럼 저장되지 않은 대체 역할을합니다 (마젠토 연결 등)

나는 비프 논리의 답변을 좋아한다 - 관찰자의 맥락에서 의미가있다. 또한 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와 같은)는 글로벌 노드 내부에서만 덮어 쓸 수 있습니다.결과적 으로이 오버라이드는 프론트 엔드와 백엔드 모두에 영향을 미칩니다.

는 Frontend 전용 또는 백엔드 만 Obseverver에 Obseverver를 적용하려는 경우를 지정하기 위해 Rescue에 대한 솔루션을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top