Question

Comment puis-je savoir si la requête courante est pour une interface ou interface de la page?Ce chèque sera fait à l'intérieur d'un observateur, j'ai donc accès à l'objet de la requête si cela aide.

J'ai considéré la vérification Mage::getSingleton('admin/session')->getUser() mais je ne pense pas que c'est une méthode très fiable.Je suis l'espoir d'une meilleure solution.

Était-ce utile?

La solution

C'est l'un de ces domaines où il n'y a pas de bonne réponse.Magento lui-même ne fournit pas une méthode explicite/API pour cette information, donc avec n'importe quelle solution vous aurez besoin d'examiner l'environnement et en déduire des choses.

J'ai été en utilisant

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

pendant un certain temps, mais il s'avère que certaines pages d'administration (le Magento Connect Package manager) où ce n'est pas vrai.Pour certaines raisons, cette page définit explicitement le magasin id à 1, ce qui rend isAdmin de retour en tant que faux.

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

Il y a peut être d'autres pages avec ce comportement,

Une autre bonne chose à faire est de vérifier la "zone" de la propriété de l'ensemble de conception.

Cela semble moins susceptible d'être remplacée pour une page dans l'admin, depuis la zone des impacts le chemin d'accès à la zone d'admin modèles de conception et de mise en page des fichiers XML.

Peu importe ce que vous choisissez de déduire de l'environnement, de créer un nouveau module Magento, et ajouter une classe d'assistance pour elle

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

et puis à chaque fois que vous devez vérifier si vous êtes dans l'admin, utilisez cette fonction d'aide

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

De cette façon, quand/si vous découvrez des trous dans votre admin logique de la vérification, vous pouvez corriger le tout dans un seul endroit centralisé.

Autres conseils

Si vous êtes en mesure d'utiliser un observateur, vous pouvez limiter la 'adminhtml événement de la zone.

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

Avoir un regard sur les méthodes à l'intérieur de Mage/Core/Model/Store.php vous aurez envie de l'utiliser:

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

En collaboration avec

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

Pour agir à titre de secours, où l'ID de stockage n'est pas défini comme vous vous attendez (Magento connect, etc.)

J'aime bip logique de réponse - il de sens que dans le contexte d'observateurs.J'aime aussi Alan point qu'il n'y a aucun moyen de connaître l'état d'administration dans tous les contextes, qui est une fonction de "l'admin" un état, qui est entré après l'application et avant de contrôleur sont initialisés.

Magento administration de l'état est effectivement créée à partir du contrôle de l'envoi à un admin contrôleur d'action;voir Mage_Adminhtml_Controller_Action::preDispatch().C'est la méthode qui déclenche l' adminhtml_controller_action_predispatch_start l'événement, qui est consommé par Mage_Adminhtml_Model_Observer::bindStore(), qui est l'endroit où l'admin de la boutique est d'abord "set".En fait, l'observateur de configuration de zones (adminhtml vs frontend) "œuvres" en raison de l'action principale de la classe contrôleur - voir Mage_Core_Controller_Varien_Action::preDispatch(), spécifiquement Mage::app()->loadArea($this->getLayout()->getArea()); - il suffit de noter que l'objet de mise en page a son information sur les alentours situé dans le adminhtml predispatch.

Peu importe comment vous le trancher, l'admin comportement sur lesquelles nous nous appuyons dans de nombreux contextes - même quelque chose de plus haut niveau comme l'observateur d'événements système s'appuie sur la commande de la structure de contrôle.

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

Dans votre observateur définition:

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:Utilisez un observateur, même utiliser le même observateur modèle, mais passe dans le contexte en spécifiant un autre appel de méthode.

HTH.

modifier:ajout d'un exemple de code utilisant bip logique de config comme un point de départ

Si je me trompe ou pas (mais je l'ai testé), certains événements (comme controller_front_init_before) ne peut être écrasé à l'intérieur mondiale nœud.En conséquence, cette substitution affectera à la fois le frontend et backend.

Puis viennent d'Alan et benmark de la solution à la rescousse pour spécifier si vous souhaitez appliquer l'observateur sur le frontend seulement ou backend seulement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top