Giả sử chúng ta thêm một số tài nguyên mới vào ACL như vậy:
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<search>
<children>
<import translate="title">
<title>Import</title>
</import>
<export translate="title">
<title>Export</title>
</export>
</children>
</search>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
Sau đó, chúng tôi thêm phần sau đây vào một nút xuất hiện trong lưới SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Nếu sau đó tôi đăng nhập với tư cách là người dùng không phải quản trị viên, tôi thực sự đã nghĩ rằng hành vi dự kiến sẽ không có nút nào hiển thị, vì tôi rõ ràng không cung cấp cho người dùng vai trò tài nguyên. Mặc dù hóa ra, giá trị trả về mặc định isAllowed
dường như là đúng. Đối với các vấn đề phức tạp, khi bạn đi và xem các tài nguyên cho vai trò đó, hộp kiểm sẽ không xuất hiện.
Tôi có thể giải quyết 'vấn đề' bằng cách nhấp qua từng vai trò và nhấp vào lưu, nhưng đây là Pita để thực hiện đặc biệt trên các môi trường trực tiếp / giai đoạn / nhà phát triển. Có cách nào dễ dàng để tự động từ chối tài nguyên này từ mỗi vai trò thông qua mã không? Tôi không phiền khi thêm một tập lệnh di chuyển nếu cần. Tôi đã có một cái nhìn nhanh chóng về những gì xảy ra trong cùng một hành động. Có lẽ, tôi có thể làm điều này bằng cách tải tất cả các vai trò, lặp qua chúng và thực hiện logic tương tự để Mage_Admin_Model_Resource_Rules::saveRel
chèn các hàng vào bảng. Nhưng mã này dường như giả định rằng tất cả các tài nguyên được đăng, điều đó có nghĩa là để gọi nó trực tiếp, tôi cần tìm ra định dạng nào tôi cần để truyền dữ liệu vào và có thể tải tài nguyên hiện có.
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())