Obtendo o nome de usuário do administrador atual na classe <body> ou no ID

8

No back-end de administração, gostaria de adicionar uma classe à tag body de todas as páginas de administração, que imprime o nome dos usuários administrativos atualmente conectados.

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

Eu encontrei isso (na linha 46 - CE 1.6.2.0):

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

e acho que preciso usar isso para obter o nome de usuário do administrador:

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

No entanto, não importa o que eu faça, não consigo exibir o nome de usuário no ID ou na classe.

Todas as ideias serão bem-vindas.

Obrigado.

njwrigley
fonte

Respostas:

5

A maneira mais limpa é criar um observador que adicione a classe ao corpo.
Para isso, você pode criar um novo módulo (ou usar um existente. Para o caso, aqui está como você pode criar um. Vamos chamá-lo Easylife_AdminClass).
Você precisará dos seguintes arquivos:
app/etc/modules/Easylife_AdminClass.xml- o arquivo de declaração

<?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 - o arquivo de configuração

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

Eu recomendo adicionar um prefixo à classe que você adiciona ao corpo.
Quero dizer substituir $block->addBodyClass($admin->getUsername());por $block->addBodyClass('some-prefix-'.$admin->getUsername());uma vez que o nome de usuário pode ser quase tudo. Por exemplo, você terá uma surpresa se tiver um administrador chamado 'root'. Aqui está como a rootclasse fica no padrão admin css

.root{
    position: relative;
    height: 260px;
    margin: 0;
    width: 1px;
}
Marius
fonte
11
Esta é realmente uma resposta incrivelmente detalhada - obrigado por isso. Lamentavelmente, por não ser um programador, eu realmente não entendo tudo isso e quando o implementei, recebi a página 'Ocorreu um erro ao processar sua solicitação' no tema padrão do Magento. Alguma ideia?
precisa saber é o seguinte
Antes de tudo, limpe o cache (conteúdo da pasta var/cache. Se o erro ainda estiver lá, verifique a pasta var/report. Em um dos arquivos, você deve encontrar mais detalhes sobre o erro. Eu realmente recomendo pedir ajuda de um programador sobre isso.
Marius
Ok - obrigado pela sua resposta muito, muito rápida. Vou pegar algumas pessoas que conheço para olhar para a sua solução.
precisa saber é o seguinte
@Marius Grande apoio :)
Gem
13

A solução mais simples é criar um método auxiliar que retorne o nome de usuário atualmente 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();
        }
    }
}

Em seguida, no layout XML:

<default>
    <action method="addBodyClass" block="root">
         <css_class_name helper="ns_mn/getAdminUsername" />
    </action>
</default>
benmarks
fonte
Eu gosto muito desta solução.
philwinkle
Ótima solução. +1, principalmente porque estou furioso porque isso não passou pela minha cabeça (e deveria ter).
Marius
11
@ Marius, sua solução sempre será o caso, a menos que um modelo de bloco principal personalizado seja usado, então eu diria que é o mais completo. Pessoalmente, evito observar eventos de renderização de blocos porque eles são genéricos, mas sua resposta faz tudo o que deve (teste para o tipo de bloco, instancia como um singleton).
benmarks
Pensei nisso, mas assumi com segurança que o risco é muito baixo. A maneira como o administrador do Magento é construído requer que o bloco superior seja uma instância Mage_Adminhtml_Block_Page. Claro que você pode substituí-lo por outro tipo de bloco, mas não vejo o ponto. E mesmo que você o substitua, substitua-o por uma classe filho de Mage_Adminhtml_Block_Page(o que está ok) ou você corre o risco de não ter um método addBodyClass(). De qualquer maneira, existe o risco de minha extensão não funcionar, mas acho que é bastante seguro aceitá-la.
Marius
1

Em um módulo personalizado, você deseja observar o préDispatch para a ação do controlador administrativo na qual você está tentando adicionar classes de corpo e usar o seguinte código:

if ($block = $this->getLayout()->getBlock('root')) {
        $block->addBodyClass((string)Mage::getSingleton('admin/session')->getUser());
}
philwinkle
fonte
I como Marius' incrivelmente detalhado resposta melhor do que a minha (embora a premissa é a mesma)
philwinkle