Voici un problème récurent quand on créé un site web : passer un élément de menu en « activé » quand le contenu de celui-ci est affiché. Dans Symfony, rien de mieux que le lib de l’application pour cela. Dans le fichier /root/apps/[app_name]/lib/NavigationHelper.php, j’ai mis en place la fonction suivante.
<?php /** * check if navigation element is active by checking for a request * parameter element and return css class * @param $conditions * @param String $defaultParameterName * @param String $cssClass * * Usage : test module AND action : * nav_active('module/action'); => return the css class if module AND the action names fit. * Usage : test many parameters (OR function) : * nav_active(array('param1' => 'default','param2' => 'new')); => return the css class if module OR the action names fit. * Usage : accept many values for a parameter : * nav_active(array('default','job'),'module'); => return the css class if module name fit 'default' OR 'job'. * Usage : accept value for many parameters : * nav_active('default',array('module','action')); => return the css class if module OR action name fit 'default'. * Usage : As a default, module, action and alias are tested : * nav_active('default') => return the css class if module OR action name OR alias fit 'default'. */ function nav_active($conditions, $defaultParametersName=null, $cssClass="here") { $requestParams = sfContext::getInstance()->getRequest()->getParameterHolder()->getAll(); if (!$defaultParametersName) $defaultParametersName = array('alias','module','action'); if(!is_array($conditions)) { $temp = $conditions; $conditions = array(); $conditions[] = $temp; } if(!is_array($defaultParametersName)) { $temp = $defaultParametersName; $defaultParametersName = array(); $defaultParametersName[] = $temp; } // print_r ($conditions); foreach($conditions as $parameterName => $values) { if(!is_array($values)) { $temp = $values; $values = array(); $values[] = $temp; } if(is_numeric($parameterName)) { $parametersName = $defaultParametersName; } else { $parametersName[] = $parameterName; } foreach($values as $thisValue) { if ($pos = strpos($thisValue,'/')){ if ($requestParams['module'] == substr($thisValue,0,$pos) && $requestParams['action'] == substr($thisValue,$pos+1)) { return 'class="'.$cssClass.'"'; } } else { foreach ($parametersName as $parameterName) { if (array_key_exists($parameterName,$requestParams)) { if ($requestParams[$parameterName] == $thisValue) { return $cssClass; } } } } } } return ''; }
Ensuite, il suffit de faire appel à cette fonction dans le menu en question, dans la balise de votre choix, par exemple dans le LI :
...<li class="<?php echo nav_active('job') ?> "><a href="ici.html" >Lien</a></li>
Cet exemple ajoutera la classe « here » si l’un paramètre « module », « action » ou « alias » a la valeur « job ». D’autres exemples sont visible en début de fonction.
Enjoy