web-dev-qa-db-fra.com

Ajouter une valeur numérique à chaque sous-menu de Joomla

<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_menu
 *
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Note. It is important to remove spaces between elements.
?>
<?php // The menu class is deprecated. Use nav instead. ?>
<ul class="nav menu<?php echo $class_sfx;?>"<?php
    $tag = '';

    if ($params->get('tag_id') != null)
    {
        $tag = $params->get('tag_id') . '';
        echo ' id="' . $tag . '"';
    }
?>>
<?php
$num = 1;
foreach ($list as $i => &$item)
{
    $class = 'item-' . $item->id;

    if ($item->id == $active_id)
    {
        $class .= ' current';
    }

    if (in_array($item->id, $path))
    {
        $class .= ' active';
    }
    elseif ($item->type == 'alias')
    {
        $aliasToId = $item->params->get('aliasoptions');

        if (count($path) > 0 && $aliasToId == $path[count($path) - 1])
        {
            $class .= ' active';
        }
        elseif (in_array($aliasToId, $path))
        {
            $class .= ' alias-parent-active';
        }
    }

    if ($item->type == 'separator')
    {
        $class .= ' divider';
    }

    if ($item->deeper)
    {
        $class .= ' deeper';
    }

    if ($item->parent)
    {
        $class .= ' parent';
    }

    if (!empty($class))
    {
        $class = ' class="' . trim($class) . '"';
    }

    echo '<li' . $class . '>';

    // Render the menu item.
    switch ($item->type) :
        case 'separator':
        case 'url':
        case 'component':
        case 'heading':
            require JModuleHelper::getLayoutPath('mod_menu', 'default_' . $item->type);
            break;

        default:
            require JModuleHelper::getLayoutPath('mod_menu', 'default_url');
            break;
    endswitch;

    // The next item is deeper.
    if ($item->deeper)
    {
        echo '<ul class="nav-child unstyled small lvl_'.($num++).'>';
    }
    elseif ($item->shallower)
    {
        // The next item is shallower.
        echo '</li>';
        echo str_repeat('</ul></li>', $item->level_diff);
    }
    else
    {
        // The next item is on the same level.
        echo '</li>';
    }
}
?></ul>

C'est le code important ici.

    {
        echo '<ul class="nav-child unstyled small lvl_'.($num++).'>';
    }

Le problème est que, lorsque mon site initialise, il ajoute 1 à chaque couche de sous-menu, mais ne recommence pas lorsque les couches sont les plus proches du parent.

Exemple C'est ce que je veux

 <ul class="lvl_1">
   <li>
      <ul class="lvl_2">
      </ul>
   </li>
 </ul>
 <ul class="lvl_1">
   <li>
      <ul class="lvl_2">
      </ul>
   </li>
 </ul>

C'est ce que je reçois

 <ul class="lvl_1">
   <li>
      <ul class="lvl_2">
      </ul>
   </li>
 </ul>
 <ul class="lvl_3">
   <li>
      <ul class="lvl_4">
      </ul>
   </li>
 </ul>

C’est probablement très facile à résoudre.

6
Cam

Au lieu d'utiliser et d'incrémenter $ num, remplacez-le par $ item-> level.

echo '<ul class="nav-child unstyled small lvl_'.$item->level.'">';

Remarque: Un code entre guillemets de clôture pour l'attribut de classe manquait également dans votre code.

9
Zachary Draper

C’est à partir d’un remplacement de module de menu que j’ai fait sur un ancien site joomla 2.5, qui traite de la même exigence. Je colle ici une première version du code du fichier default.php telle qu’elle existe dans ma version de développement locale à ce moment-là. Il est possible que j'ai modifié ou amélioré le code ultérieurement pour la version finale, mais je n'ai plus accès à ce code pour le coller ici. Donc, utilisez-le avec précaution ou signalez tout problème, je vais donc éditer le post ici.

Outre le niveau des éléments (li), il attribue également une classe aux sous-éléments.

<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_menu
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access.
defined('_JEXEC') or die;

// Note. It is important to remove spaces between elements.
?>

<ul class="menu<?php echo $class_sfx;?>"<?php
    $tag = '';
    if ($params->get('tag_id')!=NULL) {
        $tag = $params->get('tag_id').'';
        echo ' id="'.$tag.'"';
    }
?>>
<?php
foreach ($list as $i => &$item) :
    $class = 'item-'.$item->id;
    if ($item->id == $active_id) {
        $class .= ' current';
    }

    if (in_array($item->id, $path)) {
        $class .= ' active';
    }
    elseif ($item->type == 'alias') {
        $aliasToId = $item->params->get('aliasoptions');
        if (count($path) > 0 && $aliasToId == $path[count($path)-1]) {
            $class .= ' active';
        }
        elseif (in_array($aliasToId, $path)) {
            $class .= ' alias-parent-active';
        }
    }

    if ($item->deeper) {
        $class .= ' deeper';
    }

    if ($item->level == 1) {
        $class .= ' items-level1';
    }
    if ($item->level == 2) {
        $class .= ' items-level2';
    }

    if ($item->level == 3) {
        $class .= ' items-level3';
    }
    if ($item->level == 4) {
        $class .= ' items-level4';
    }

    if ($item->parent) {
        $class .= ' parent';
    }

    if (!empty($class)) {
        $class = ' class="'.trim($class) .'"';
    }

    echo '<li'.$class.'>';

    // Render the menu item.
    switch ($item->type) :
        case 'separator':
        case 'url':
        case 'component':
            require JModuleHelper::getLayoutPath('mod_menu', 'default_'.$item->type);
            break;

        default:
            require JModuleHelper::getLayoutPath('mod_menu', 'default_url');
            break;
    endswitch;

    // The next item is deeper.
    if ($item->deeper) {
        echo '<ul'; if($item->level == 1) {echo " class='first-subs'";} if($item->level == 2) {echo " class='second-subs'";}if($item->level == 3) {echo " class='third-subs'";}
        echo '>';
    }
    // The next item is shallower.
    elseif ($item->shallower) {
        echo '</li>';
        echo str_repeat('</ul></li>', $item->level_diff);
    }
    // The next item is on the same level.
    else {
        echo '</li>';
    }
endforeach;
?></ul>
2
FFrewin