Получение активного модуля для навигации в Zend Framework 2

Я использую Skeleton Zend Framework 2 для создания своего приложения.

Я хотел бы изменить текущую панель навигации в layout.phtml, чтобы стандартно отображались 2 ссылки, а затем еще несколько ссылок в зависимости от разрешений пользователя.

Как мне заставить используемый активный модуль (/user для ZfcUser) отображаться как li class="active" и как мне реализовать элементы навигации на основе загруженных модулей?


person bear    schedule 14.10.2012    source источник


Ответы (3)


Вот в чем проблема... Каково ваше определение "активного модуля"? В ZF2 модуль свободно определяется пространством имен верхнего уровня, но даже это не является абсолютным, поскольку модули могут предоставлять код в нескольких пространствах имен, если они того пожелают.

Я написал сообщение в блоге о настройке макетов для конкретных модулей, где я объясняю эту проблему более подробно, а также демонстрирую одно возможное «решение» для выполнения действий на основе активного модуля: http://blog.evan.pro/module-specific-layouts-in-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->...
        });
    }
}
person EvanDotPro    schedule 15.10.2012

В контроллере вы можете получить активные модули следующим образом:

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

Затем вы можете проверить модуль, загруженный по имени модуля:

$moduleLoaded = in_array('ZfcUser', $moduleNames); //true or false
person AlloVince    schedule 15.10.2012

В контроллере вы можете проверить активный модуль таким образом

$bIsModule = (bool) $this->getEvent()
             ->getApplication()
             ->getServiceManager()
             ->get('modulemanager')
             ->getModule('ZfcUser'); // returns true or false
person Malay M    schedule 20.08.2015