Aller au contenu

Problème logique (class différente en fonction...


Loupilo

Sujets conseillés

Salut à tous,

Je souhaite insérer un menu sur mon site (<ul><li>...</li></ul) et attribuer une class différente à l'élément de la liste qui est la page visitée.

Pour cela je peux récupérer le chemin de la page en PHP, voir qu'il contient "categorie1" pour mettre l'élément catégorie1 avec une class spéciale.

Seulement voila, pour écrire ce script j'ai une défaillance de logique : je ne vois pas quelle est la meilleure solution pour faire ça.

J'ai pensé à enregistrer dans $li : '<li>' et dans $lis : '<li class="special">' puis mettre dans $elements un array qui contient les différentes possibilités (<a href="/categorie1">categorie1</a>, <a href="/categorie2">categorie2</a>...)

Ensuite si l'URL contient categorie2, j'utilise :

echo $li $elements[0] </li>; // affiche un li normal pour la catégorie non-active
echo $lis $elements[1] </li>;// affiche un li special pour la categorie2 car c'est elle qui est visitée

(je sais que la syntaxe de mes echo est fausse :P)

Mais le problème avec cette solution c'est qu'elle est lourde : si l'adresse contient categorie1 alors il faut afficher

echo $lis $elements[0] </li>; 
echo $li $elements[1] </li>;

Sinon si elle contient categorie2 il faut afficher

echo $lis $elements[0] </li>; 
echo $li $elements[1] </li>;

et ça s'il y a 10 catégories :gueule:

Je ne vois pas comment faire ça proprement et le plus simplement possible.

Déjà, est-ce que ma solution est la seule // la plus simple/rapide ?

Sinon, que feriez-vous pour réaliser ce menu ?

Merci

Loupilo

Lien vers le commentaire
Partager sur d’autres sites

Salut Loupilo,

Déjà si tu as 10 catégories il faut simplifier le code.

Sans connaître ton code php, on ne peut qu'être approchant.

Donc un pseudo code serait du style:

foreach ($elements as $element) {
  if($elementcategory == $activecategory)
     print "<li class=\"special\">";
  else
     print "<li>";
  print $element."</li>";
}

Dans lequel $elements est le tableau de tes éléments, et $elementscategory est la catégorie de cet élément. A toi de remplacer cela par le code qui permet de retrouver la catégorie d'un élément. ;)

Dan

Lien vers le commentaire
Partager sur d’autres sites

Ouahou, magnifique, je n'esperais pas que ce soit si court :fou:

<?php
$adresseencours = $_SERVER[REQUEST_URI];
$elements = array ("categorie1", "categorie2", "categorie3", "categorie4", "categorie5", "categorie1" "categorie7" "categorie8");
foreach ($elements as $element) {
 if(preg_match("!$element!i", $adresseencours)) {
    echo "<li class=\"special\">";
    }
 else {
    echo "<li>"; }
echo $element."</li>";
}
?>

Et ça roule !

Merci beaucoup Dan :)

[Edition: tiens d'ailleurs une petite question bête : dans la doc PHP il est écrit qu'utliser preg_match pour ça était trop lourd, qu'il vaut mieux utiliser strpos() ou strstr(), cependant strpos() trouve la position d'un caractère dans une chaîne et strstr() trouve la première occurrence dans une chaîne... ce n'est pas ce que je veux faire, peut-on utiliser ces fonctions pour l'usage que je fais de preg_match ? Et surtout, une de ces fonctions peut-elle être insensible aux caractères accentués (é == è == e) ?]

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Il y a aussi la possibilité de définir une class à l'élément body dynamiquement, puis d'avoir un CSS de ce genre

.categorie1 #categorie1 {color:#f00;}

La class serait celle du body, l'id celle du lien-liste, définie au préalable.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...