繁体   English   中英

使用模板覆盖修改Joomla主菜单的子菜单

[英]Modifying Joomla Main Menu's submenu using template override

我想在Joomla模板的主菜单中实现以下目标:

    <ul class="topmenu">
         <li><a class="nav_link" id="active" href="#">Home</a></li><span class="separator"></span>
         <li><a class="nav_link" href="#">About Us</a></li><span class="separator"></span>
         <li><a class="nav_link" href="#">Services</a>
<div class="subnav_wrapper">
      <ul class="subnav">
       <li><a class="sub_nav_link" href="#">Custom Software</a></li>
       <li><a class="sub_nav_link" href="#">Software Solutions</a></li>
       <li><a class="sub_nav_link" href="#">Mobile SMS</a></li>
       <li><a class="sub_nav_link" href="#">Web Solutions</a></li>
       <li class="last"><a class="sub_nav_link" href="#">ICT Consultancy</a></li>
      </ul>
      </div>
     </li><span class="separator"></span>
</ul>

我已经覆盖了该模块的default.php文件(我已经将“ default.php”从“ modules \\ mod_mainmenu \\ tmpl”复制到“ templates \\ mytemplate \\ html \\ mod_mainmenu”中。)我可以区分顶级ul,li和a元素以及subnav中的元素,例如,要将类“ last”添加到subnav中的最后一个列表项,我尝试了以下方法:

if ($node->name() == 'ul') {
   foreach ($node->children() as $child)
   {
    if ($child->attributes('access') > $user->get('aid', 0)) {
     $node->removeChild($child);
    }
   }
   $children_count = count($node->children());
   $children_index = 0;
   foreach ($node->children() as $child) {
   if ($children_index == $children_count - 1) {
    $child->addAttribute('class', 'last');
   }
   $children_index++;
   }

 }

但以上内容也在顶级ul的最后一项中添加了该类。

使用模板覆盖方法是否可以达到预期效果?

为了在当前2.5.4版本的Joomla中为层次结构菜单的分支的最后和第一项指定lastfirst类,我将其添加到default.php (它已从modules\\mod_mainmenu\\tmpl\\复制到templates\\mytemplate\\html\\mod_mainmenu\\ )此代码:

后:

defined('_JEXEC') or die;

插入:

$last_items = array();
foreach( array_reverse( $list, true ) as $v ) {
    if( ! isset( $last_items[$v->parent_id] ) )
        $last_items[$v->parent_id] = $v->id;
}
$first_start = true;

并替换:

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

与:

if( $first_start ) {
    $class .= ' first';
    $first_start = false;
}
else if( in_array( $item->id, $last_items ) ) {
    $class .= ' last';
}

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

有可能被删除,例如 在顶级 ul 的最后一项中 添加 last -可以替换:

else if( in_array( $item->id, $last_items ) ) {
    $class .= ' last';
}

与:

else if( in_array($item->id, $last_items) && $item->level_diff > 0 ) {
    $class .= ' last';
}

不确定菜单的模板替代。 您可以查看http://extensions.joomla.org/extensions/structure-a-navigation/menu-systems/tree-menus/163 ,这是自定义菜单的绝佳模块。

另外,如果您只想设置菜单项的样式,则可以在CSS中使用ul li:last-child进行查找。 请注意,并非所有浏览器都完全支持此功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM