Nhận tên người dùng quản trị viên hiện tại vào lớp <body> hoặc id


8

Trong phần phụ trợ quản trị, tôi muốn thêm một lớp vào thẻ body của tất cả các trang quản trị in ra tên của người dùng quản trị viên hiện đang đăng nhập.

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

Tôi đã tìm thấy cái này (trên dòng 46 - CE 1.6.2.0):

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

và tôi nghĩ rằng tôi cần sử dụng điều này để có được tên người dùng quản trị viên:

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

Tuy nhiên, bất kể tôi làm gì, tôi dường như không thể xuất tên người dùng trong cả id hoặc lớp.

Bất kỳ ý tưởng sẽ được chào đón nhất.

Cảm ơn.

Câu trả lời:


5

Cách sạch nhất là tạo ra một người quan sát thêm lớp vào cơ thể.
Để làm điều này, bạn có thể tạo một mô-đun mới (hoặc sử dụng mô-đun hiện có. Chỉ trong trường hợp, đây là cách bạn có thể tạo mô-đun. Hãy gọi nó Easylife_AdminClass).
Bạn sẽ cần các tệp sau:
app/etc/modules/Easylife_AdminClass.xml- tệp khai bá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 - tập tin cấu hình

<?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 - người quan sát.

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

Tôi khuyên bạn nên thêm một tiền tố vào lớp bạn thêm vào cơ thể.
Ý tôi là thay thế $block->addBodyClass($admin->getUsername());bằng $block->addBodyClass('some-prefix-'.$admin->getUsername());từ tên người dùng có thể hầu hết mọi thứ. Ví dụ: bạn sẽ có một bất ngờ nếu bạn có một quản trị viên tên là 'root'. Đây là cách rootlớp nhìn trong css quản trị mặc định

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

1
Đây thực sự là một câu trả lời cực kỳ chi tiết - cảm ơn rất nhiều vì điều đó. Đáng tiếc, không phải là một lập trình viên, tôi không thực sự hiểu tất cả những điều này và khi tôi thực hiện nó, tôi nhận được một trang 'Đã xảy ra lỗi khi xử lý yêu cầu của bạn' trong chủ đề Magento mặc định. Có ý kiến ​​gì không?
njwrigley

Trước hết hãy xóa bộ nhớ cache (nội dung của thư mục var/cache. Nếu lỗi vẫn còn, hãy kiểm tra thư mục var/report. Trên một trong các tệp trong đó bạn nên tìm thêm chi tiết về lỗi. Tôi thực sự khuyên bạn nên nhờ trợ giúp của lập trình viên về vấn đề này.
Marius

Được rồi - cảm ơn bạn đã trả lời thực sự, thực sự nhanh chóng. Tôi sẽ nhận được một số dân gian mà tôi biết để xem xét giải pháp của bạn.
njwrigley

@Marius Hỗ trợ tuyệt vời :)
Gem

13

Giải pháp đơn giản nhất là tạo một phương thức trợ giúp trả về tên người dùng hiện đang đăng nhập.

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

Sau đó, trong bố cục XML:

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

Tôi thích giải pháp này rất nhiều.
philwinkle

Giải pháp tốt đẹp. +1 chủ yếu là vì tôi tức giận vì điều này đã không xảy ra trong đầu tôi (và nó nên có).
Marius

1
@Marius giải pháp của bạn sẽ luôn luôn bắt được trường hợp trừ khi một số mẫu khối chính tùy chỉnh được sử dụng, vì vậy tôi muốn nói rằng đó là kỹ lưỡng nhất. Cá nhân tôi tránh quan sát các sự kiện kết xuất khối vì chúng là chung chung, nhưng câu trả lời của bạn thực hiện mọi thứ cần thiết (kiểm tra loại khối, khởi tạo dưới dạng đơn).
đánh dấu

Tôi nghĩ về điều đó, nhưng tôi chắc chắn rằng rủi ro là rất thấp. Cách quản trị viên Magento được xây dựng là loại yêu cầu khối trên cùng phải là một ví dụ Mage_Adminhtml_Block_Page. Tất nhiên bạn có thể thay thế nó bằng một loại khối khác nhưng tôi không thấy điểm này. Và ngay cả khi bạn thay thế nó, bạn có thể thay thế nó bằng một lớp con Mage_Adminhtml_Block_Page(không sao) hoặc bạn có nguy cơ không có phương pháp addBodyClass(). Dù bằng cách nào thì nguy cơ tiện ích mở rộng của tôi không hoạt động nhưng tôi nghĩ việc sử dụng nó khá an toàn.
Marius

1

Trong một mô-đun tùy chỉnh, bạn muốn quan sát preDispatch cho hành động của trình điều khiển quản trị mà bạn đang cố thêm các lớp cơ thể vào và sử dụng mã sau:

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

Tôi thích câu trả lời cực kỳ chi tiết của Marius tốt hơn câu trả lời của tôi (mặc dù tiền đề là như nhau)
philwinkle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.