Obtener el nombre de usuario de administrador actual en la clase <body> o id

8

En el back-end de administración, me gustaría agregar una clase a la etiqueta del cuerpo de todas las páginas de administración que imprima el nombre de los usuarios de administrador que actualmente están conectados.

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

He encontrado esto (en la línea 46 - CE 1.6.2.0):

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

y creo que necesito usar esto para obtener el nombre de usuario administrador:

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

Sin embargo, no importa lo que haga, parece que no puedo mostrar el nombre de usuario ni en la identificación ni en la clase.

Cualquier idea seria muy bienvenida.

Gracias.

njwrigley
fuente

Respuestas:

5

La forma más limpia es crear un observador que agregue la clase al cuerpo.
Para esto, puede crear un nuevo módulo (o usar uno existente. Por si acaso, así es como puede crear uno. Llamémoslo Easylife_AdminClass).
Necesitará los siguientes archivos:
app/etc/modules/Easylife_AdminClass.xml- el archivo de declaración

<?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 - el archivo de configuración

<?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 - el observador.

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

Recomiendo agregar un prefijo a la clase que agregue al cuerpo.
Quiero decir reemplazar $block->addBodyClass($admin->getUsername());con $block->addBodyClass('some-prefix-'.$admin->getUsername());ya que el nombre de usuario puede ser casi cualquier cosa. Por ejemplo, tendrá una sorpresa si tiene un administrador llamado 'root'. Así es como se rootve la clase en el administrador predeterminado CSS

.root{
    position: relative;
    height: 260px;
    margin: 0;
    width: 1px;
}
Marius
fuente
1
Esta es una respuesta increíblemente detallada, gracias por eso. Lamentablemente, al no ser un programador, realmente no entiendo todo esto y cuando lo implementé, recibí la página 'Ha habido un error al procesar su solicitud' en el tema predeterminado de Magento. ¿Algunas ideas?
njwrigley
En primer lugar, borre el caché (contenido de la carpeta var/cache. Si el error sigue ahí, verifique la carpeta var/report. En uno de los archivos allí debe encontrar más detalles sobre el error. Realmente recomiendo pedir ayuda a un programador sobre esto.
Marius
Bien, gracias por tu muy, muy rápida respuesta. Conseguiré algunas personas que conozco para ver tu solución.
njwrigley
@Marius Gran apoyo :)
Gema
13

La solución más simple es crear un método auxiliar que devuelva el nombre de usuario actualmente conectado.

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

Luego, en el diseño XML:

<default>
    <action method="addBodyClass" block="root">
         <css_class_name helper="ns_mn/getAdminUsername" />
    </action>
</default>
puntos de referencia
fuente
Me gusta mucho esta solución.
philwinkle
Buena solución +1 principalmente porque estoy furioso, esto no se me pasó por la cabeza (y debería haberlo hecho).
Marius
1
@Marius, su solución siempre atrapará el caso, a menos que se use alguna plantilla de bloque principal personalizada, por lo que diría que es la más completa. Personalmente, evito observar los eventos de representación de bloques porque son genéricos, pero su respuesta hace todo lo que debería (probar el tipo de bloque, instanciar como singleton).
puntos de referencia
Pensé en eso, pero asumí con seguridad que el riesgo es muy bajo. La forma en que se construye el administrador de Magento requiere que el bloque superior sea una instancia de Mage_Adminhtml_Block_Page. Por supuesto, puede reemplazar eso con otro tipo de bloque, pero no veo el punto. E incluso si lo reemplaza, o lo reemplaza con una clase secundaria de Mage_Adminhtml_Block_Page(que está bien), o corre el riesgo de no tener un método addBodyClass(). De cualquier manera, existe el riesgo de que mi extensión no funcione, pero creo que es bastante seguro tomarlo.
Marius
1

En un módulo personalizado, desea observar el preDispatch para la acción del controlador de administrador al que está tratando de agregar clases de cuerpo y usar el siguiente código:

if ($block = $this->getLayout()->getBlock('root')) {
        $block->addBodyClass((string)Mage::getSingleton('admin/session')->getUser());
}
philwinkle
fuente
Me gusta la respuesta increíblemente detallada de Marius mejor que la mía (aunque la premisa es la misma)
philwinkle