Abrufen des aktuellen Administrator-Benutzernamens in die <body> -Klasse oder -ID

8

Im Admin-Backend möchte ich dem Body-Tag aller Admin-Seiten eine Klasse hinzufügen, die den Namen der aktuell angemeldeten Admin-Benutzer ausgibt.

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

Ich habe dies gefunden (in Zeile 46 - CE 1.6.2.0):

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

und ich denke, dass ich dies verwenden muss, um den Administrator-Benutzernamen zu erhalten:

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

Egal was ich mache, ich kann den Benutzernamen weder in der ID noch in der Klasse ausgeben.

Irgendwelche Ideen wären sehr willkommen.

Vielen Dank.

njwrigley
quelle

Antworten:

5

Am saubersten ist es, einen Beobachter zu erstellen, der dem Körper die Klasse hinzufügt.
Dazu können Sie ein neues Modul erstellen (oder ein vorhandenes verwenden. Nur für den Fall, hier ist, wie Sie eines erstellen können. Nennen wir es Easylife_AdminClass).
Sie benötigen folgende Dateien:
app/etc/modules/Easylife_AdminClass.xml- die Deklarationsdatei

<?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 - die Konfigurationsdatei

<?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 - der Beobachter.

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

Ich empfehle, der Klasse, die Sie dem Body hinzufügen, ein Präfix hinzuzufügen.
Ich meine ersetzen $block->addBodyClass($admin->getUsername());mit , $block->addBodyClass('some-prefix-'.$admin->getUsername());da der Benutzername fast alles sein kann. Zum Beispiel werden Sie eine Überraschung haben, wenn Sie einen Administrator namens 'root' haben. So sieht die rootKlasse im Standard-Admin-CSS aus

.root{
    position: relative;
    height: 260px;
    margin: 0;
    width: 1px;
}
Marius
quelle
1
Dies ist in der Tat eine unglaublich detaillierte Antwort - vielen Dank dafür. Da ich kein Programmierer bin, verstehe ich das alles leider nicht wirklich. Als ich es implementierte, wurde im Standard-Magento-Design die Seite "Bei der Verarbeitung Ihrer Anfrage ist ein Fehler aufgetreten" angezeigt. Irgendwelche Ideen?
Njwrigley
Leeren Sie zuerst den Cache (Inhalt des Ordners var/cache. Wenn der Fehler immer noch vorhanden ist, überprüfen Sie den Ordner var/report. In einer der Dateien dort sollten Sie weitere Details zu dem Fehler finden. Ich empfehle wirklich, einen Programmierer um Hilfe zu bitten.
Marius
Okay - danke für deine sehr, sehr schnelle Antwort. Ich werde einige Leute bekommen, von denen ich weiß, dass sie sich Ihre Lösung ansehen.
Njwrigley
@ Marius Große Unterstützung :)
Gem
13

Die einfachste Lösung besteht darin, eine Hilfsmethode zu erstellen, die den aktuell angemeldeten Benutzernamen zurückgibt.

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

Dann im Layout XML:

<default>
    <action method="addBodyClass" block="root">
         <css_class_name helper="ns_mn/getAdminUsername" />
    </action>
</default>
Benmarks
quelle
Ich mag diese Lösung sehr.
Philwinkle
Schöne Lösung. +1 hauptsächlich, weil ich wütend bin, ist mir das nicht in den Sinn gekommen (und sollte es auch sein).
Marius
1
@Marius Ihre Lösung wird den Fall immer erfassen, es sei denn, es wird eine benutzerdefinierte Hauptblockvorlage verwendet. Ich würde also sagen, dass dies die gründlichste ist. Ich persönlich vermeide es, Block-Rendering-Ereignisse zu beobachten, da sie generisch sind, aber Ihre Antwort tut alles, was sie sollte (Test auf Blocktyp, Instanziierung als Singleton).
Benmarks
Ich habe darüber nachgedacht, aber ich bin sicher davon ausgegangen, dass das Risiko sehr gering ist. Die Art und Weise, wie der Magento-Administrator erstellt wird, erfordert, dass der oberste Block eine Instanz von ist Mage_Adminhtml_Block_Page. Natürlich können Sie das durch einen anderen Blocktyp ersetzen, aber ich verstehe den Punkt nicht. Und selbst wenn Sie es ersetzen, ersetzen Sie es entweder durch eine untergeordnete Klasse von Mage_Adminhtml_Block_Page(was in Ordnung ist), oder Sie haben das Risiko, keine Methode zu haben addBodyClass(). In beiden Fällen besteht das Risiko, dass meine Erweiterung nicht funktioniert, aber ich denke, es ist ziemlich sicher, sie zu übernehmen.
Marius
1

In einem benutzerdefinierten Modul möchten Sie den PreDispatch für die Admin-Controller-Aktion beobachten, zu der Sie Körperklassen hinzufügen möchten, und den folgenden Code verwenden:

if ($block = $this->getLayout()->getBlock('root')) {
        $block->addBodyClass((string)Mage::getSingleton('admin/session')->getUser());
}
philwinkle
quelle
Ich mag Marius 'unglaublich detaillierte Antwort besser als meine eigene (obwohl die Prämisse dieselbe ist)
Philwinkle