Problème avec la class active sur un menu

177925
,

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!

11 Réponse

Default
,

Bonjour,
moi non plus : pas d'erreur décrite ou comportement observé vs attendu ?
on sait juste que cela ne fonctionne pas comme tu veux

37410
,

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...

177925
,

Bjr ,
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).

Default
,

donc elle est affichée dans le code généré, mais n'a pas d'effet dans le navigateur ?

162065
,

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.

177925
,

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.

Default
,

Chez moi, ton code fonctionne correctement, que ce soit sur une page index.php, ou bien une page test.php

as tu essayé de mettre des var_dump dans tes fonctions pour voir ce qu'il se passait plus en détail ?

177925
,

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.

162065
,

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().

177925
,

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!

112438
,

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...
++