0

Symfony : Menu sélectionné et activé

2011-06-28 dans Réalisations par vibby

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

Envoyer mon retour






5 + = 14