1

我正在使用 Skeleton Zend Framework 2 来构建我的应用程序。

我想修改 layout.phtml 中的当前导航栏以显示 2 个链接作为标准,然后根据用户权限显示更多链接。

我将如何让正在使用的活动模块(ZfcUser 的 /user)显示为 li class="active",以及如何根据加载的模块实现导航项?

4

3 回答 3

2

在控制器中,您可以获得如下活动模块:

$modules = $this->getEvent()->getApplication()->getServiceManager()->get('modulemanager')->getLoadedModules();
$moduleNames = array_keys($modules);

然后你可以检查模块名称加载的模块:

$moduleLoaded = in_array('ZfcUser', $moduleNames); //true or false
于 2012-10-15T01:59:22.517 回答
0

问题来了……您对“活动模块”的定义是什么?在 ZF2 中,模块由顶级命名空间松散地定义,但这也不是绝对的,因为模块可以根据需要在多个命名空间下提供代码。

我写了一篇关于配置特定于模块的布局的博客文章,我在其中更详细地解释了这个问题,并展示了基于活动模块执行操作的一种可能的“解决方案”:http ://blog.evan.pro/ zend-framework-2 中的模块特定布局

在该示例中,我使用事件标识符附加到“调度”事件,该事件标识符是模块名称(命名空间),它仅在被调度的控制器的顶级命名空间中触发(我专门将此功能添加到 ZF2 ,因为它在测试阶段已成为一个常见问题)。如果您对它的工作原理或原因感到好奇,请参阅https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Controller/AbstractController.php#L153-159(特别是写作时的第 158 行这个)。

或者,您可以附加到调度事件,并获取正在调度的控制器的顶级命名空间。同样,不能保证这实际上是您正在寻找的“模块名称”,并且在调度请求时最好只考虑控制器和操作,而不是“这是哪个模块?”

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->...
        });
    }
}
于 2012-10-15T06:16:20.293 回答
0

在控制器中,您可以通过这种方式检查活动模块

$bIsModule = (bool) $this->getEvent()
             ->getApplication()
             ->getServiceManager()
             ->get('modulemanager')
             ->getModule('ZfcUser'); // returns true or false
于 2015-08-20T09:14:33.203 回答