2011-06-12 86 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); 

希望它能帮助;)