我正在使用 XML 配置文件来使用 Zend_Navigation 填充我的导航。
我在导航中有 Login 和 Logout,但显然我应该只显示 1 个有意义的操作。
我相信我可以执行类似 $navigation->removePage() 的操作,但是...在之前在 Bootstrap.php 中创建 $navigation 变量之后,如何在 Controller 中获取它?
我正在使用 XML 配置文件来使用 Zend_Navigation 填充我的导航。
我在导航中有 Login 和 Logout,但显然我应该只显示 1 个有意义的操作。
我相信我可以执行类似 $navigation->removePage() 的操作,但是...在之前在 Bootstrap.php 中创建 $navigation 变量之后,如何在 Controller 中获取它?
最简单的方法是为登录和未登录的用户创建具有适当权限的 ACL,然后在配置文件中:
resources.navigation.pages.login.resource = "user"
resources.navigation.pages.login.privilege = "login"
(为简单起见,这是 ini 格式,您也可以在 XML 中执行此操作)
权限将限制显示指定组的登录/注销链接。
但是……这对静态导航标签很有用。我希望登录链接名为: Login
,注销名为: Logout (+ username)
,因此用户始终可以看到他的身份。
在这种情况下,我将创建一个前端控制器插件,它检索实际导航容器、查找登录页面容器并替换标签和路由(或 URI 或模块、控制器和操作,如果您使用 MVC 页面容器)。
更新:
尝试这样的事情:
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'));
如果您使用 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');
// ...
}
}