Obtention du nom d'utilisateur administrateur actuel dans la classe ou l'ID <body>


8

Dans le backend d'administration, je voudrais ajouter une classe à la balise body de toutes les pages d'administration qui affiche le nom des utilisateurs admin actuellement connectés.

In app/design/adminhtml/default/default/template/page.phtml

Je l'ai trouvé (à la ligne 46 - CE 1.6.2.0):

<body id="html-body"<?php echo $this->getBodyClass()?'class="'.$this->getBodyClass().'"':'' ?>>

et je pense que je dois l'utiliser pour obtenir le nom d'utilisateur administrateur:

Mage::getSingleton('admin/session')->getUser();

Cependant, peu importe ce que je fais, je n'arrive pas à afficher le nom d'utilisateur dans l'ID ou la classe.

Toutes les idées seraient les bienvenues.

Merci.

Réponses:


5

La façon la plus propre est de créer un observateur qui ajoute la classe au corps.
Pour cela, vous pouvez créer un nouveau module (ou utiliser un module existant. Juste au cas où, voici comment vous pouvez en créer un. Appelons-le Easylife_AdminClass).
Vous aurez besoin des fichiers suivants:
app/etc/modules/Easylife_AdminClass.xml- le fichier de déclaration

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_AdminClass>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Adminhtml />
            </depends>
        </Easylife_AdminClass>
    </modules>
</config>

app/code/local/Easylife/AdminClass/etc/config.xml - le fichier de configuration

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_AdminClass>
            <version>0.0.1</version>
        </Easylife_AdminClass>
    </modules>
    <global>
        <models>
            <adminclass>
                <class>Easylife_AdminClass_Model</class>
            </adminclass>
        </models>
    </global>
    <adminhtml>
        <events><!-- event used for adding a class to the body-->
            <core_block_abstract_to_html_before>
                <observers>
                    <adminclass>
                        <type>singleton</type>
                        <class>adminclass/adminhtml_observer</class>
                        <method>addBodyClass</method>
                    </adminclass>
                </observers>
            </core_block_abstract_to_html_before>
        </events>
    </adminhtml>
</config>

app/code/local/Easylife/AdminClass/Model/Observer.php - l'observateur.

<?php
class Easylife_AdminClass_Model_Adminhtml_Observer{
    public function addBodyClass($observer){
        $block = $observer->getEvent()->getBlock();
        if ($block instanceof Mage_Adminhtml_Block_Page){ //check if the block is the root block,
            $admin = Mage::getSingleton('admin/session')->getUser();
            if ($admin->getId()){//check if the admin is logged in
                $block->addBodyClass($admin->getUsername());//add the class to the body.
            }
        }
        return $this;
    }
}

Je recommande d'ajouter un préfixe à la classe que vous ajoutez au corps.
Je veux dire remplacer $block->addBodyClass($admin->getUsername());par $block->addBodyClass('some-prefix-'.$admin->getUsername());puisque le nom d'utilisateur peut être presque n'importe quoi. Par exemple, vous aurez une surprise si vous avez un administrateur nommé «root». Voici à quoi rootressemble la classe dans le CSS d'administration par défaut

.root{
    position: relative;
    height: 260px;
    margin: 0;
    width: 1px;
}

1
Il s'agit en effet d'une réponse incroyablement détaillée - merci pour cela. Malheureusement, n'étant pas programmeur, je ne comprends pas vraiment tout cela et quand je l'ai implémenté, j'ai eu une page `` Il y a eu une erreur lors du traitement de votre demande '' dans le thème Magento par défaut. Des idées?
njwrigley

Tout d'abord, videz le cache (contenu du dossier var/cache. Si l'erreur est toujours là, vérifiez le dossier var/report. Sur l'un des fichiers, vous devriez trouver plus de détails sur l'erreur. Je recommande vraiment de demander l'aide d'un programmeur à ce sujet.
Marius

D'accord - merci pour votre réponse vraiment très rapide. Je vais demander à des gens que je connais de regarder votre solution.
njwrigley

@Marius Great support :)
Gem

13

La solution la plus simple consiste à créer une méthode d'assistance qui renvoie le nom d'utilisateur actuellement connecté.

class Ns_Mn_Helper_Data extends Mage_Core_Helper_Abstract
{
    public function getAdminUsername()
    {
        if (Mage::getSingleton('admin/session')->getUser()->getId()) {
            return Mage::getSingleton('admin/session')->getUser()->getUsername();
        }
    }
}

Puis dans la mise en page XML:

<default>
    <action method="addBodyClass" block="root">
         <css_class_name helper="ns_mn/getAdminUsername" />
    </action>
</default>

J'aime beaucoup cette solution.
philwinkle

Belle solution. +1 principalement parce que je suis furieux que cela ne me soit pas venu à l'esprit (et ça aurait dû).
Marius

1
@Marius, votre solution détectera toujours le cas, à moins qu'un modèle de bloc principal personnalisé ne soit utilisé, donc je dirais que c'est le plus complet. Personnellement, j'évite d'observer les événements de rendu de bloc car ils sont génériques, mais votre réponse fait tout ce qu'elle doit (tester le type de bloc, instancier comme un singleton).
benmarks

J'y ai pensé, mais j'ai supposé en toute sécurité que le risque était très faible. La façon dont l'administrateur Magento est construit nécessite que le bloc supérieur soit une instance de Mage_Adminhtml_Block_Page. Bien sûr, vous pouvez remplacer cela par un autre type de bloc, mais je ne vois pas l'intérêt. Et même si vous le remplacez, soit vous le remplacez par une classe enfant de Mage_Adminhtml_Block_Page(ce qui est ok), soit vous risquez de ne pas avoir de méthode addBodyClass(). Quoi qu'il en soit, le risque que mon extension ne fonctionne pas existe, mais je pense qu'il est assez sûr de le prendre.
Marius

1

Dans un module personnalisé, vous souhaitez observer la pré-répartition de l'action du contrôleur d'administration à laquelle vous essayez d'ajouter des classes de corps et utiliser le code suivant:

if ($block = $this->getLayout()->getBlock('root')) {
        $block->addBodyClass((string)Mage::getSingleton('admin/session')->getUser());
}

J'aime la réponse incroyablement détaillée de Marius mieux que la mienne (bien que la prémisse soit la même)
philwinkle
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.