web-dev-qa-db-fra.com

Masquer l'élément de menu enfant en fonction d'un nom de classe

J'ai la structure de menu suivante:

Genre - Fiction - Autobiographie - Sci Fi - Autres [class = "hide"]

Le menu créé est alors/genre/fiction/,/genre/other /. J'essaie de ne pas afficher/other dans la liste des éléments de menu, ce que je peux facilement faire en utilisant JavaScript pour masquer l'élément de liste parent. Mais cela reste visible pour les robots d'exploration que j'essaie d'éviter. Je pourrais le placer dans un menu non publié/caché, mais cela signifierait que je perds le "genre" de niveau supérieur puisque le/autre deviendra le niveau supérieur puisque les autres n'auront aucun parent.

Donc, la seule méthode que je peux imaginer est de créer une substitution mod_menu (default_url.php) et de rechercher une classe définie dans le backend. Si cette classe est définie pour un élément de menu, ne l'affichez pas.

Où irait la condition if/else dans le code suivant pour qu'elle n'apparaisse pas ou à tout le moins; pour qu'il n'y ait pas de lien même si le texte est affiché? J'ai essayé de le mettre en ligne 4 mais tous les liens se sont simplement transformés en lien vers la page d'accueil.

    switch ($item->browserNav) :
    default:
    case 0:
?><a <?php echo $class; ?>href="<?php echo $flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
    case 1:
        // _blank
?><a <?php echo $class; ?>href="<?php echo $flink; ?>" target="_blank" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
    case 2:
        // window.open
        $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,'.$params->get('window_open');
            ?><a <?php echo $class; ?>href="<?php echo $flink; ?>" onclick="window.open(this.href,'targetWindow','<?php echo $options;?>');return false;" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
endswitch;
2
sifu

En utilisant la méthode que vous allez utiliser ici, voici comment j'imagine atteindre cet objectif;

  1. Tout d’abord, il est possible que le nom de votre menu ait plusieurs classes. Vous devez donc vérifier si le nom de votre classe est contenu dans$class, par opposition à exactement égal à elle. Vous pouvez le faire avec la fonction strpos de PHP (attention toutefois aux correspondances partielles - pour plus d'informations à ce sujet plus tard).
  2. Maintenant, étant donné que votre instruction switch semble générer une variante différente du même élément de menu (en fonction de l’emplacement du lien), vous voudrez probablement envelopper l’intégralité de l’instruction dans une clause if pour la comparer au nom de la classe. - plutôt que juste une sous-partie de celle-ci;

    $class = "apples oranges pears"; // contains 3 different classes
    
    if (strpos($class, "oranges") !== false)
    {
        // DON'T show the menu item, because 'oranges' was detected
    }
    else
    {
        // your whole switch statement goes here
        switch ($item->browserNav) :
           // blah blah blah ...
        endswitch;
    }
    

Sachez que strpos devra évaluer EXACTEMENT 'pas faux', (! ==), par opposition à la base 'pas faux' (! =), Car il interprètera incorrectement la position 0 comme faux si vous ne le faites pas. 't.

Concernant les correspondances de classe partielles - si, dans l'exemple ci-dessus, vous recherchiez une classe appelée pea, elle correspondrait toujours à peaches. La solution la plus simple consiste donc simplement à vous assurer que votre classe le nom est suffisamment distinct - sinon vous devrez écrire du code plus élaboré (peut-être en utilisant des expressions régulières ou une autre fonction utile à laquelle je ne peux pas penser tout de suite).

J'espère que c'est utile.

2
Hobbes

Mais cela reste visible pour les robots d'exploration que j'essaie d'éviter.

Chaque élément de menu a une option "Robots" dans l'onglet "Métadonnées". Réglez-le sur "Pas d’index, pas de suite" et les moteurs de recherche ne doivent plus indexer votre page.

2
fruppel