0

我目前一直在我的项目中同时使用 zend_acl 和 Zend_Navigation,它似乎工作正常。我是如何在我的网站中使用大量 ajax 并使用 jqModal 和 jQuery 登录的,这些登录用户无需重新加载当前页面并且还需要重新加载导航。到目前为止,我已经让它工作了,但是返回的导航是所有可见字段为 true 的链接,这是不正确的。例如,当我以用户身份登录时,登录链接不应该是可见的。

任何帮助,将不胜感激。我在下面的 Action、JavaScript 函数和 Json 代码返回。

==================================================== ===== 当前角色 = 管理员

// 控制器动作

public function getnavigationjsonAction() { //$view->navigation($container)->setAcl($this->_acl)->setRole(Zend_Registry::get('role')); // echo $this->navigation()->menu(); $navigation = $this->getView()->navigation()->setAcl($this->_acl)->setRole(Zend_Registry::get('role')); //die(Zend_Registry::get('role')); //死($this->_acl); $this->_helper->json($navigation->toArray()); }

// 脚本函数

function reloadNavigationMenu() { //alert('重新加载导航'); $.ajax( { url : "/default/ajax/getnavigationjson", type : "POST", cache : false, async : false, data : "format=json", success : function(data) { var html='' ; 控制台.log(数据);

$.each(data, function(i) { if(data[i].visible === true) { //console.log(data[i]); html+='

  • '; html+=''+数据[i].label+''; html+='
  • '; } }); html+=''; $('#zend_navigation_container').html(html); } });

    }

    // 从控制器返回 JSON 数据

    [ {“action”:“index”,“active”:false,“class”:null,“controller”:“admin”,“id”:null,“label”:“Admin Section”,“module”:“ admin”,“order”:null,“pages”:[],“params”:[],“privilege”:“index”,“rel”:[],“reset_params”:true,“resource”:“admin :admin", "rev" : [ ], "route" : null, "target" : null, "title" : null, "type" : "Zend_Navigation_Page_Mvc", "visible" : true }, { "action" : "索引”,“活动”:假,“类”:空,“控制器”:“索引”,“id”:空,“标签”:“主页”,“模块”:“默认”,“订单”:空,“页面”:[],“参数”:[], “特权”:null,“rel”:[],“reset_params”:true,“resource”:null,“rev”:[],“route”:null,“target”:null,“title”:null, “类型”:“Zend_Navigation_Page_Mvc”,“可见”:真 },{ “动作”:“索引”,“活动”:假,“类”:空,“控制器”:“索引”,“id”:空, “标签”:“新闻”,“模块”:“新闻”,“订单”:null,“页面”:[],“参数”:[],“特权”:“索引”,“rel”:[],“reset_params”:true,“资源”:“新闻” :index", "rev" : [ ], "route" : null, "target" : null, "title" : null, "type" : "Zend_Navigation_Page_Mvc", "visible" : true }, { "action" : " index”,“active”:false,“class”:null,“controller”:“index”,“id”:null,“label”:“Tutorials”,“module”:“tutorials”,“order”:null ,“页面”:[],“参数”:[],“privilege”:“index”,“rel”:[],“reset_params”:true,“resource”:“tutorials:index”,“rev”:[],“route”:null,“target”:null,“标题”:空,“类型”:“Zend_Navigation_Page_Mvc”,“可见”:真},{“动作”:“关于”,“活动”:假,“类”:空,“控制器”:“索引”,“ id”:null,“label”:“关于”,“module”:“default”,“order”:null,“pages”:[],“params”:[],“privilege”:“about”,“相对”:[],“reset_params”:真,“资源”:“默认:索引”,“rev”:[],“路由”:null,“target”:null,“title”:null,“type”:“Zend_Navigation_Page_Mvc”,“visible”:true },{ “action”:“comments”,“active”:false,“class”:null,“controller”:“index”,“id”:null,“label”:“Comments”,“module”:“default”, “order”:null,“pages”:[],“params”:[],“privilege”:“comments”,“rel”:[],“reset_params”:true,“resource”:“default:index” , "rev" : [ ], "route" : null,“目标”:空,“标题”:空,“类型”:“Zend_Navigation_Page_Mvc”,“可见”:真},{“动作”:“索引”,“活动”:假,“类”:空,“控制器" : "contact", "id" : null, "label" : "Contact", "module" : "default", "order" : null, "pages" : [ ], "params" : [ ], "privilege ":"index","rel":[],"reset_params":true,"resource":"default:contact","rev":[],"route":null,"target":null,"title “:空,”类型“:”Zend_Navigation_Page_Mvc", "visible" : true }, { "action" : "login", "active" : false, "class" : null, "controller" : "auth", "id" : null, "label" : "登录”,“模块”:“默认”,“订单”:null,“页面”:[],“参数”:[],“特权”:“登录”,“rel”:[],“reset_params”: true,“resource”:“default:auth”,“rev”:[],“route”:null,“target”:null,“title”:null,“type”:“Zend_Navigation_Page_Mvc”,“visible”:true }, { "动作" : "注销",“active”:false,“class”:null,“controller”:“auth”,“id”:null,“label”:“注销”,“module”:“default”,“order”:null,“pages” “:[],“参数”:[],“特权”:“注销”,“rel”:[],“reset_params”:true,“资源”:“默认:auth”,“rev”:[], “路线”:空,“目标”:空,“标题”:空,“类型”:“Zend_Navigation_Page_Mvc”,“可见”:真}]注销”,“模块”:“默认”,“订单”:null,“页面”:[],“参数”:[],“特权”:“注销”,“rel”:[],“reset_params”: true,“resource”:“default:auth”,“rev”:[],“route”:null,“target”:null,“title”:null,“type”:“Zend_Navigation_Page_Mvc”,“visible”:true }]注销”,“模块”:“默认”,“订单”:null,“页面”:[],“参数”:[],“特权”:“注销”,“rel”:[],“reset_params”: true,“resource”:“default:auth”,“rev”:[],“route”:null,“target”:null,“title”:null,“type”:“Zend_Navigation_Page_Mvc”,“visible”:true }]rev”:[],“route”:null,“target”:null,“title”:null,“type”:“Zend_Navigation_Page_Mvc”,“visible”:true }]rev”:[],“route”:null,“target”:null,“title”:null,“type”:“Zend_Navigation_Page_Mvc”,“visible”:true }]

    这是我当前以管理员身份登录的时候,登录链接应该被隐藏但它不是。看起来 ACL 没有正确分配给导航。

    4

    2 回答 2

    0

    我认为 Zend_Navigation 使用 ACL 来确定页面是否应该在渲染期间可见。当您将 ACL 对象传递给它时,它不会改变您的导航对象。

    如果您想创建由 ACL 减少的自定义导航容器,您需要一种不同的方法 - 可能扩展 Zend Navigation 类并添加适当的方法。

    于 2011-02-01T11:41:05.910 回答
    0

    您将需要强制 Zend_Navigation 重新渲染导航。如前所述,它基于 acl “过滤”渲染。此外,不确定如何在 Zend_Registry 中存储该角色,但您可能需要考虑在查询 Zend_Auth 以验证用户身份时返回该角色,如果该角色未更新,也可能导致问题。我还建议在动作助手而不是动作中设置您的 acl 等,以便它可以处理“任何”动作而不仅仅是这个动作。项目存在的事实应该表明菜单由于某种原因没有被重新渲染,或者更新的角色没有被传递给 Acl,如果菜单项根本不会出现在菜单中。Zend_Navigation 不会渲染任何已经被 acl 过滤的项目,

    此外,什么角色定义了显示登录选项卡的权限?如果您的角色是从普通用户角色继承的,您应该告诉 acl 拒绝标准用户及更高版本,如果不是,那么它可能确实可以正常工作。举个例子:

    //..//..//
    $this->addResource(new Zend_Acl_Resource('login')); //<- Allows the hiding of the login navigation tab
    $this->addResource(new Zend_Acl_Resource('logout')); //<- Allows the hiding of the logout navigation tab
    
    $this->allow($guest, array('user'), array('user.login', 'user.register'));
    $this->allow('user', array('user', 'useraccount'), array('user.view', 'user.logout',  'user.account-editown', 'user.edit-account', //<-end user privs
                ));
    
    //..//..//
    $this->deny('user', array('user'), array('user.login', 'user.register'));
    
    于 2013-08-15T21:18:39.260 回答