用户使用Zend_Navigation登录后如何交换Login for Logout?

时间:2010-03-09 02:18:03

标签: zend-framework zend-navigation

我正在使用XML配置文件使用Zend_Navigation填充我的导航。

我在导航中有登录和退出,但显然我应该只显示有意义的1动作。

我相信我可以做类似$ navigation-> removePage()的事情,但是...如何在以前在Bootstrap.php中创建后在Controller中获取$ navigation变量?

2 个答案:

答案 0 :(得分:2)

最简单的方法是为已登录和未登录的用户创建具有适当特权的ACL,然后在配置文件中创建:

resources.navigation.pages.login.resource = "user"
resources.navigation.pages.login.privilege = "login"

(为简单起见,这是ini格式,您也可以在XML中执行此操作)

Privilages将限制显示指定组的登录/注销链接。

...然而 这适用于静态导航标签。 我想要一个名为Login的登录链接,以及名为Logout (+ username)的注销,这样用户就可以一直看到他的身份。

在这种情况下,我将创建一个前端控制器插件,用于检索实际导航容器,查找登录页面容器并替换标签和路由(如果使用MVC页面容器,则替换URI或模块,控制器和操作)。

<强>更新

尝试这样的事情:

if (Zend_Auth::getInstance()->hasIdentity()) {
    Zend_Registry::set('role',
    Zend_Auth::getInstance()->getStorage()->read()->role);
} else {
    Zend_Registry::set('role', 'guest');
}

$this->_acl = new My_Model::Acl;
$this->_auth = Zend_Auth::getInstance();

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

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

答案 1 :(得分:0)

如果您正在使用Zend_Application,请将Zend_Navigation设置为资源(请参阅有关如何在配置文件中设置页面的链接)

http://framework.zend.com/manual/en/zend.application.available-resources.html

然后您可以在控制器中访问导航资源,如下所示:

 class FooController extends Zend_Controller_Action
  {
      public function init()
      {
          $bootstrap = $this->getInvokeArg('bootstrap');
          $navigation = $bootstrap->getResource('navigation');
          // ...
      }
  }