upgrade omega again
[indybay:drupal.git] / docs / sites / all / modules / contrib / context / plugins / context_reaction_menu.inc
1 <?php
2
3 /**
4  * Expose menu items as context reactions.
5  */
6 class context_reaction_menu extends context_reaction {
7   /**
8    * Provide a form element that allow the admin to chose a menu item.
9    */
10   function options_form($context) {
11     if (module_exists('menu')) {
12       $menus = menu_parent_options(menu_get_menus(), array('mlid' => 0));
13       $root_menus = array();
14       foreach ($menus as $key => $name) {
15         $id = explode(':', $key);
16         if ($id[1] == '0') {
17           $root_menus[$id[0]] = check_plain($name);
18         }
19         else {
20           $link = menu_link_load($id[1]);
21           $identifier = $link['link_path'];
22           $root_menu = $root_menus[$id[0]];
23           while (isset($menus[$root_menu][$identifier])) {
24             $identifier .= "'";
25           }
26           $menus[$root_menu][$identifier] = $name;
27         }
28         unset($menus[$key]);
29       }
30       array_unshift($menus, "-- " . t('None') . " --");
31     }
32     else {
33       $menus = array();
34     }
35     return array(
36       '#title' => $this->title,
37       '#description' => $this->description,
38       '#options' => $menus,
39       '#type' => 'select',
40       '#default_value' => $this->fetch_from_context($context),
41     );
42   }
43
44   /**
45    * Override of options_form_submit().
46    * Trim any identifier padding for non-unique path menu items.
47    */
48   function options_form_submit($values) {
49     return trim($values, "'");
50   }
51
52   /**
53    * If primary + secondary links are pointed at the same menu, provide
54    * contextual trailing by default.
55    */
56   function execute(&$vars = NULL) {
57     if (variable_get('menu_main_links_source', 'main-menu') == variable_get('menu_secondary_links_source', 'user-menu')) {
58       $vars['main_menu'] = theme_get_setting('toggle_main_menu') ? $this->menu_navigation_links(variable_get('menu_main_links_source', 'main-menu')) : $vars['main_menu'];
59       $vars['secondary_menu'] = theme_get_setting('toggle_secondary_menu') ? $this->menu_navigation_links(variable_get('menu_secondary_links_source', 'secondary-links'), 1) : $vars['secondary_menu'];
60     }
61
62     $vars['main_menu'] = $this->menu_set_active($vars['main_menu']);
63     $vars['secondary_menu'] = $this->menu_set_active($vars['secondary_menu']);
64   }
65
66   function get_active_paths() {
67     $active_paths = array();
68     foreach ($this->get_contexts() as $context) {
69       if (isset($context->reactions[$this->plugin])) {
70         $active_paths[] = $context->reactions[$this->plugin];
71       }
72     }
73     return $active_paths;
74   }
75
76   /**
77    * Iterates through a provided links array for use with theme_links()
78    * (e.g. from menu_primary_links()) and provides an active class for
79    * any items that have a path that matches an active context.
80    *
81    * @param $links
82    *   An array of links.
83    * @param $reset
84    *   A boolean flag for resetting the static cache.
85    *
86    * @return
87    *   A modified links array.
88    */
89   function menu_set_active($links = array(), $reset = FALSE) {
90     $new_links = array();
91     if (!empty($links)) {
92       $active_paths = $this->get_active_paths();
93
94       // Iterate through the provided links and build a new set of links
95       // that includes active classes
96       foreach ($links as $key => $link) {
97         if (!empty($link['href']) && in_array($link['href'], $active_paths)) {
98           $link['attributes']['class'][] = 'active';
99
100           if (strpos(' active', $key) === FALSE) {
101             $new_links[$key . ' active'] = $link;
102           }
103         }
104         else {
105           $new_links[$key] = $link;
106         }
107       }
108     }
109     return $new_links;
110   }
111
112   /**
113    * Wrapper around menu_navigation_links() that gives themers the option of
114    * building navigation links based on an active context trail.
115    */
116   function menu_navigation_links($menu_name, $level = 0) {
117     // Retrieve original path so we can repair it after our hack.
118     $original_path = $_GET['q'];
119     $original_menu_trail = drupal_static('menu_set_active_trail');
120
121     // Retrieve the first active menu path found.
122     if ($active_paths = $this->get_active_paths()) {
123       $path = current($active_paths);
124       if (menu_get_item($path)) {
125         menu_set_active_item($path);
126       }
127     }
128
129     // Build the links requested
130     if (module_exists('i18n_menu')) {
131       $links = i18n_menu_navigation_links($menu_name, $level);
132     } else {
133       $links = menu_navigation_links($menu_name, $level);
134     }
135
136     // Repair and get out
137     menu_set_active_item($original_path);
138     $repair_menu_trail = &drupal_static('menu_set_active_trail');
139     $repair_menu_trail = $original_menu_trail;
140     return $links;
141   }
142 }