Skip to content

Instantly share code, notes, and snippets.

@betweenbrain
Created July 13, 2012 20:30
Show Gist options
  • Save betweenbrain/3107246 to your computer and use it in GitHub Desktop.
Save betweenbrain/3107246 to your computer and use it in GitHub Desktop.
Ye olde first and last menu item classes override for Joomla 2.5 / 3.0
<?php
/**
* @package Joomla.Site
* @subpackage mod_menu
*
* @copyright Copyright (C) 2005 - 2012 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.
// Establish a counter for placement.
$count = 0;
?>
<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';
}
}
// Negate count if next item is a child. Will be 0 for first child once incremented. Can't use $item->parent in case sub-menu isn't rendered.
if ($item->deeper) {
$class .= ' deeper';
$count = -1;
}
// If first item to be counted or first in the list array.
if ($count == 0 || $i == 0) {
$class .= ' first';
}
// Last item of the level or last in the list array.
if ($item->shallower || $item == end($list)) {
$class .= ' last';
}
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>';
}
// 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>';
}
// Increment the count
$count++;
endforeach;
?></ul>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment