| 1 |
<?php
|
| 2 |
// $Id: dynamic_persistent_menu.module,v 1.2 2009/07/31 21:49:14 yrocq Exp $
|
| 3 |
|
| 4 |
/**
|
| 5 |
* @file
|
| 6 |
* Display a dynamic horizontal menu which degrades gracefully if Javascript is not present
|
| 7 |
*/
|
| 8 |
/**
|
| 9 |
* Implementation of hook_block
|
| 10 |
*/
|
| 11 |
function dynamic_persistent_menu_block($op= 'list', $delta = 0, $edit = array()) {
|
| 12 |
switch ($op) {
|
| 13 |
case 'list':
|
| 14 |
$block[0]['info'] = t('Dynamic persistent menu');
|
| 15 |
$block[0]['cache'] = BLOCK_NO_CACHE;
|
| 16 |
return $block;
|
| 17 |
break;
|
| 18 |
|
| 19 |
case 'view':
|
| 20 |
$params = explode(':',variable_get('dynamic_persistent_menu_menu_root', 'navigation:0'));
|
| 21 |
$block['content'] = theme('dynamic_persistent_menu', $params[0], $params[1], variable_get('dynamic_persistent_menu_sub_menu_timeout', 2000));
|
| 22 |
return $block;
|
| 23 |
break;
|
| 24 |
|
| 25 |
case 'configure':
|
| 26 |
$options = menu_parent_options(menu_get_menus(), 0);
|
| 27 |
$form['dynamic_persistent_menu_menu_root'] = array(
|
| 28 |
'#type' => 'select',
|
| 29 |
'#title' => t('Menu root'),
|
| 30 |
'#default_value' => variable_get('dynamic_persistent_menu_menu_root', 'navigation:0'),
|
| 31 |
'#options' => $options,
|
| 32 |
'#description' => t('Choose the menu you wish to display in the block')
|
| 33 |
);
|
| 34 |
$form['dynamic_persistent_menu_sub_menu_timeout'] = array(
|
| 35 |
'#type' => 'textfield',
|
| 36 |
'#title' => t('Sub-menu timeout'),
|
| 37 |
'#default_value' => variable_get('dynamic_persistent_menu_sub_menu_timeout', 2000),
|
| 38 |
'#description' => t('Time before menu hiding when the mouse pointer leaves the parent menu (in milliseconds)')
|
| 39 |
);
|
| 40 |
|
| 41 |
return $form;
|
| 42 |
|
| 43 |
case 'save':
|
| 44 |
variable_set('dynamic_persistent_menu_menu_root', $edit['dynamic_persistent_menu_menu_root']);
|
| 45 |
variable_set('dynamic_persistent_menu_sub_menu_timeout', (int) $edit['dynamic_persistent_menu_sub_menu_timeout']);
|
| 46 |
break;
|
| 47 |
}
|
| 48 |
}
|
| 49 |
|
| 50 |
/**
|
| 51 |
* Implementation of hook_theme
|
| 52 |
*/
|
| 53 |
|
| 54 |
function dynamic_persistent_menu_theme() {
|
| 55 |
return array(
|
| 56 |
'dynamic_persistent_menu' => array(
|
| 57 |
'arguments' => array(
|
| 58 |
'menu' => NULL,
|
| 59 |
'parent' => NULL,
|
| 60 |
'timeout' => NULL
|
| 61 |
),
|
| 62 |
),
|
| 63 |
'dynamic_persistent_menu_menu_item' => array(
|
| 64 |
'arguments' => array(
|
| 65 |
'link' => NULL,
|
| 66 |
'extra_class' => NULL,
|
| 67 |
'id' => NULL
|
| 68 |
)
|
| 69 |
)
|
| 70 |
);
|
| 71 |
}
|
| 72 |
|
| 73 |
/**
|
| 74 |
* Theme functions
|
| 75 |
*/
|
| 76 |
|
| 77 |
function theme_dynamic_persistent_menu($menu_name, $mlid, $timeout) {
|
| 78 |
$item_class = "dynamic-persistent-menu-menu-item";
|
| 79 |
$sub_item_class = "dynamic-persistent-menu-sub-menu-item";
|
| 80 |
|
| 81 |
// Find menu item in the menu tree
|
| 82 |
|
| 83 |
$menu_tree = menu_tree_all_data($menu_name);
|
| 84 |
$menu_link = menu_link_load($mlid);
|
| 85 |
|
| 86 |
if ($mlid != 0) {
|
| 87 |
for ($i=1; $i<10; $i++) {
|
| 88 |
foreach($menu_tree as $menu_item) {
|
| 89 |
if ($menu_item["link"]['mlid'] == $mlid) {
|
| 90 |
$menu = $menu_item['below'];
|
| 91 |
break 2;
|
| 92 |
}
|
| 93 |
else {
|
| 94 |
if ($menu_item["link"]['mlid'] == $menu_link['p'.$i]) {
|
| 95 |
$menu_tree = $menu_item['below'];
|
| 96 |
break;
|
| 97 |
}
|
| 98 |
}
|
| 99 |
}
|
| 100 |
}
|
| 101 |
}
|
| 102 |
else {
|
| 103 |
$menu = $menu_tree;
|
| 104 |
}
|
| 105 |
|
| 106 |
// Don't display anything if the selected menu has no children
|
| 107 |
|
| 108 |
if (!$menu) {
|
| 109 |
return;
|
| 110 |
}
|
| 111 |
|
| 112 |
// Backup active menu trail and set a new one
|
| 113 |
|
| 114 |
$active_menu_name = menu_get_active_menu_name();
|
| 115 |
menu_set_active_menu_name($menu_name);
|
| 116 |
|
| 117 |
// Build table of mlid in the active trail
|
| 118 |
|
| 119 |
foreach (menu_set_active_trail() as $value) {
|
| 120 |
if ($value['mlid']) {
|
| 121 |
$trail[] = $value['mlid'];
|
| 122 |
}
|
| 123 |
}
|
| 124 |
|
| 125 |
// Restore active menu trail
|
| 126 |
|
| 127 |
menu_set_active_menu_name($active_menu_name);
|
| 128 |
|
| 129 |
// Build the menus
|
| 130 |
|
| 131 |
$output = '<ul style="display:inline" class="dynamic-persistent-menu-menu">';
|
| 132 |
|
| 133 |
foreach($menu as $menu_item) {
|
| 134 |
$link = $menu_item['link'];
|
| 135 |
if ($link['hidden'] == 0) {
|
| 136 |
if($link['has_children']) {
|
| 137 |
if (is_array($trail) && in_array($link['mlid'], $trail)) {
|
| 138 |
$display = 'block';
|
| 139 |
$over_menu_default = $link['mlid'];
|
| 140 |
}
|
| 141 |
else {
|
| 142 |
$display = 'none';
|
| 143 |
}
|
| 144 |
}
|
| 145 |
|
| 146 |
if (is_array($trail) && in_array($link['mlid'], $trail)) {
|
| 147 |
$link['in_active_trail'] = TRUE;
|
| 148 |
}
|
| 149 |
|
| 150 |
$output .= theme('dynamic_persistent_menu_menu_item', $link, 'dynamic-persistent-menu-menu-item', 'dynamic-persistent-menu-menu'.$link['mlid']);
|
| 151 |
|
| 152 |
// Submenu
|
| 153 |
|
| 154 |
if ($menu_item['link']['has_children']) {
|
| 155 |
$submenu_items ='';
|
| 156 |
foreach($menu_item['below'] as $submenu_item) {
|
| 157 |
$link2 = $submenu_item['link'];
|
| 158 |
if ($link2['hidden'] == 0) {
|
| 159 |
if (is_array($trail) && in_array($link2['mlid'], $trail)) {
|
| 160 |
$link2['in_active_trail'] = TRUE;
|
| 161 |
}
|
| 162 |
$submenu_items .= theme('dynamic_persistent_menu_menu_item', $link2, 'dynamic-persistent-menu-sub-menu-item', 'dynamic-persistent-menu-sub-menu-item'.$link2['mlid']);;
|
| 163 |
}
|
| 164 |
}
|
| 165 |
if ($submenu_items !='') {
|
| 166 |
$submenu .= '<ul class="block dynamic-persistent-menu-sub-menu" id="dynamic-persistent-menu-sub-menu'. $link['mlid'] .'" style="display:'. $display .'">';
|
| 167 |
$submenu .= $submenu_items;
|
| 168 |
$submenu .= '</ul>';
|
| 169 |
}
|
| 170 |
}
|
| 171 |
}
|
| 172 |
}
|
| 173 |
$output .= '</ul>';
|
| 174 |
$output .= $submenu;
|
| 175 |
drupal_add_js("overMenuDefault = 'dynamic-persistent-menu-menu". $over_menu_default ."';", 'inline');
|
| 176 |
drupal_add_js("subMenuTimeout = $timeout;", 'inline');
|
| 177 |
drupal_add_js(drupal_get_path('module', 'dynamic_persistent_menu') .'/dynamic_persistent_menu.js');
|
| 178 |
|
| 179 |
return $output;
|
| 180 |
}
|
| 181 |
|
| 182 |
/**
|
| 183 |
* Generate the HTML output for a menu item and submenu item.
|
| 184 |
*
|
| 185 |
* @ingroup themeable
|
| 186 |
*/
|
| 187 |
function theme_dynamic_persistent_menu_menu_item($link, $extra_class = NULL, $id = NULL) {
|
| 188 |
if (!empty($extra_class)) {
|
| 189 |
$class .= ' '. $extra_class;
|
| 190 |
}
|
| 191 |
|
| 192 |
if ($link['in_active_trail']) {
|
| 193 |
$class .= ' active-trail';
|
| 194 |
}
|
| 195 |
|
| 196 |
|
| 197 |
return '<li style="display:inline" class="'. $class .'" id="'.$id.'">'. theme('menu_item_link', $link) ."</li>\n";
|
| 198 |
}
|
| 199 |
|