2011-06-12 88 views

回答

3

你可以傳遞一個ACL實例直接到導航

$view->navigation ($navContainer) 
    ->setAcl ($this->_acl) 
    ->setRole (Zend_Registry::get ('role')); 

這是我如何初始化的ACL在我的自舉initAutoload方法

$this->_acl = new Model_LibraryAcl(); 
$fc = Zend_Controller_Front::getInstance(); 
$fc->registerPlugin (new Plugin_AccessCheck ($this->_acl)); 

我用導航XML代碼來定義我的導航,例如

<all> 
    <label>All</label> 
    <resource>default:programme</resource> 
    <module>default</module> 
    <controller>programme</controller> 
    <action>list</action> 
    <privilege>index</privilege> 
</all> 

這定義了列表動作的鏈接。它可以被所有用戶訪問,所以

$this->allow('guests', 'default:programme', array('index','list')); 

這是根據從Zend_Acl裏導出我的圖書館ACL文件。有關更多詳細信息,請參閱此視頻教程Zend Framework 1.8 tutorial 8 zend_navigation and zend_acl

+0

謝謝。這是顯而易見的部分,但是如何在導航ACL中存儲模型時添加規則? – takeshin 2011-06-12 21:21:47

+0

看看我的編輯。 – 2011-06-13 08:05:49

+0

感謝您的編輯,但看起來你並不完全明白我在問什麼:)我在詢問實體中的ACL,而不是ACL *作爲模型。 – takeshin 2011-06-13 18:51:11

1

我知道你前一段時間問過這個問題,但我認爲分享我的代碼會很有趣,因爲我面臨同樣的問題。

基本上,我想出了,是XML文件的新方法解析,這樣我就可以直接實例我的模型到我的導航XML配置文件,讓自己的權限正確添加到我的ACL樹。

讓我們來看看我的XML菜單第一:

<?xml version="1.0" encoding="UTF-8" ?> 
<configdata> 
    <nav> 
     <dashboard> 
      <label>Dashboard</label> 
      <controller>index</controller> 
      <action>index</action> 
      <class>icon-dashboard</class> 
        <resource>Model_Dashboard_Dashboard</resource> 
     </dashboard> 
     <members> 
      <label>Members</label> 
      <controller>members</controller> 
      <action>index</action> 
        <resource>Model_Members_Members</resource> 
      <class>icon-members</class> 
      <pages> 
       <members-list> 
        <label>Members list</label> 
        <controller>members</controller> 
        <action>list</action> 
        <resource>Model_Members_List</resource> 
        <privilege>list</privilege> 
       </members-list> 
      </pages> 
     </members> 
     <charts> 
      <label>Charts</label> 
      <controller>charts</controller> 
      <action>index</action> 
        <resource>Model_Charts_Charts</resource> 
      <class>icon-charts</class> 
     </charts> 
     <documents> 
      <label>Documents</label> 
      <controller>documents</controller> 
      <action>index</action> 
        <resource>Model_Documents_Documents</resource> 
      <class>icon-documents</class> 
     </documents> 
    </nav> 
</configdata> 

這裏有趣的是資源屬性,所有的人實際上是代表我的模型類。現在

,你可能已經注意到了Zend文檔中:

注:返回類型

配置數據讀入Zend_Config_Xml中被 始終作爲字符串返回。將數據從字符串轉換爲其他 類型留給開發人員以滿足他們的特定需求。

這意味着我的模型將被鑄造成字符串...無賴!爲了防止這種行爲,我用這個函數變換資源串入的對象:

public static function convertNavigationAclToObject($config) 
{ 
    foreach ($config as $key => $value) { 
     if (is_string($value) AND $key === "resource") { 
      $config[$key] = new $value; 
      break; 
     } elseif (is_array($value)) { 
      $config[$key] = self::convertNavigationAclToObject($value); 
     } 
    } 
    return $config; 
} 

此功能允許我向我的所有值遞歸轉換爲對象,因此,在同一時間設置權限(允許,拒絕。 ..在你的車型 - setAcl())。

最後,我實例化我的導航分三步:

  1. 從XML文件中獲取配置
  2. 轉換資源字符串轉換成對象
  3. 實例化Zend_Navigation

在你的引導:

$config = new Zend_Config_Xml(APPLICATION_PATH . /modules/default/views/navigation/navigation.xml', 'nav'); 
$pages = My_Utils::convertNavigationAclToObject($config->toArray()); 
$container = new Zend_Navigation($pages); 

希望它能幫助;)