listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'injectTemplate'), -90); } /** * Inject a template into the view model, if none present * * Template is derived from the controller found in the route match, and, * optionally, the action, if present. * * @param MvcEvent $e * @return void */ public function injectTemplate(MvcEvent $e) { $model = $e->getResult(); if (!$model instanceof ViewModel) { return; } $template = $model->getTemplate(); if (!empty($template)) { return; } $routeMatch = $e->getRouteMatch(); $controller = $e->getTarget(); if (is_object($controller)) { $controller = get_class($controller); } if (!$controller) { $controller = $routeMatch->getParam('controller', ''); } $module = $this->deriveModuleNamespace($controller); if ($namespace = $routeMatch->getParam(ModuleRouteListener::MODULE_NAMESPACE)) { $controllerSubNs = $this->deriveControllerSubNamespace($namespace); if (!empty($controllerSubNs)) { if (!empty($module)) { $module .= '/' . $controllerSubNs; } else { $module = $controllerSubNs; } } } $controller = $this->deriveControllerClass($controller); $template = $this->inflectName($module); if (!empty($template)) { $template .= '/'; } $template .= $this->inflectName($controller); $action = $routeMatch->getParam('action'); if (null !== $action) { $template .= '/' . $this->inflectName($action); } $model->setTemplate($template); } /** * Inflect a name to a normalized value * * @param string $name * @return string */ protected function inflectName($name) { if (!$this->inflector) { $this->inflector = new CamelCaseToDashFilter(); } $name = $this->inflector->filter($name); return strtolower($name); } /** * Determine the top-level namespace of the controller * * @param string $controller * @return string */ protected function deriveModuleNamespace($controller) { if (!strstr($controller, '\\')) { return ''; } $module = substr($controller, 0, strpos($controller, '\\')); return $module; } /** * @param $namespace * @return string */ protected function deriveControllerSubNamespace($namespace) { if (!strstr($namespace, '\\')) { return ''; } $nsArray = explode('\\', $namespace); // Remove the first two elements representing the module and controller directory. $subNsArray = array_slice($nsArray, 2); if (empty($subNsArray)) { return ''; } return implode('/', $subNsArray); } /** * Determine the name of the controller * * Strip the namespace, and the suffix "Controller" if present. * * @param string $controller * @return string */ protected function deriveControllerClass($controller) { if (strstr($controller, '\\')) { $controller = substr($controller, strrpos($controller, '\\') + 1); } if ((10 < strlen($controller)) && ('Controller' == substr($controller, -10)) ) { $controller = substr($controller, 0, -10); } return $controller; } }