Zend framework 使用ACL隐藏和显示导航器菜单项、按钮和定位

Zend framework 使用ACL隐藏和显示导航器菜单项、按钮和定位,zend-framework,resources,acl,role,Zend Framework,Resources,Acl,Role,我正在使用ACL向系统中的角色授予资源,执行允许的操作并将拒绝的操作路由到自定义页面,我希望在运行时使用ACL上的资源显示和隐藏菜单元素,我还希望在视图中显示和隐藏锚定、按钮 我做了一个助手类 class Zend_View_Helper_Permission extends Zend_View_Helper_Abstract { private $_acl; public function hasAccess($role, $action, $controller)

我正在使用ACL向系统中的角色授予资源,执行允许的操作并将拒绝的操作路由到自定义页面,我希望在运行时使用ACL上的资源显示和隐藏菜单元素,我还希望在视图中显示和隐藏锚定、按钮

我做了一个助手类

  class Zend_View_Helper_Permission extends Zend_View_Helper_Abstract
  {
   private $_acl;
    public function hasAccess($role, $action, $controller)
    {
      if (!$this->_acl) {

           $this->_acl = Zend_Registry::get("Acl");
    }

     return $this->_acl->isAllowed($role, $controller, $action);
  }
} 
我在config.ini文件中这样定义视图帮助器

resources.view.helperPath.Zend_View_Helper = APPLICATION_PATH "/modules/privileges/views/helpers"

如何使用此帮助程序创建在运行时创建的视图?

您的方法名称应该与类名匹配,因此它应该是permission而不是hasAccess

我自己使用一个全局方法show()而不是使用视图助手

    function show($action = null)
    {

        $request = Zend_Controller_Front::getInstance()->getRequest();
        $action = $action === null ? $request->getActionName() : $action;
        $module = $request->getModuleName();
        $controller = $request->getControllerName();

        if(!Zend_Registry::isRegistered('acl')) throw new Exception('Show function can only be called inside view after preDispatch');

        $acl = Zend_Registry::get('acl');
$resource = $module . '#' . $controller;
        return $acl->isAllowed(Zend_Auth::getInstance()->getIdentity(),$resource,$action);
    }
为了保持简单,它从请求对象获取控制器、模块名。 要隐藏列表动作视图中的编辑动作链接,只需doo即可

list.phtml代码如下

<h2>Listing page Only superadmin can see edit link</h2>
<?php if(show('edit')): ?>
<a href="<?echo $this->url(array('action'=>'edit')) ?>">Edit</a>
<?php endif;?>

您在哪里定义了这个全局变量?你在插件中定义了它吗?我定义它是因为它更容易使用,但你也可以使用视图助手。我已经用我定义的信息更新了我的答案。如何为navigator创建它,因为我是使用xml文件创建的??如果您使用Zend_Navigation及其view helper之一,那么您不需要创建任何东西,如果不是,那么只需在xml节点上迭代并在每个节点上调用show方法。
require_once 'Zend/Application.php';
require_once 'Util.php';