将当前管理员用户名获取到<body>类或ID中


8

在admin后端中,我想向所有admin页面的body标签添加一个类,该类打印出当前登录的admin用户的名称。

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

我发现了这一点(第46行-CE 1.6.2.0):

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

而且我认为我需要使用它来获取管理员用户名:

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

但是,无论我做什么,我似乎都无法在id或class中输出用户名。

任何想法都将受到欢迎。

谢谢。

Answers:


5

最干净的方法是创建一个将类添加到主体的观察器。
为此,您可以创建一个新模块(或使用现有模块。以防万一,这里是创建模块的方法。我们称之为Easylife_AdminClass)。
您将需要以下文件:
app/etc/modules/Easylife_AdminClass.xml-声明文件

<?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 -配置文件

<?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 -观察者。

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

我建议在您添加到正文的类中添加前缀。
我的意思是替换为$block->addBodyClass($admin->getUsername());$block->addBodyClass('some-prefix-'.$admin->getUsername());因为用户名几乎可以是任何用户名。例如,如果您有一个名为“ root”的管理员,您会感到惊讶。这是root该类在默认admin CSS中的外观

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

1
这确实是一个非常详细的答复-谢谢。遗憾的是,由于不是程序员,所以我并不太了解所有这些,当我实现它时,默认的Magento主题中出现了“处理您的请求时出错”页面。有任何想法吗?
njwrigley13年

首先清除缓存(文件夹的内容var/cache。如果错误仍然存​​在,请检查该文件夹var/report。在其中的一个文件上,您应该找到有关该错误的更多详细信息。我真的建议在此方面寻求程序员的帮助。
Marius

好的-感谢您的回复。我会认识一些了解您解决方案的人。
njwrigley

@Marius大力支持:)
Gem

13

最简单的解决方案是创建一个帮助程序方法,该方法返回当前登录的用户名。

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

然后在布局XML中:

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

我非常喜欢这种解决方案。
philwinkle 2013年

不错的解决方案。+1主要是因为我很生气,这没想到(应该有)。
Marius

1
@Marius,除非使用某些自定义主块模板,否则您的解决方案将始终能够解决问题,所以我认为这是最彻底的。我个人避免观察块渲染事件,因为它们是通用的,但是您的答案会做所有应做的事情(测试块类型,以单例实例化)。
benmarks 2013年

我想到了这一点,但我确信该风险非常低。Magento管理员的构建方式要求top块是的实例Mage_Adminhtml_Block_Page。当然,您可以将其替换为其他块类型,但我看不出重点。即使您替换了它,也可以将其替换为Mage_Adminhtml_Block_Page(可以)的子类,否则就有没有方法的风险addBodyClass()。无论哪种方式,都存在我的扩展名不起作用的风险,但是我认为这样做很安全。
Marius

1

在定制模块中,您要观察试图向其添加正文类的管理控制器操作的preDispatch,并使用以下代码:

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

我比我自己更喜欢Marius令人难以置信的详尽答案(尽管前提是相同的)
philwinkle 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.