2013-04-18 15 views
6

Jak mogę uzyskać w ZF2 nazwę bieżącego (wybranego) modułu w układzie aplikacji? Cel: Mój układ aplikacji obejmuje główne menu aplikacji zf2, a za każdym razem, gdy wybrany jest moduł, muszę zaznaczyć głos menu modułu. Również muszę ustawić poprawną trasę (adres URL, działanie), gdy menu jest wykonane z tym dla. Każdy moduł ma głos menu:ZF2: Pobierz nazwę modułu (lub trasę) w layoucie aplikacji dla podświetlenia menu

<ul class="nav"> 
<?php foreach ($menu_modules as $mod): 
    $is_active = ($mod['name'] == $CURRENT_MODULE_NAME)?'selected':'';//GET MODULE NAME 
?> 
<!-- class="active" --> 
<li><a href="#" <?php echo $is_active;?> ><?php echo $mod['title']; ?></a></li> 
<?php endforeach; ?> 

<li><a href="<?php echo $this->url('login/process', array('action'=>'logout')); ?>"><?php echo $this->translate('Logout') ?></a></li> 
</ul> 

<div class="row-fluid" id="main_container"> 
    <?php echo $this->content; ?> 
</div> 

Odpowiedz

8

znam jej zbyt późno, aby odpowiedzieć na to pytanie, a także, że istnieje wiele odpowiedzi już dostępne, ale tylko w przypadku ktoś ogląda to pytanie, może okazać się pomocne.

W podstawowym lub dowolnego modułu Module.php, piszę -

class Module { 

    public function onBootstrap(MvcEvent $e) { 

     $sm = $e->getApplication()->getServiceManager(); 

     $router = $sm->get('router'); 
     $request = $sm->get('request'); 
     $matchedRoute = $router->match($request); 

     $params = $matchedRoute->getParams(); 

     $controller = $params['controller']; 
     $action = $params['action']; 

     $module_array = explode('\\', $controller); 
     $module = array_pop($module_array); 

     $route = $matchedRoute->getMatchedRouteName(); 

     $e->getViewModel()->setVariables(
      array(
       'CURRENT_MODULE_NAME' => $module, 
       'CURRENT_CONTROLLER_NAME' => $controller, 
       'CURRENT_ACTION_NAME' => $action, 
       'CURRENT_ROUTE_NAME' => $route, 
      ) 
     ); 
    } 
} 

Następnie można użyć $CURRENT_MODULE_NAME zmienną w pliku układu (jak to zrobiono w samym pytaniu). W razie potrzeby można użyć pozostałych zmiennych wymienionych w powyższym kodzie.

+0

To zadziałało dla mnie, z modyfikacją zgodnie z odpowiedzią Porta Tela bbuilding –

2

Wolę łatwiejszy sposób bez czynienia z Module.php

Umieść ten kod w layout.phtml

$routeName = $this->getHelperPluginManager()->getServiceLocator()->get('Application') 
       ->getMvcEvent()->getRouteMatch()->getMatchedRouteName(); 
if($routeName === "users") ... 
+0

, ale to nie zwróci skróconej nazwy modułu, jeśli jesteśmy na ścieżce podrzędnej. Na przykład może zwrócić MODULENAME/default – albanx

1

Korzystanie array_shift zamiast array_pop (Kunal Dethe odpowiedź):

$controller = $this->getParam('controller'); 
$module_array = explode('\\', $controller); 
$module = array_shift($module_array);