/[drupal]/contributions/modules/dynamic_persistent_menu/dynamic_persistent_menu.module
ViewVC logotype

Contents of /contributions/modules/dynamic_persistent_menu/dynamic_persistent_menu.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (show annotations) (download) (as text)
Thu Oct 29 19:04:14 2009 UTC (3 weeks, 6 days ago) by yrocq
Branch: MAIN
CVS Tags: DRUPAL-6--1-2, HEAD
Changes since 1.2: +2 -2 lines
File MIME type: text/x-php
#551408 : Keep parent menu selected when we mouse over to its child
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

  ViewVC Help
Powered by ViewVC 1.1.2