Source of file InjectTemplateListener.php
Size: 6,813 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Mvc/View/Http/InjectTemplateListener.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Mvc\View\Http; use Zend\EventManager\AbstractListenerAggregate; use Zend\EventManager\EventManagerInterface as Events; use Zend\Filter\Word\CamelCaseToDash as CamelCaseToDashFilter; use Zend\Mvc\MvcEvent; use Zend\Mvc\ModuleRouteListener; use Zend\View\Model\ModelInterface as ViewModel; class InjectTemplateListener extends AbstractListenerAggregate { /** * FilterInterface/inflector used to normalize names for use as template identifiers * * @var mixed */ protected $inflector; /** * Array of controller namespace -> template mappings * * @var array */ protected $controllerMap = array(); /** * {@inheritDoc} */ public function attach(Events $events) { $this->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', ''); } $template = $this->mapController($controller); if (!$template) { $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); } /** * Set map of controller namespace -> template pairs * * @param array $map * @return self */ public function setControllerMap(array $map) { krsort($map); $this->controllerMap = $map; return $this; } /** * Maps controller to template if controller namespace is whitelisted or mapped * * @param string $controller controller FQCN * @return string|false template name or false if controller was not matched */ public function mapController($controller) { foreach ($this->controllerMap as $namespace => $replacement) { if ( // Allow disabling rule by setting value to false since config // merging have no feature to remove entries false == $replacement // Match full class or full namespace || !($controller === $namespace || strpos($controller, $namespace . '\\') === 0) ) { continue; } $map = ''; // Map namespace to $replacement if its value is string if (is_string($replacement)) { $map = rtrim($replacement, '/') . '/'; $controller = substr($controller, strlen($namespace) + 1); } //strip Controller namespace(s) (but not classname) $parts = explode('\\', $controller); array_pop($parts); $parts = array_diff($parts, array('Controller')); //strip trailing Controller in class name $parts[] = $this->deriveControllerClass($controller); $controller = implode('/', $parts); $template = trim($map . $controller, '/'); //inflect CamelCase to dash return $this->inflectName($template); } return false; } /** * 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; } } |