6
<?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>

This is the important code right here.

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

The issue, is that when my site initializes it adds plus 1 to every submenu layer but doesnt start over when the layers are closest to the parent.

Example This is what I want

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

This is what I get

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

THis is probably super easy to fix.

migrated from stackoverflow.com May 15 '14 at 17:55

This question came from our site for professional and enthusiast programmers.

  • What version of Joomla are you using? That looks like you've changed a core file rather than creating a module or layout override. Changing core files is a really bad idea as they could get blown away by the next security patch or feature update that Joomla releases. – Craig May 14 '14 at 22:31
  • I did change a core file, after I moved it to the Template folder. Joomla 3 – Cam May 15 '14 at 17:27
  • You mean after you copied it to the Template folder right? – Craig May 15 '14 at 21:43
  • 1
    Why do you even need this kind of class / selector system? I can't think of any css or javascript markup that would require the type of classes you're trying to generate here. What's the end goal? – Chad Windnagle May 18 '14 at 3:28
  • Maybe I am writing a custom menu that involves some PHP action and Javascript as well. I want to make it so my javascript iterates the UL but doesnt create Sub nav Classes like megamenu does. The end game is for leveling through sub menu's – Cam May 19 '14 at 4:10
9

Instead of using and incrementing $num, replace that with $item->level.

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

Note: Your code was missing a closing double quote for the class attribute as well.

  • And you can use "$class .= ' li-level-'.$item->level;" direct after "$class = 'item-'.$item->id;" to add level class to li element. – Joomla Agency May 17 '14 at 8:33
2

This is from a menu module override I did on a past joomla 2.5 site, that deals with the same requirement. I paste here an early version of the code from default.php file as exists in my local dev version at that time. It is possible that I further modified or improved the code later for the final version, but I don't have access anymore to that code to paste it here. So use it with caution or report back any issues, so I will edit the post here.

Alongside with the items (li) level, it also assign a class to the sub uls.

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.