現在の管理者ユーザー名を<body>クラスまたはIDに取得しています


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またはclassのどちらにも出力できないようです。

どんなアイデアでも大歓迎です。

ありがとう。

回答:


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());、usernameはほとんど何もすることができるので。たとえば、「root」という名前の管理者がいる場合は、驚くでしょう。これは、rootクラスがデフォルトの管理CSSでどのように見えるかです

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

1
これは確かに信じられないほど詳細な返答です-そのためのヒープに感謝します。残念ながら、プログラマーではないので、これらすべてを本当に理解していません。実装すると、デフォルトのMagentoテーマに「リクエストの処理中にエラーが発生しました」ページが表示されました。何か案は?
njwrigley 2013年

まず、キャッシュをクリアします(フォルダーの内容var/cache。エラーがまだそこにある場合は、フォルダーを確認してくださいvar/report。そこにあるファイルの1つで、エラーの詳細を確認してください。この点については、プログラマーに助けを求めることをお勧めします。
マリウス

わかりました-あなたの本当に、本当に速い返事をありがとう。私はあなたの解決策を見るために私が知っているいくつかの人々を取得します。
njwrigley 2013年

@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は主に私が激怒しているためで、これは私の心を超えませんでした(そしてそれはそうあるはずです)。
マリウス

1
@Mariusソリューションは、カスタムのメインブロックテンプレートが使用されない限り、常にケースをキャッチします。そのため、これが最も完全だと思います。ブロックレンダリングイベントは一般的なものであるため、個人的には観察しませんが、答えはすべてのことを行います(ブロックタイプをテストし、シングルトンとしてインスタンス化します)。
ベンマークス2013年

と思ったのですが、リスクは非常に低いと思いました。Magentoの管理を構築する方法では、上のブロックをのインスタンスにする必要がありますMage_Adminhtml_Block_Page。もちろん、それを他のブロックタイプに置き換えることはできますが、私は要点を見ません。そして、それを置き換えたとしても、それをMage_Adminhtml_Block_Page(大丈夫です)の子クラスに置き換えるか、メソッドを持たないリスクがありaddBodyClass()ます。どちらの方法でも、私の拡張機能が機能しないというリスクは存在しますが、それをとっても安全だと思います。
マリウス

1

カスタムモジュールで、ボディクラスを追加しようとしている次のコードを使用して、adminコントローラーアクションのpreDispatchを監視します。

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

私はマリウスの信じられないほど詳細な答えが好きです(前提は同じです)
philwinkle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.