Page 1 of 1

[LOW:KNOWN ISSUE:1.0.11] Fix for submenu

Posted: Sat Oct 07, 2006 12:21 pm
by Sal
Hello,
  joomla writes an id="active_menu" on the active menu item.
the problem is that it adds the same id even for the submenus.
This is an error reported by the css validator because you can't have more tags with the same id.
Also, it unables you to have a different style for the active submenu item.

so i made a little fix in the mosGetMenuLink function that you can find int joomla/modules/mod_mainmenu.php

Code: Select all

/**
* Utility function for writing a menu link
*/
function mosGetMenuLink( $mitem, $level=0, &$params, $open=null ) {
  global $Itemid, $mosConfig_live_site, $mainframe;

  $txt = '';
		
  switch ($mitem->type) {
    case 'separator':
    case 'component_item_link':
      break;
			
    case 'url':
      if ( eregi( 'index.php\?', $mitem->link ) ) {
        if ( !eregi( 'Itemid=', $mitem->link ) ) {
          $mitem->link .= '&Itemid='. $mitem->id;
        }
      }
      break;
				
    case 'content_item_link':
    case 'content_typed':
      // load menu params
      $menuparams = new mosParameters( $mitem->params, $mainframe->getPath( 'menu_xml', $mitem->type ), 'menu' );
				
      $unique_itemid = $menuparams->get( 'unique_itemid', 1 );
				
      if ( $unique_itemid ) {
        $mitem->link .= '&Itemid='. $mitem->id;
      } else {
        $temp = split('&task=view&id=', $mitem->link);
					
        if ( $mitem->type == 'content_typed' ) {
          $mitem->link .= '&Itemid='. $mainframe->getItemid($temp[1], 1, 0);
        } else {
          $mitem->link .= '&Itemid='. $mainframe->getItemid($temp[1], 0, 1);
        }
      }
      break;

    default:
      $mitem->link .= '&Itemid='. $mitem->id;
      break;
  }

  // Active Menu highlighting
  $current_itemid = $Itemid;
  if ( !$current_itemid ) {
    $id = '';
  } else if ( $current_itemid == $mitem->id ) {
    //---Sal
    if ($level > 0 ) {
      $id = 'id="active_submenu'. $params->get( 'class_sfx' ) .'"';
    } else {
      $id = 'id="active_menu'. $params->get( 'class_sfx' ) .'"';
    }
    //---
  } else if( $params->get( 'activate_parent' ) && isset( $open ) && in_array( $mitem->id, $open ) )  {
    //---Sal
    if ($level > 0 ) {
      $id = 'id="active_submenu'. $params->get( 'class_sfx' ) .'"';
    } else {
      $id = 'id="active_menu'. $params->get( 'class_sfx' ) .'"';
    }
    //---
  } else {
    $id = '';
  }

  if ( $params->get( 'full_active_id' ) ) {
    // support for `active_menu` of 'Link - Component Item'	
    if ( $id == '' && $mitem->type == 'component_item_link' ) {
      parse_str( $mitem->link, $url );
      if ( $url['Itemid'] == $current_itemid ) {
        //---Sal
        if ($level > 0 ) {
          $id = 'id="active_submenu'. $params->get( 'class_sfx' ) .'"';
        } else {
          $id = 'id="active_menu'. $params->get( 'class_sfx' ) .'"';
        }
        //---
      }
    }
			
    // support for `active_menu` of 'Link - Url' if link is relative
    if ( $id == '' && $mitem->type == 'url' && strpos( 'http', $mitem->link ) === false) {
      parse_str( $mitem->link, $url );
      if ( isset( $url['Itemid'] ) ) {
        if ( $url['Itemid'] == $current_itemid ) {
          $id = 'id="active_menu'. $params->get( 'class_sfx' ) .'"';
        }
      }
    }
  }
		
  // replace & with amp; for xhtml compliance
  $mitem->link = ampReplace( $mitem->link );

  // run through SEF convertor
  $mitem->link = sefRelToAbs( $mitem->link );

  $menuclass = 'mainlevel'. $params->get( 'class_sfx' );
  if ($level > 0) {
    $menuclass = 'sublevel'. $params->get( 'class_sfx');
  }

  // replace & with amp; for xhtml compliance
  // remove slashes from excaped characters
  $mitem->name = stripslashes( ampReplace($mitem->name) );

  switch ($mitem->browserNav) {
    // cases are slightly different
    case 1:
      // open in a new window
      $txt = '<a href="'. $mitem->link .'" target="_blank" class="'. $menuclass .'" '. $id .'>'. $mitem->name .'</a>';
      break;

    case 2:
      // open in a popup window
      $txt = "<a href=\"#\" onclick=\"javascript: window.open('". $mitem->link ."', '', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=780,height=550'); return false\" class=\"$menuclass\" ". $id .">". $mitem->name ."</a>\n";
      break;

    case 3:
      // don't link it
      $txt = '<span class="'. $menuclass .'" '. $id .'>'. $mitem->name .'</span>';
      break;

    default:	
      // open in parent window
      $txt = '<a href="'. $mitem->link .'" class="'. $menuclass .'" '. $id .'>'. $mitem->name .'</a>';
      break;
  }

  if ( $params->get( 'menu_images' ) ) {
    $menu_params = new stdClass();
    $menu_params = new mosParameters( $mitem->params );
    $menu_image = $menu_params->def( 'menu_image', -1 );
    if ( ( $menu_image != '-1' ) && $menu_image ) {
      $image = '<img src="'. $mosConfig_live_site .'/images/stories/'. $menu_image .'" border="0" alt="'. $mitem->name .'"/>';
      if ( $params->get( 'menu_images_align' ) ) {
        $txt = $txt .' '. $image;
      } else {
        $txt = $image .' '. $txt;
      }
    }
  }

  return $txt;
}


Re: Fix for submenu

Posted: Tue Oct 17, 2006 1:14 pm
by Robin
Q&T Note; Status > Under review

Thanks for the report, regards Robin

Re: [UNDER REVIEW:1.0.11] Fix for submenu

Posted: Thu Nov 09, 2006 8:56 pm
by miki89
Are you sure? I've tried to confirm the problem, but I always see only one "active_menu" id. Could you tell me exactly when and where you see the double id?
Thank you

Q&T note: Status -> Information Required      Impact low.
             

Re: [LOW:INFO REQ:1.0.11] Fix for submenu

Posted: Thu Nov 09, 2006 11:26 pm
by Sal
to miki98:

the problem only comes out when you want to highlight the entire branch. I mean setting the "active parent" parameter in the menu module from the module list.

Ex.:

Menu1
Menu2
  Menu21
  Menu22
Menu3

menu2 and menu22 have both id=active_menu. and that generates an error on the css validator because there are 2 ids with the same name.

hope this has been clear now.

Re: [LOW:INFO REQ:1.0.11] Fix for submenu

Posted: Fri Nov 10, 2006 1:16 pm
by miki89
Sal wrote: I mean setting the "active parent" parameter in the menu module from the module list.
ok I understand. now I'll test the fix.

Q&T note: status -> Under Review

Re: [LOW:UNDER REVIEW:1.0.11] Fix for submenu

Posted: Fri Nov 10, 2006 1:44 pm
by miki89
effectively the fix works, but all the templates have to be changed introducing the new "active_submenu" id. it will cause a lot of problems.
if the W3C compliance is important for you, simply disable the "active_parent" parameter or apply this fix yourself and modify your template
this problem will not be fixed in 1.0.12

Q&T Note:    Status -> Known issue/limitation

Re: [LOW:KNOWN ISSUE:1.0.11] Fix for submenu

Posted: Thu Nov 30, 2006 8:47 am
by 48thAve
I copied the submenu-fix code and pasted it into mod_mainmenu.php (replacing the old code) but when I view my page, only part of the page displays... up to where the menu would begin.  Do I need to change anything else? Thanks!

Re: [LOW:KNOWN ISSUE:1.0.11] Fix for submenu

Posted: Thu Nov 30, 2006 1:18 pm
by 48thAve
Nevermind. Instead, I used toubkal's css solution:
td div a#active_menu