Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
192 lines (170 sloc) 5.05 KB
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_Mvc
*/
namespace Zend\Mvc\View\Http;
use Zend\EventManager\EventManagerInterface as Events;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\Filter\Word\CamelCaseToDash as CamelCaseToDashFilter;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\ModuleRouteListener;
use Zend\View\Model\ModelInterface as ViewModel;
class InjectTemplateListener implements ListenerAggregateInterface
{
/**
* FilterInterface/inflector used to normalize names for use as template identifiers
*
* @var mixed
*/
protected $inflector;
/**
* Listeners we've registered
*
* @var array
*/
protected $listeners = array();
/**
* Attach listeners
*
* @param Events $events
* @return void
*/
public function attach(Events $events)
{
$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'injectTemplate'), -90);
}
/**
* Detach listeners
*
* @param Events $events
* @return void
*/
public function detach(Events $events)
{
foreach ($this->listeners as $index => $listener) {
if ($events->detach($listener)) {
unset($this->listeners[$index]);
}
}
}
/**
* 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;
}
}
Something went wrong with that request. Please try again.