Получение текущего имени пользователя администратора в класс или идентификатор <body>

8

В админке администратора я хотел бы добавить класс к тегу body всех страниц администратора, который выводит на экран имя администратора, который в данный момент вошел в систему.

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, ни в классе.

Любые идеи будут приветствоваться.

Спасибо.

njwrigley
источник

Ответы:

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класс выглядит в CSS администратора по умолчанию

.root{
    position: relative;
    height: 260px;
    margin: 0;
    width: 1px;
}
Мариус
источник
1
Это действительно невероятно подробный ответ - огромное спасибо за это. К сожалению, не будучи программистом, я не совсем понимаю все это, и когда я реализовал это, я получил страницу «Произошла ошибка при обработке вашего запроса» в стандартной теме Magento. Любые идеи?
njwrigley
Прежде всего очистите кэш (содержимое папки var/cache. Если ошибка все еще существует, проверьте папку var/report. В одном из файлов там вы найдете более подробную информацию об ошибке. Я действительно рекомендую обратиться за помощью к программисту по этому вопросу.
Мариус
Хорошо, спасибо за ваш действительно очень быстрый ответ. Я заставлю некоторых людей, которых я знаю, взглянуть на ваше решение.
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>
benmarks
источник
Мне очень нравится это решение.
Philwinkle
Хорошее решение. +1 в основном потому, что я в ярости, это не приходило мне в голову (и должно было).
Мариус
1
@Marus ваше решение будет всегда улавливать, если не будет использован какой-либо специальный шаблон главного блока, поэтому я бы сказал, что он самый тщательный. Я лично избегаю наблюдать за событиями рендеринга блоков, потому что они являются общими, но ваш ответ делает все, что должен (проверить тип блока, создать экземпляр как одиночный).
отметки
Я думал об этом, но я предположил, что риск очень низок. То, как создается администратор Magento, требует, чтобы верхний блок был экземпляром Mage_Adminhtml_Block_Page. Конечно, вы можете заменить это другим типом блока, но я не вижу смысла. И даже если вы замените его, либо замените его дочерним классом Mage_Adminhtml_Block_Page(что нормально), либо у вас есть риск отсутствия метода addBodyClass(). В любом случае существует риск, что мое расширение не будет работать, но я думаю, что это довольно безопасно.
Мариус
1

В пользовательском модуле вы хотите наблюдать preDispatch для действия контроллера администратора, к которому вы пытаетесь добавить классы тела, и использовать следующий код:

if ($block = $this->getLayout()->getBlock('root')) {
        $block->addBodyClass((string)Mage::getSingleton('admin/session')->getUser());
}
philwinkle
источник
Мне нравится невероятно подробный ответ Мариуса лучше, чем мой собственный (хотя предпосылка та же)
philwinkle