it-swarm-es.tech

Agregar un valor numérico a cada submenú en 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>

Este es el código importante aquí.

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

El problema es que cuando mi sitio se inicializa, agrega más 1 a cada capa de submenú, pero no comienza de nuevo cuando las capas están más cerca del padre.

Ejemplo Esto es lo que quiero

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

Esto es lo que obtengo

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

Esto probablemente sea muy fácil de arreglar.

6
Cam

En lugar de usar e incrementar $ num, reemplácelo con $ item-> level.

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

Nota: A su código también le faltaba una comilla doble de cierre para el atributo de clase.

9
Zachary Draper

Esto es de una anulación del módulo de menú que hice en un sitio anterior de joomla 2.5, que trata con el mismo requisito. Pego aquí una versión anterior del código del archivo default.php como existe en mi versión de desarrollo local en ese momento. Es posible que luego haya modificado o mejorado el código para la versión final, pero ya no tengo acceso a ese código para pegarlo aquí. Úselo con precaución o informe cualquier problema, así que editaré la publicación aquí.

Junto con el nivel de elementos (li), también asigna una clase a los 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>
2
FFrewin