Inserimento del nome utente amministratore corrente nella classe o nell'ID <body>


8

Nel back-end dell'amministratore vorrei aggiungere una classe al tag body di tutte le pagine dell'amministratore che stampa il nome degli utenti dell'amministratore attualmente connessi.

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

Ho trovato questo (sulla linea 46 - CE 1.6.2.0):

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

e penso che devo usare questo per ottenere il nome utente admin:

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

Tuttavia, indipendentemente da ciò che faccio, non riesco a visualizzare il nome utente nell'id o nella classe.

Qualsiasi idea sarebbe la benvenuta.

Grazie.

Risposte:


5

Il modo più pulito è creare un osservatore che aggiunge la classe al corpo.
Per questo puoi creare un nuovo modulo (o usarne uno esistente. Per ogni evenienza, ecco come puoi crearne uno. Chiamiamolo Easylife_AdminClass).
Sono necessari i seguenti file:
app/etc/modules/Easylife_AdminClass.xml- il file di dichiarazione

<?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 - il file di configurazione

<?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'osservatore.

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

Consiglio di aggiungere un prefisso alla classe che aggiungi al corpo.
Voglio dire sostituire $block->addBodyClass($admin->getUsername());con $block->addBodyClass('some-prefix-'.$admin->getUsername());poiché il nome utente può essere quasi tutto. Ad esempio, avrai una sorpresa se hai un amministratore chiamato 'root'. Ecco come rootappare la classe nel css admin predefinito

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

1
Questa è davvero una risposta incredibilmente dettagliata - grazie mille per questo. Purtroppo, non essendo un programmatore, non capisco davvero tutto questo e quando l'ho implementato, ho ottenuto una pagina "Si è verificato un errore durante l'elaborazione della tua richiesta" nel tema predefinito di Magento. Qualche idea?
njwrigley,

Prima di tutto svuota la cache (contenuto della cartella var/cache. Se l'errore è ancora presente, controlla la cartella var/report. Su uno dei file lì dentro dovresti trovare maggiori dettagli sull'errore. Consiglio vivamente di chiedere aiuto a un programmatore su questo.
Marius

Ok, grazie per la tua risposta davvero molto veloce. Prenderò alcune persone che conosco per vedere la tua soluzione.
njwrigley,

@Marius Ottimo supporto :)
Gemma

13

La soluzione più semplice è quella di creare un metodo di supporto che restituisca il nome utente attualmente connesso.

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

Quindi nel layout XML:

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

Mi piace molto questa soluzione.
Philwinkle,

Bella soluzione. +1 soprattutto perché sono furioso, questo non mi è passato per la testa (e avrebbe dovuto).
Marius

1
@Marius la tua soluzione afferrerà sempre il caso a meno che non venga utilizzato un modello di blocco principale personalizzato, quindi direi che è il più completo. Evito personalmente di osservare gli eventi di rendering a blocchi perché sono generici, ma la tua risposta fa tutto ciò che dovrebbe (testare il tipo di blocco, creare un'istanza come singleton).
benmarks

Ci ho pensato, ma ho tranquillamente ipotizzato che il rischio fosse molto basso. Il modo in cui viene costruito l'amministratore di Magento richiede che il blocco superiore sia un'istanza di Mage_Adminhtml_Block_Page. Ovviamente puoi sostituirlo con un altro tipo di blocco ma non vedo il punto. E anche se lo sostituisci, o lo sostituisci con una classe figlio di Mage_Adminhtml_Block_Page(che è ok), oppure hai il rischio di non avere un metodo addBodyClass(). In ogni caso esiste il rischio che la mia estensione non funzioni ma penso che sia abbastanza sicuro prenderlo.
Marius

1

In un modulo personalizzato, si desidera osservare il preDispatch per l'azione del controller di amministrazione a cui si sta tentando di aggiungere classi del corpo e utilizzare il seguente codice:

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

Mi piace la risposta incredibilmente dettagliata di Marius meglio della mia (anche se la premessa è la stessa)
philwinkle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.