我正在使用Skeleton Zend Framework 2来构建我的应用程序。
我想修改layout.phtml中的当前导航栏以显示2个标准链接,然后根据用户权限显示更多链接。
我如何将正在使用的活动模块(/用户为ZfcUser)显示为li class =“active”,以及如何根据加载的模块实现导航项?
答案 0 :(得分:2)
在控制器中,您可以获得这样的活动模块:
$modules = $this->getEvent()->getApplication()->getServiceManager()->get('modulemanager')->getLoadedModules();
$moduleNames = array_keys($modules);
然后你可以检查模块名称加载的模块:
$moduleLoaded = in_array('ZfcUser', $moduleNames); //true or false
答案 1 :(得分:0)
这就是问题......你对“活动模块”的定义是什么?在ZF2中,顶级命名空间松散地定义了一个模块,但即便这样也不是绝对的,因为模块可以根据需要在多个命名空间下提供代码。
我写了一篇关于配置模块特定布局的博客文章,其中我更详细地解释了这个问题,并演示了基于活动模块执行操作的一种可能“解决方案”:http://blog.evan.pro/module-specific-layouts-in-zend-framework-2
在该示例中,我使用事件标识符(即模块名称(命名空间))附加到“dispatch”事件,该事件标识符仅针对正在调度的控制器的顶级命名空间触发(我特意添加了此ZF2的功能,因为它成为测试期间的常见问题)。如果您对此如何或为何如此有用感到好奇,请参阅https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159(特别是撰写本文时的第158行)。
或者,您可以附加到dispatch事件,并获取调度控制器的顶级命名空间。同样,不能保证这实际上是您正在寻找的“模块名称”,并且最好只考虑调度请求时的控制器和操作,而不是“这是哪个模块?”
class Module
{
public function onBootstrap($e) {
$events = $e->getApplication()->getEventManager()->getSharedManager();
$events->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
$controllerClass = get_class($e->getTarget()); // $e->getTarget() is the controller
$controllerTopNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'))
// Do whatever here, maybe something like:
// $nav = $e->getTarget()->getServiceLocator()->get('navigation');
// $nav->...
});
}
}
答案 2 :(得分:0)
在控制器中,您可以这样检查活动模块
svn status