Oft benötigt man in den View – Files die aktuelle Route, den Controllernamen und den Actionnamen. In Zend2 ist es ganz einfach zu lösen. Zuerst brauch man einen View Helper, der einen in den View – Files zur Verfügung steht.
use Zend\View\Helper\AbstractHelper;
class RouteHelper extends AbstractHelper
{
protected $routeMatch;
public function __construct($routeMatch){
$this->routeMatch = $routeMatch;
}
public function __invoke(){
return $this;
}
public function getControllerName(){
if($this->routeMatch != null){
return $this->routeMatch->getParam('controller', 'index');
}
return '';
}
public function getMatchedRoute(){
if($this->routeMatch != null){
return $this->routeMatch->getMatchedRouteName();
}
return '';
}
public function activeIfMatch($route, $action = null){
if($this->getMatchedRoute() == $route){
if($action == null || $this->routeMatch->getParam('action', 'index') == $action){
return 'active';
}
}
return '';
}
}
In der Module Klasse
...
public function onBootstrap(MvcEvent $e)
{
$e->getApplication()->getServiceManager()->get('translator');
$eventManager = $e->getApplication()->getEventManager();
//view helper for route name
$e->getApplication()->getServiceManager()->get('viewhelpermanager')->setFactory('routeHelper', function($sm) use ($e) {
$viewHelper = new \AAUShare\Helper\RouteHelper($e->getRouteMatch());
return $viewHelper;
});
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
}
...
Wichtig ist hier vor allem die Methode activeIfMatch welche eine Route und eine Action erwartet. Wenn diese erfüllt sind so wird active zurückgegeben. Dies habe ich vor allem mit den Gedanken gebaut nur mehr diese Methode in der View ausgeben zu müssen (z.B. um den Menüpunkt als active zu Markieren). In der View dann:
... <li class="<?php echo $this->routeHelper()->activeIfMatch('home'); ?>"><a ...