You are here

function theme_megamenu_menu_tree in Megamenu 6.2

Theme a menu tree

This function takes a menu tree, such as primary links, and generates HTML markup of the menu so that it can be styled as a mega menu. It takes the first three nested levels of the menu tree and creates a structure of nested lists with appropriate classes and IDs assigned (even, odd, active, etc.).

First, we iterate through the first level of menu items (branch/tier-1/megamenu-bin). Each item will be the megamenu-parent of the second level of links (twig/tier-2/megamenu-slot). Next we iterate through the twigs of the menu tree to fill the megamenu-bins. A bin is an unordered list which contains slots (twig/tier-2 items). To fill the slots we iterate through each twig, where the leaves are the deepest level of the menu tree (tier-3). Each leaf is a list item containing a tier-3 menu link.

Abbreviations: t1, t2, & t3 stands for tier-1, tier-2, and tier-3 respectively. They represent nested level menu items.

Parameters

$menutree: The menu tree to be marked up (i.e. primary_links)

Return value

HTML markup for a mega menu

1 theme call to theme_megamenu_menu_tree()
megamenu_block in ./megamenu.module
Implementation of hook_block()

File

./megamenu.module, line 170
megamenu-Menu Builder

Code

function theme_megamenu_menu_tree($menu_name) {
  $menutree = _megamenu_get_menu_tree($menu_name);
  if (module_exists('i18n')) {
    i18nmenu_localize_tree($menutree);
  }
  $skin = _megamenu_get_skin_by_name($menu_name);
  $menu_orientation = _megamenu_get_menu_orientation_by_name($menu_name);

  // TODO: Currently, these attributes are set menu wide. Eventually these might should be set per menu level?
  $slot_orientation = _megamenu_get_slot_orientation_by_name($menu_name);

  /* TODO: temp value, should be attached to branch level in admin interface */
  $slot_attributes = _megamenu_get_slot_attributes_by_name($menu_name);

  /* TODO: temp value, should be attached to twig level in admin interface. */
  $t1_position = 0;
  $branch_count = count($menutree);
  foreach ($menutree as $branch) {
    if ($branch['below']) {
      $t2_position = 0;
      $twig_count = count($branch['below']);
      foreach ($branch['below'] as $twig) {
        $leaf_items_list = "";
        if ($twig['below']) {
          $t3_position = 0;
          $leaf_count = count($twig['below']);
          foreach ($twig['below'] as $leaf) {

            // are we active / active-trail ?
            $active = _megamenu_active_classes($leaf);
            $leaf_link_options['attributes'] = array(
              'class' => $active . ' menu-' . $leaf['link']['mlid'],
            );
            $t3_count_attributes = _megamenu_count_attributes($t3_position, $leaf_count);
            $t3_position++;
            if ($leaf['link']['router_path'] == 'nolink') {
              $link_data = '<span class="nolink">' . $leaf['link']['link_title'] . '</span>';
            }
            else {
              $link_data = l($leaf['link']['link_title'], $leaf['link']['href'], $leaf_link_options);
            }
            $leaf_items[] = array(
              'id' => 'megamenu-mlid-' . $leaf['link']['mlid'],
              'class' => 'megamenu-item megamenu-item-' . $t3_count_attributes . $active,
              'data' => $link_data,
            );
          }

          // END leaf iteration
          // Build leaf list
          $leaf_list_options = array(
            'class' => 'megamenu-items ' . $slot_attributes,
          );
          $leaf_items_list = theme('item_list', $leaf_items, NULL, 'ul', $leaf_list_options);
          $leaf_items_list = _megamenu_strip_list_wrapper($leaf_items_list);
          unset($leaf_items);
        }

        // END leaf detection
        $t2_count_attributes = _megamenu_count_attributes($t2_position, $twig_count);
        $t2_position++;

        // are we active / active-trail ?
        $active = _megamenu_active_classes($twig);
        $link_options['attributes'] = array(
          'class' => $active . ' menu-' . $twig['link']['mlid'],
        );

        // This twig's <li> content
        if ($twig['link']['router_path'] == 'nolink') {
          $twig_data = '<h3 class="megamenu-slot-title nolink">';
          $twig_data .= _megamenu_get_translated_menu_title($menu_name, $twig['link']['mlid']);
          $twig_data .= '</h3>';
          $twig_data .= $leaf_items_list;
        }
        else {
          $twig_data = '<h3 class="megamenu-slot-title">';
          $twig_data .= l(_megamenu_get_translated_menu_title($menu_name, $twig['link']['mlid']), $twig['link']['href'], $link_options);
          $twig_data .= '</h3>';
          $twig_data .= $leaf_items_list;
        }
        $twig_items[] = array(
          'id' => 'megamenu-mlid-' . $twig['link']['mlid'],
          'class' => 'megamenu-slot ' . 'megamenu-slot-' . $t2_count_attributes . $active,
          'data' => $twig_data,
        );
        unset($leaf_items_list);
      }

      // END twig iteration
      // Build twig list
      $twig_list_options = array(
        'class' => 'megamenu-bin megamenu-slots-' . $slot_orientation,
      );
      $twig_items_list = theme('item_list', $twig_items, NULL, 'ul', $twig_list_options);
      $twig_items_list = _megamenu_strip_list_wrapper($twig_items_list);
      unset($twig_items);
    }

    // END twig detection
    // setup active link classes
    $active = _megamenu_active_classes($branch);

    // Link options
    $branch_link_options['attributes'] = array(
      'class' => $active . ' menu-' . $branch['link']['mlid'],
    );

    // setup $t1_count_attributes (classes)
    $t1_count_attributes = _megamenu_count_attributes($t1_position, $branch_count);
    $t1_position++;
    if (empty($twig_items_list)) {
      $twig_items_list = "";
    }
    $branch_items[] = array(
      'id' => 'megamenu-mlid-' . $branch['link']['mlid'],
      'class' => 'megamenu-parent ' . 'megamenu-parent-' . $t1_count_attributes . $active,
      'data' => '<h2 class="megamenu-parent-title">' . l(_megamenu_get_translated_menu_title($menu_name, $branch['link']['mlid']), $branch['link']['href'], $branch_link_options) . '</h2>' . $twig_items_list,
    );
    unset($twig_items_list);
  }

  // END branch iteration
  // Build branch list
  $branch_list_options = array(
    'id' => 'megamenu-' . $menu_name,
    'class' => 'megamenu-menu ' . $menu_orientation . ' megamenu-skin-' . $skin,
  );
  $output = theme('item_list', $branch_items, NULL, 'ul', $branch_list_options);
  $output = _megamenu_strip_list_wrapper($output);
  unset($branch_items);
  return $output;
}