it-swarm.dev

Aggiunta di un valore numerico a ciascun sottomenu in 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>

Questo è il codice importante proprio qui.

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

Il problema è che quando il mio sito viene inizializzato, aggiunge più 1 a ogni livello di sottomenu ma non ricomincia da capo quando i livelli sono più vicini al genitore.

Esempio Questo è quello che voglio

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

Questo è quello che ottengo

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

Questo è probabilmente super facile da risolvere.

6
Cam

Invece di usare e incrementare $ num, sostituiscilo con $ item-> level.

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

Nota: nel codice mancava anche una doppia virgoletta di chiusura per l'attributo class.

9
Zachary Draper

Questo è da una sostituzione del modulo del menu che ho fatto su un precedente sito di Joomla 2.5, che si occupa dello stesso requisito. Ho incollato qui una versione precedente del codice dal file default.php come esiste nella mia versione di sviluppo locale in quel momento. È possibile che in seguito abbia modificato o migliorato ulteriormente il codice per la versione finale, ma non ho più accesso a quel codice per incollarlo qui. Quindi usalo con cautela o segnala eventuali problemi, quindi modificherò il post qui.

Oltre al livello degli oggetti (li), assegna anche una classe ai sottomarini.

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