Bonjour,

Voila je rencontre un petit problème avec mon code, j'ai un soucis avec la classe 'active' qui chez moi est nommée "current" .

voici le structure HTML des lien de mon menu:

<li><a href="/" class="link current">Accueil</a></li> et voici mon code PHP:
<?php
  function nav__item(string $lien, string $title): string
  {
      $classes = 'link';
      if ($_SERVER['SCRIPT_NAME'] === $lien) {
          $classes .=' current';
      }
      return <<<HTML
      <li>
            <a href="$lien" class="$classes">$title</a>
      </li>
HTML;

  }

?>

le lien en php
<?= nav__item('/index.php', 'Accueil') ?>
<?= nav__item('/tutoriels.php', 'Tutoriels') ?>

je ne comprend pas où est le problème, merci d'avance!

8 réponses


MrZoki
Réponse acceptée

Autre chose, comment est nommé la page sur laquelle tu testes ce code? parce que si tu le test sur une page qui ne s'appel ni index.php ni tutoriels.php forcement ton code ne fera pas ce que tu attends de lui. Verifie bien que tu n'as pas mis de majscule en nommant tes fichiers et dis nous ce que ca donne :-)

Edit : Je viens de m'apercevoir d'une chose qui doit solutionner ton probleme. Pour que ton code fonctionne il faut que ton fichier soit à la racine de ton site. Si tu es dans un dossier il faut que ta fonction aille le chercher dans le dossier sinon il faut que tu ecrives le chemin complet comme ceci :

nav__item('/nom_du_dossier/index.php', 'Accueil');

pour savoir ce que renvoi $_SERVER['SCRIPT_NAME'] fais un var_dump comme ceci :

var_dump($_SERVER['SCRIPT_NAME']);

tu auras alors le chemin complet de ton fichier qui doit correspondre au premier argument de ta fonction nav_item().

Bonjour, pour ta page d'accueil il y a deux possibilités soit / soit /index.php, ton problème vien peut être de là... si c'est pas ça précise le problème que tu observes...

Bjr </lex>,
le problème persiste, je n'ai toujours pas la class current qui est ajoutée au lien du menu, lorsque j'inspecte la lien le constate que la class current est grissée' (elle n'est pas prise en compte).

Quand j'essai ton code j'ai la class "current" sur le lien Accueil mais pas sur le lien Tutoriels c'est le résultat que tu attends ? sinon decrit precisement ce que tu veux obtenir.

Bjr,
moi j'ai même pas la class 'current sur mon lien Accueil, en faite lorsqu'il la class 'current sur un lien, celui se voit appliqué un traiit en dessous du lien et le but est de generer automatiquement le changement de l'etat current selon qu'on ai sur une page donnée. mais j'ai pas ce comportement sur mes liens.
Si le met la class 'current en dur la stylisation se fait, donc c'est pas un problème de code CSS, le probleme est au niveau de mon cote php.

Bsr, ok merci pour votre implication , je vais revoir tout le code de mon site et revoir ma configuration , peut etre le problème vient de ma configuration.

Problème resolus, le problème si je peux m'exprimé ainsi venait l'url generée par mon editeur(phpstorm) : http://localhost:63342/blog_dywants/index.php, or moi j'ai mis comme url des page sans le nom du dossier de mon projet(blog_dywants)resultat le lien n'etait pas egal( if ($_SERVER['SCRIPT_NAME'] === $lien)),
alors jai juste ecris ainsi:
<?= nav__item('/blog_dywants/index.php', 'Accueil') ?>
<?= nav__item('/blog_dywants/tutoriels.php', 'Tutoriels') ?>
@MrZoki c'est votre reponse qui ma mit la puce a l'oreille
je debute avec phpstorm, j'imagine qu'il doit avoir une configuration que je devrais faire qui qu'il ait plus ce problème, si vous vous savez comment faire je suis preneur.
merci pour tout!

Hello,
bon c'est résolu mais peut-être :

if (basename(__FILE__) === $lien) à la place de if ($_SERVER['SCRIPT_NAME'] === $lien)
<a href="/$lien" class="$classes">$title</a> à la place de <a href="$lien" class="$classes">$title</a>
et
<?= nav__item('index.php', 'Accueil') ?> à la place de <?= nav__item('/index.php', 'Accueil') ?>

j'imagine que tu include un fichier menu.php dans toutes tes pages, donc je ne sais pas comment se comporte basename(FILE) dans ces conditions...
++