Mendapatkan nama pengguna admin saat ini ke dalam kelas atau id <body>

8

Di admin backend saya ingin menambahkan kelas ke tag tubuh semua halaman admin yang mencetak nama pengguna admin yang saat ini masuk.

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

Saya telah menemukan ini (pada baris 46 - CE 1.6.2.0):

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

dan saya pikir saya perlu menggunakan ini untuk mendapatkan nama pengguna admin:

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

Namun, apa pun yang saya lakukan, sepertinya saya tidak dapat menampilkan nama pengguna dalam id atau kelas.

Setiap ide akan sangat disambut.

Terima kasih.

njwrigley
sumber

Jawaban:

5

Cara terbersih adalah dengan membuat pengamat yang menambahkan kelas ke tubuh.
Untuk ini, Anda dapat membuat modul baru (atau menggunakan yang sudah ada. Untuk berjaga-jaga, berikut adalah bagaimana Anda dapat membuatnya. Mari kita menyebutnya Easylife_AdminClass).
Anda memerlukan file-file berikut:
app/etc/modules/Easylife_AdminClass.xml- file deklarasi

<?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 - file konfigurasi

<?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 - pengamat.

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

Saya sarankan menambahkan awalan ke kelas yang Anda tambahkan ke tubuh.
Maksud saya ganti $block->addBodyClass($admin->getUsername());dengan $block->addBodyClass('some-prefix-'.$admin->getUsername());karena nama pengguna bisa hampir apa saja. Misalnya Anda akan memiliki kejutan jika Anda memiliki admin bernama 'root'. Inilah tampilan rootkelas di admin css default

.root{
    position: relative;
    height: 260px;
    margin: 0;
    width: 1px;
}
Marius
sumber
1
Ini memang jawaban yang sangat terperinci - terima kasih banyak untuk itu. Sayangnya, tidak menjadi seorang programmer, saya tidak benar-benar mengerti semua ini dan ketika saya mengimplementasikannya, saya mendapat halaman 'Telah terjadi kesalahan saat memproses permintaan Anda' di tema Magento default. Ada ide?
njwrigley
Pertama-tama bersihkan cache (isi folder var/cache. Jika kesalahan masih ada, periksa folder var/report. Pada salah satu file di sana Anda harus menemukan rincian lebih lanjut tentang kesalahan. Saya sangat merekomendasikan meminta bantuan dari seorang programmer mengenai hal ini.
Marius
Oke - terima kasih atas balasan Anda yang sangat, sangat cepat. Saya akan mendapatkan beberapa orang yang saya tahu untuk melihat solusi Anda.
njwrigley
@Marius Dukungan hebat :)
Permata
13

Solusi paling sederhana adalah membuat metode pembantu yang mengembalikan nama pengguna yang saat ini masuk.

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

Kemudian dalam tata letak XML:

<default>
    <action method="addBodyClass" block="root">
         <css_class_name helper="ns_mn/getAdminUsername" />
    </action>
</default>
tanda batas
sumber
Saya suka solusi ini.
philwinkle
Solusi yang bagus. +1 sebagian besar karena saya sangat marah ini tidak terlintas dalam pikiran saya (dan memang seharusnya begitu).
Marius
1
@Marius solusi Anda akan selalu menangkap kasus ini kecuali beberapa templat blok utama khusus digunakan, jadi saya akan mengatakan itu yang paling menyeluruh. Secara pribadi saya menghindari mengamati peristiwa render blok karena itu generik, tetapi jawaban Anda melakukan semua yang seharusnya (tes untuk tipe blok, instantiate sebagai singleton).
manfaat
Saya memikirkan hal itu, tetapi saya dengan aman berasumsi risikonya sangat rendah. Cara admin Magento dibangun membutuhkan blok teratas untuk menjadi instance dari Mage_Adminhtml_Block_Page. Tentu saja Anda dapat menggantinya dengan jenis blok lain tetapi saya tidak mengerti intinya. Dan bahkan jika Anda menggantinya, baik Anda menggantinya dengan kelas anak Mage_Adminhtml_Block_Page(yang tidak masalah), atau Anda memiliki risiko tidak memiliki metode addBodyClass(). Either way risiko ekstensi saya tidak berfungsi ada tapi saya pikir cukup aman untuk mengambilnya.
Marius
1

Dalam modul khusus, Anda ingin mengamati preDispatch untuk tindakan pengontrol admin yang Anda coba tambahkan kelas tubuh ke dan menggunakan kode berikut:

if ($block = $this->getLayout()->getBlock('root')) {
        $block->addBodyClass((string)Mage::getSingleton('admin/session')->getUser());
}
Philwinkle
sumber
Saya suka jawaban Marius yang sangat rinci lebih baik daripada jawaban saya sendiri (walaupun premisnya sama)
philwinkle