Pergunta

Como posso saber se a solicitação atual é para uma página backend ou frontend?Essa verificação será feita dentro de um observador, então tenho acesso ao objeto request, se isso ajudar.

Eu considerei verificar Mage::getSingleton('admin/session')->getUser() mas não acho que seja um método muito confiável.Espero uma solução melhor.

Foi útil?

Solução

Esta é uma daquelas áreas onde não há uma boa resposta.O próprio Magento não fornece um método/API explícito para essas informações; portanto, com qualquer solução, você precisará examinar o ambiente e inferir coisas.

eu estava usando

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

por um tempo, mas acontece que existem certas páginas de administração (o gerenciador de pacotes Magento Connect) onde isso não é verdade.Por alguma razão, esta página define explicitamente o ID da loja como 1, o que torna isAdmin retornar como falso.

#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');
}

Pode haver outras páginas com este comportamento,

Outra boa aposta é verificar a propriedade “área” do pacote de design.

Parece menos provável que isso seja substituído em uma página que está no administrador, pois a área afeta o caminho para os modelos de design das áreas administrativas e os arquivos XML de layout.

Independentemente do que você escolher inferir do ambiente, crie um novo módulo Magento e adicione uma classe auxiliar a ele

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;
    }
}

e sempre que precisar verificar se você está no administrador, use este auxiliar

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

Dessa forma, quando/se você descobrir falhas na lógica de verificação do administrador, poderá corrigir tudo em um local centralizado.

Outras dicas

Se você puder usar um observador, poderá limitá-lo à área de eventos '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>

Dê uma olhada nos métodos internos Mage/Core/Model/Store.php você vai querer usar:

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

Em conjunção com

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

Para atuar como um substituto onde o ID da loja não está definido conforme o esperado (Magento connect etc.)

Gosto da resposta da lógica do bipe - faz sentido no contexto dos observadores.Também gosto do argumento de Alan de que não há como saber o estado do administrador em todos os contextos, o que é uma função de "o administrador" ser um estado que é inserido após a inicialização do aplicativo e do controlador frontal.

O estado administrativo do Magento é efetivamente criado a partir do envio do controle para um controlador de ação administrativa;ver Mage_Adminhtml_Controller_Action::preDispatch().Este é o método que dispara o adminhtml_controller_action_predispatch_start evento, que é consumido por Mage_Adminhtml_Model_Observer::bindStore(), que é onde o armazenamento do administrador é inicialmente "definido".Na verdade, as áreas de configuração do observador (adminhtml vs frontend) "funcionam" por causa da classe principal do controlador de ação - veja Mage_Core_Controller_Varien_Action::preDispatch(), especificamente Mage::app()->loadArea($this->getLayout()->getArea()); - basta observar que o objeto layout tem suas informações de área definidas no pré-despacho adminhtml.

Não importa como você o divida, o comportamento administrativo no qual confiamos em tantos contextos - mesmo algo de alto nível como o sistema observador de eventos - depende da estrutura de controle de comando.

<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>

Na sua definição de observador:

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
        }
    }
}

dr.:Use um observador, até mesmo o mesmo modelo de observador, mas passe no contexto especificando um método de chamada diferente.

HTH.

editar:adicionado código de exemplo usando a configuração da lógica de bipe como ponto de partida

Esteja eu errado ou não (mas testei), alguns eventos (como controller_front_init_before) só podem ser substituídos dentro do nó global.Como resultado, essa substituição afetará tanto o front-end quanto o back-end.

Em seguida, vem a solução de Alan e Benmark para o resgate para especificar se você deseja aplicar o observador apenas no frontend ou apenas no backend.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top