array( 'hover' => variable_get('jquerymenu_hover', 0), 'animate' => variable_get('jquerymenu_animate', 0), 'edit_link' => variable_get('jquerymenu_edit_link', 0), 'click_to_expand' => variable_get('jq_click_to_expand', 0), ) ); drupal_add_js($settings, 'setting'); drupal_add_js(drupal_get_path('module', 'jquerymenu') . '/jquerymenu.js'); } /** * Implements hook_permission */ function jquerymenu_permission() { return array( 'administer jquerymenu' => array( 'title' => t('Administer jQuery Menu'), 'description' => t('Perform administration tasks for my jQuery Menu.'), ), ); } /** * Implements hook_menu(). */ function jquerymenu_menu() { $items = array(); // Create the admin form link. $items['admin/config/user-interface/jquerymenu/settings'] = array( 'title' => 'jQuery Menu Settings', 'title_callback' => 'jquerymenu_title_callback', 'description' => 'Set the options for the jQuery Menu Module', 'page callback' => 'drupal_get_form', 'page arguments' => array('jquerymenu_admin_settings'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, 'file' => 'jquerymenu.admin.inc', ); return $items; } /** * Implements _title_callback() */ function jquerymenu_title_callback() { $title = $title . ' - ' . t('jQuery Menu'); return $title; } /** * Implements hook_block_info(). */ function jquerymenu_block_info() { // create array to hold blocks $blocks = array(); // get a list of enabled jquerymenus $result = db_query("SELECT mid, menu_name FROM {jquerymenus}"); $enabledmenus = array(); foreach ($result as $enabled) { $enabledmenus[$enabled->mid] = $enabled->menu_name; } // loop through each jquerymenu foreach ($enabledmenus as $mid => $name) { // get the title of the menu $title = db_query("SELECT title FROM {menu_custom} WHERE menu_name = :name", array(':name' => $name))->fetchField(); // PIXTURE - start if (empty($title) && function_exists('book_get_books')) { // try book $books = book_get_books(); foreach ($books as $bid => $book) { if ($book['menu_name'] == $name) { $title = $book['title']; break; } } } // PIXTURE - end // If menu has no title, delete it. if (empty($title)) { db_delete('jquerymenus') ->condition('menu_name', $name) ->execute(); db_delete('block') ->condition('module', 'jquerymenu') ->condition('delta', $mid) ->execute(); } // Create a block. $blocks[$mid] = array( 'info' => $title . ' - ' . t('jQuery Menu'), 'status' => TRUE, 'region' => 'sidebar_first', 'weight' => 0, 'visibility' => 'BLOCK_VISIBILITY_NOTLISTED', 'cache' => 'DRUPAL_NO_CACHE' ); } return $blocks; } /** * Implements hook_block_view(). */ function jquerymenu_block_view($delta = '') { global $user, $language; $block = array(); // List of enabled jquerymenus. $result = db_query("SELECT mid, menu_name FROM {jquerymenus}"); $enabledmenus = array(); foreach ($result as $enabled) { $enabledmenus[$enabled->mid] = $enabled->menu_name; } // create variable to hold current active menu $old_activemenu = menu_get_active_menu_names(); // loop through all jquerymenus foreach ($enabledmenus as $mid => $menuname) { // gets the data structure representing a named menu tree $menutree = menu_tree_all_data($menuname); if (module_exists('i18n_menu')) { $menutree = i18n_menu_localize_tree($menutree, $language->language); } if (!empty($menutree)) { if ($delta == $mid) { if ($menuname == 'navigation' && !empty($user->uid)) { // D6 to D7 conversion: ?? use the associative array or not? $title = theme('username', (array)$user); //$title = theme('username', array('user' => $user)); } else { $title = db_query("SELECT title FROM {menu_custom} WHERE menu_name = :name", array(':name' => $menuname))->fetchField(); } menu_set_active_menu_names($menuname); // get the path to root menu root $trail = jquerymenu_trail_creator(); $block['subject'] = t($title); // create the block content $block['content'] = theme('jquerymenu_menu', array('tree' => $menutree, 'trail' => $trail)); } } } // return active menu to what it was originally menu_set_active_menu_names($old_activemenu); return $block; } function jquerymenu_trail_creator() { $activetrail = menu_get_active_trail(); $url_array = array(); foreach ($activetrail as $trail) { // Create an array of only the paths for easy evaluation. if (isset($trail['href'])) { $url_array[] = $trail['href']; } } return $url_array; } function recursive_link_creator($items = array(), $trail, $parentid = '') { static $menucount = 0; $count = 0; $output = ''; $nextlevel = ''; if (!isset($edit_access)) { $edit_access = 'administer menu'; //http://drupal.org/node/911726 } if ($parentid == '') { $menucount++; $parentid = $menucount; } $url_array = $trail; unset($url_array[array_search('', $url_array)]); $i = 0; if (!empty($items)) { // PIXTURE - start // If the menu has a single parent item (with children) // skip the parent item and start with children if(count($items) == 1) { $item = array_shift($items); if(!empty($item['below'])) $items = $item['below']; } // PIXTURE - end foreach ($items as $item) { $count++; $id = $parentid . '-' . $count; $classes = array(); $state = 'closed'; // If there are submenu items we assign the parent a class. if (!empty($item['link']['has_children'])) { $nextlevel = ''; $nextlevel = recursive_link_creator($item['below'], $url_array, $id); if (!empty($nextlevel)) { $classes[] = 'parent'; } // PIXTURE - start // Bug fix: if all the children items are hidden, then make the parent // to be a standard item (which does not have any children) else { $item['link']['has_children'] = 0; $classes[] = 'leaf'; } // PIXTURE - end } else { $classes[] = 'leaf'; } // If the menu item is expanded or in the active trail and if has children add the "open" class. if ( ((!empty($item['link']['mlid']) && (in_array($item['link']['mlid'], $url_array))) || //($item['link']['expanded'] === 1) || ((in_array($item['link']['href'], $url_array) || ($_GET['q'] == $item['link']['href'])) && !empty($item['link']['has_children']) && !empty($nextlevel)) && ($item['link']['href'] != '')) ) { $classes[] = 'open'; $state = 'open'; } elseif (!empty($item['below']) && !empty($nextlevel)) { $classes[] = 'closed'; } if (in_array($item['link']['href'], $url_array)) { //$classes[] = 'active-trail'; } if ($_GET['q'] == $item['link']['href'] || ($item['link']['href'] == '' && $_GET['q'] == variable_get('site_frontpage', 'node'))) { //$classes[] = 'active'; } if ($count == 1) { $classes[] = 'first'; } if ($count == count($items)) { $classes[] = 'last'; } $options = array(); if (isset($item['link']['options'])) { $options = $item['link']['options']; } if (variable_get('jquerymenu_edit_link', 1) == 1) { if (empty($item['link']['edit_path'] )) { if (!empty($item['link']['mlid'])) { $edit_path = 'admin/structure/menu/item/' . $item['link']['mlid'] . '/edit'; } else { $edit_path = ''; } } else { $edit_path = $item['link']['edit_path']; } } else { $edit_path = ''; } if (empty($item['link']['edit_access'])) { $edit_access = 'administer menu'; } else { $edit_access = $item['link']['edit_access']; } if (empty($item['link']['edit_text'])) { $edit_text = t('Edit this link'); } else { $edit_text = $item['link']['edit_text']; } if (!empty($item['link']['to_arg_functions'])) { $toarg_array = array(); $patharray = explode('/', $item['link']['href']); foreach ($patharray as $chunk) { if ($chunk != '%') { $toarg_array[] = $chunk; } else { $function = $item['link']['to_arg_functions']; $function = explode('"', $function); $function = $function[1]; $toarg_array[] = $function('%'); } } $path = implode('/', $toarg_array); } else { $path = $item['link']['href']; } if ($item['link']['hidden'] == 1 && !empty($item['link']['has_children'])) { $output .= recursive_link_creator($item['below'], $url_array, $id); /* $ret = recursive_link_creator($item['below'], $url_array, $id); if(empty($ret)) { // All children is hidden $item['link']['has_children'] = 0; } else { $output .= $ret; } */ } if ($item['link']['hidden'] != 1 && $item['link']['hidden'] != -1) { $output .= theme('jquerymenu_listitem', array( 'item' => $item, 'title' => t($item['link']['title']), 'path' => $path, 'options' => $options, 'state' => $state, 'classes' => $classes, 'has_children' => $item['link']['has_children'], 'edit_path' => $edit_path, 'edit_text' => $edit_text, 'edit_access' => $edit_access, 'nextlevel' => $nextlevel, )); } } } return $output; } /** * Implements hook_theme(). */ function jquerymenu_theme() { return array( 'jquerymenu_menu' => array( 'variables' => array( 'tree' => NULL, 'trail' => NULL, ), ), 'jquerymenu_listitem' => array( 'variables' => array( 'item' => NULL, 'title' => NULL, 'path' => NULL, 'options' => NULL, 'state' => NULL, 'classes' => NULL, 'has_children' => NULL, 'edit_path' => NULL, 'edit_text' => NULL, 'edit_access' => NULL, 'nextlevel' => NULL, ), ), 'jquerymenu_links' => array( 'variables' => array( 'title' => NULL, 'path' => NULL, 'options' => NULL, 'state' => NULL, 'classes' => NULL, 'has_children' => NULL, 'edit_path' => NULL, 'edit_text' => NULL, 'edit_access' => NULL, ), ), ); } function theme_jquerymenu_menu($variables) { $tree = $variables['tree']; $trail = $variables['trail']; $menu_output = recursive_link_creator($tree, $trail); if (!empty($menu_output)) { // We create the shell to hold the menu outside the recursive function. // Add a div that only shows up for that pesky IE so that we can style it into obedience. $output = ''; $output .= ''; $output .= ''; return $output; } } /** * Render a list item containing one or more links. */ function theme_jquerymenu_listitem($variables) { $item = $variables['item']; $title = $variables['title']; $path = $variables['path']; $options = $variables['options']; $state = $variables['state']; $classes = $variables['classes']; $nextlevel = $variables['nextlevel']; $has_children = $variables["has_children"]; $edit_path = $variables["edit_path"]; $edit_text = $variables["edit_text"]; $edit_access = $variables["edit_access"]; if (!isset($output)) { $output = ''; } $output .= '
  • ' : ' class="' . implode(' ', $classes) . '">'); $output .= theme('jquerymenu_links', array( 'title' => $item['link']['title'], 'path' => $path, 'options' => $options, 'state' => $state, 'classes' => $classes, 'has_children' => $item['link']['has_children'], 'edit_path' => $edit_path, 'edit_text' => $edit_text, 'edit_access' => $edit_access, )); if (!empty($item['link']['has_children'])) { if (!empty($nextlevel)) { $output .= '
      '; // If the link has children call the function on itself. $output .= $nextlevel; $output .= '
    '; } } $output .= '
  • '; return $output; } /** * Render a single link, possibly with open/close link and/or edit button. */ function theme_jquerymenu_links($variables) { // create values from the parameter array $title = $variables["title"]; $path = $variables["path"]; $options = $variables["options"]; $state = $variables["state"]; $classes = $variables["classes"]; $has_children = $variables["has_children"]; $edit_path = $variables["edit_path"]; $edit_text = $variables["edit_text"]; $edit_access = $variables["edit_access"]; $parentlink = variable_get('jquerymenu_parentlink', 0); $output = ''; // This is the span that becomes the little plus and minus symbol. $plus = '' : ' class="' . implode(' ', $classes) . '">') . ''; $link = l($title, $path, $options); if ($edit_path != NULL && user_access($edit_access)) { $edit_box = jquerymenu_edit_box($edit_path, $edit_text); if ($has_children != 0) { $output .= $parentlink ? $edit_box . $plus . $title : $edit_box . $plus . $link; } else { $output .= $edit_box . $link; } } else { if ($has_children != 0) { $output .= $parentlink ? $plus . $title : $plus . $link; } else { $output .= $link; } } return $output; } /** * Render edit link for a menu item. */ function jquerymenu_edit_box($edit_path, $edit_title = NULL) { $options['html'] = TRUE; if (!empty($edit_title)) { $options['attributes']['title'] = $edit_title; } else { $options['attributes']['title'] = t('Edit'); } $path = base_path() . drupal_get_path('module', 'jquerymenu'); $editimage = 'edit menu'; return '' . l($editimage, $edit_path, $options) . ''; } /** * Get filtered translation * * This function is intended to return translations for strings that have an input format * * @param $name * Full string id * @param $default * Default string to return if not found, already filtered * @param $langcode * Optional language code if different from current request language. */ function i18nstrings_text($name, $default, $langcode = NULL) { // }