/** * loadModules * * Once all the modules are loaded, loop * * @param ModuleEvent $e * @return void */ public function onLoadModules(ModuleEvent $e) { $moduleManager = $e->getTarget(); $events = $moduleManager->getEventManager()->getSharedManager(); if (!$events) { return; } // Shared instance for module manager $events->attach('Zend\\Mvc\\Application', ModuleManager::EVENT_BOOTSTRAP, function (MvcEvent $e) use($moduleManager) { $moduleClassName = get_class($moduleManager); $moduleClassNameArray = explode('\\', $moduleClassName); $moduleClassNameAlias = end($moduleClassNameArray); $application = $e->getApplication(); $services = $application->getServiceManager(); if (!$services->has($moduleClassName)) { $services->setAlias($moduleClassName, $moduleClassNameAlias); } }, 1000); if (0 === count($this->modules)) { return; } // Attach to the bootstrap event if there are modules we need to process $events->attach('Zend\\Mvc\\Application', ModuleManager::EVENT_BOOTSTRAP, [$this, 'onBootstrap'], 1000); }
/** * @param ModuleEvent $e * @return void */ public function __invoke(ModuleEvent $e) { $module = $e->getModule(); if (!$module instanceof ThemeProviderInterface && !method_exists($module, 'initTheme')) { return; } $moduleManager = $e->getTarget(); $events = $moduleManager->getEventManager(); $sharedEvents = $events->getSharedManager(); $module_directory = $module->getDir(); $sharedEvents->attach('Zend\\Mvc\\Application', MvcEvent::EVENT_BOOTSTRAP, function ($e) use($module_directory) { $application = $e->getApplication(); $eventManager = $application->getEventManager(); $serviceManager = $application->getServiceManager(); $themeManager = $serviceManager->get('ThemeManager'); $theme = $themeManager->getTheme(); $theme_folder = $theme->getFolder(); $theme_path = $module_directory . '/themes/' . $theme_folder; if (!is_dir($theme_path)) { $theme = $themeManager->getDefaultTheme(); $theme_folder = $theme->getFolder(); if (!is_dir($theme_path)) { throw new MissingDefaultThemeException(); } } $theme_path = $module_directory . '/themes/' . $theme->getFolder(); // Views // Add the folder to the template resolver. $templatePathResolver = $serviceManager->get('Zend\\View\\Resolver\\TemplatePathStack'); $templatePathResolver->addPath($theme_path); // Layout if (file_exists($theme_path . '/layout.phtml')) { $templateMapResolver = $serviceManager->get('Zend\\View\\Resolver\\TemplateMapResolver'); $layout_name = $theme->getLayoutName(); if (!$templateMapResolver->has($layout_name)) { $templateMapResolver->add($layout_name, $theme_path . '/layout.phtml'); } } }); $sharedEvents->attach($module->getNamespace(), MvcEvent::EVENT_DISPATCH, function ($e) use($module_directory) { // Set the layout for this module if available $serviceManager = $e->getApplication()->getServiceManager(); $themeManager = $serviceManager->get('ThemeManager'); $theme = $themeManager->getTheme(); $theme_folder = $theme->getFolder(); $theme_path = $module_directory . '/themes/' . $theme_folder; if (!is_dir($theme_path)) { $theme = $themeManager->getDefaultTheme(); $theme_folder = $theme->getFolder(); if (!is_dir($theme_path)) { throw new MissingDefaultThemeException(); } } $layout_name = $theme->getLayoutName(); $templateMapResolver = $serviceManager->get('Zend\\View\\Resolver\\TemplateMapResolver'); if ($templateMapResolver->has($layout_name)) { $viewModel = $e->getViewModel(); $viewModel->setTemplate($layout_name); } }, 100); }