You are here

megamenu.module in Megamenu 6

Same filename and directory in other branches
  1. 6.2 megamenu.module
  2. 7 megamenu.module

megamenu-Menu Builder

Takes existing menus and produces blocks that render the menu as a megamenu-menu.

File

megamenu.module
View source
<?php

/**
 * @file
 *
 * megamenu-Menu Builder
 *
 * Takes existing menus and produces blocks that render the menu as a megamenu-menu.
 */

/**
 * Load all the helper/utility functions for this module.
 */
module_load_include('inc', 'megamenu', 'megamenu.utilities');

/**
 * Implementation of hook_init().
 *
 * We are adding the JavaScript and CSS here rather than theme_menu_tree()
 * because when block caching is enabled none of it would get fired
 * and the menus are unstyled.
 */
function megamenu_init() {

  // Add JavaScript
  drupal_add_js(drupal_get_path('module', 'megamenu') . '/megamenu.js');

  // Add main CSS functionality.
  drupal_add_css(drupal_get_path('module', 'megamenu') . '/megamenu.css');

  // Add custom CSS layout skins TODO: if specified.
  drupal_add_css(drupal_get_path('module', 'megamenu') . '/megamenu-skins.css');
}

/**
 * Implementation of hook_menu()
 */
function megamenu_menu() {
  $items = array();
  $items['admin/build/megamenu'] = array(
    'title' => t('Mega menus'),
    'description' => t('Make megamenu (aka megadropdowns) from a Drupal menu'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'megamenu_admin_form',
    ),
    'file' => 'megamenu.admin.inc',
    'access arguments' => array(
      'administer mega menu',
    ),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['admin/build/megamenu/settings/%'] = array(
    'title' => t('Mega Menus Settings'),
    'description' => t('Configure the mega menu'),
    'page callback' => 'drupal_get_form',
    'file' => 'megamenu.admin.inc',
    'page arguments' => array(
      'megamenu_settings_form',
      'menu',
      4,
    ),
    'access arguments' => array(
      'administer mega menus',
    ),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Implementation of hook_perm()
 */
function megamenu_perm() {
  return array(
    'administer mega menu',
  );
}

/**
 *  Implementation of hook_theme()
 */
function megamenu_theme() {
  return array(
    'megamenu_admin' => array(
      'arguments' => array(
        'form' => NULL,
      ),
      'template' => 'megamenu_admin',
    ),
  );
}
function megamenu_preprocess_megamenu_admin(&$variables) {
  foreach (_megamenu_menulist() as $menu_name) {
    $variables['menu'][$menu_name]['details'] = menu_load($menu_name);
  }
}

/**
 * Implementation of hook_block() 
 *
 * I think there will be problems with how these are being referenced
 * will need a table for "enabled megas" or something sooner than later?
 *
 */
function megamenu_block($op = 'list', $delta = '0', $edit = array()) {
  switch ($op) {
    case 'list':
      $block_count = 0;
      $menus = _megamenu_enabled_menus();
      if ($menus) {
        foreach ($menus as $menu_name) {
          $menudetails = menu_load($menu_name);
          $blocks[$block_count]['info'] = t('Megamenu - ' . $menudetails['title']);
          $blocks[$block_count]['cache'] = BLOCK_NO_CACHE;

          //set this to true for production version?
          ++$block_count;
        }
      }
      return $blocks;
      break;
    case 'view':
      $menus = _megamenu_enabled_menus();
      $output = megamenu_theme_menu_tree($menus[$delta]);
      $block['subject'] = '';

      // TODO: temp debugging value, should be left unset in production
      $block['content'] = $output;
      return $block;
      break;
    case 'configure':
      break;
    case 'save':
      break;
  }
}

/**
 * Implementation of hook_help() 
 */
function megamenu_help($path, $arg) {
}

/**
 * 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.
 *
 * @param $menutree
 *    The menu tree to be marked up (i.e. primary_links)
 * @return
 *    HTML markup for a mega menu
 *
 */
function megamenu_theme_menu_tree($menu_name) {
  $menutree = _megamenu_get_menu_tree($menu_name);
  $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. */
  $output = '<ul id="megamenu-' . $menu_name . '" class="megamenu-menu ' . $menu_orientation . ' megamenu-skin-' . $skin . '">' . "\n";
  $t1_position = 0;
  $branch_count = count($menutree);
  foreach ($menutree as $branch) {
    $count_attributes = _megamenu_count_attributes($t1_position, $branch_count);
    $t1_position++;

    // TODO: Add an ID scheme (for faster js and css selection)
    $output .= '  <li class="megamenu-parent' . $count_attributes . '">' . "\n";
    $output .= '    <h2 class="megamenu-parent-title">' . l($branch['link']['link_title'], $branch['link']['link_path']) . '</h2>' . "\n";
    if ($branch['below']) {
      $output .= '    <ul class="megamenu-bin megamenu-slots-' . $slot_orientation . '">' . "\n";
      $t2_position = 0;
      $twig_count = count($branch['below']);
      foreach ($branch['below'] as $twig) {
        $count_attributes = _megamenu_count_attributes($t2_position, $twig_count);
        $t2_position++;

        // TODO: Add na ID scheme (for faster js and css selection)
        $output .= '      <li class="megamenu-slot ' . $count_attributes . '">' . "\n";
        $output .= '        <h3 class="megamenu-slot-title">' . l($twig['link']['link_title'], $twig['link']['link_path']) . '</h3>' . "\n";
        if ($twig['below']) {
          $output .= '  	 <ul class="megamenu-items ' . $slotattributes . '">' . "\n";
          $t3_position = 0;
          $leaf_count = count($twig['below']);
          foreach ($twig['below'] as $leaf) {
            $count_attributes = _megamenu_count_attributes($t3_position, $leaf_count);
            $t3_position++;
            $output .= '           <li class="megamenu-item' . $count_attributes . '">' . l($leaf['link']['link_title'], $leaf['link']['link_path']) . '</li>' . "\n";
          }

          // END leaf iteration
          $output .= '  	 </ul>' . "\n";
        }

        // END leaf detection
        $output .= '      </li>' . "\n";
      }

      // END twig iteration
      $output .= '    </ul>' . "\n";
    }

    // END twig detection
    $output .= '  </li>' . "\n";
  }

  // END branch iteration
  $output .= '</ul>' . "\n";
  return $output;
}

Functions

Namesort descending Description
megamenu_block Implementation of hook_block()
megamenu_help Implementation of hook_help()
megamenu_init Implementation of hook_init().
megamenu_menu Implementation of hook_menu()
megamenu_perm Implementation of hook_perm()
megamenu_preprocess_megamenu_admin
megamenu_theme Implementation of hook_theme()
megamenu_theme_menu_tree Theme a menu tree