SHOW:
|
|
- or go back to the newest paste.
| 1 | // Answer for question on Drupal Stack Exchange: | |
| 2 | // http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node | |
| 3 | ||
| 4 | // this is the template.php file!! | |
| 5 | // .... | |
| 6 | ||
| 7 | ||
| 8 | /** | |
| 9 | * Should this link be hidden? | |
| 10 | * | |
| 11 | * @see http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node/27922 | |
| 12 | * | |
| 13 | * @param string $link_path The path that should be inspected. | |
| 14 | * @return boolean | |
| 15 | */ | |
| 16 | function YOURTHEMENAME_link_should_be_hidden($link_path) {
| |
| 17 | ||
| 18 | // in this example, I let "contact" and "node/9" links only be visible | |
| 19 | // on their own path (so for example, I let "contact" path be visible | |
| 20 | // in the menu if the user opened "example.com/contact"). | |
| 21 | - | $your_paths_to_show_in_menu_only_on_their_own_path = array('contact', 'node/9'); // SUBSTITUTE IT with yours - empty cache every time you change that
|
| 21 | + | $your_paths_to_show_in_menu_only_on_their_own_path = array('node/425'); // SUBSTITUTE IT with yours - empty cache every time you change that
|
| 22 | $is_link_to_hide = in_array($link_path, $your_paths_to_show_in_menu_only_on_their_own_path); | |
| 23 | if ($is_link_to_hide) {
| |
| 24 | $is_current_page_self = ($link_path == $_GET['q']); | |
| 25 | // these links will be visible only on their own paths - | |
| 26 | // BUT here you can define other paths too where they can be visible at! | |
| 27 | // So for example, you want "example.com/node/9" to be visible when visiting its own path | |
| 28 | // AND when visiting "example.com/node/3" OR "example.com/any_other_path". | |
| 29 | // But if you do NOT want any other pages for these links to be visible at, then | |
| 30 | // just leave it empty (like this: array()). | |
| 31 | - | $link_also_visible_at_paths = array('node/3', 'any_other_path'); // SUBSTITUTE IT with your paths! - empty cache every time you change that
|
| 31 | + | $link_also_visible_at_paths = array(); // SUBSTITUTE IT with your paths! - empty cache every time you change that |
| 32 | $element_can_be_visible = $is_current_page_self || (!empty($link_also_visible_at_paths) && in_array($_GET['q'], $link_also_visible_at_paths)); | |
| 33 | ||
| 34 | if (!$element_can_be_visible) {
| |
| 35 | return TRUE; | |
| 36 | } | |
| 37 | } | |
| 38 | return FALSE; | |
| 39 | } | |
| 40 | ||
| 41 | /** | |
| 42 | * Overriding theme_menu_link() | |
| 43 | * | |
| 44 | * @see http://api.drupal.org/api/drupal/includes%21menu.inc/function/theme_menu_link/7 | |
| 45 | */ | |
| 46 | function YOURTHEMENAME_menu_link(array $variables) {
| |
| 47 | /** | |
| 48 | * @see http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node/27922 | |
| 49 | */ | |
| 50 | if (YOURTHEMENAME_link_should_be_hidden($variables['element']['#href'])) {
| |
| 51 | return ''; | |
| 52 | } | |
| 53 | ||
| 54 | $element = $variables['element']; | |
| 55 | $sub_menu = ''; | |
| 56 | ||
| 57 | if ($element['#below']) {
| |
| 58 | $sub_menu = drupal_render($element['#below']); | |
| 59 | } | |
| 60 | $output = l($element['#title'], $element['#href'], $element['#localized_options']); | |
| 61 | return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n"; | |
| 62 | } | |
| 63 | ||
| 64 | /** | |
| 65 | * Helper function that builds the nested lists of a Superfish menu. | |
| 66 | * @see theme_superfish_build() | |
| 67 | */ | |
| 68 | function YOURTHEMENAME_superfish_build($variables) {
| |
| 69 | ||
| 70 | $output = array('content' => '');
| |
| 71 | $id = $variables['id']; | |
| 72 | $menu = $variables['menu']; | |
| 73 | $depth = $variables['depth']; | |
| 74 | $trail = $variables['trail']; | |
| 75 | // Keep $sfsettings untouched as we need to pass it to the child menus. | |
| 76 | $settings = $sfsettings = $variables['sfsettings']; | |
| 77 | $megamenu = $settings['megamenu']; | |
| 78 | $total_children = $parent_children = $single_children = 0; | |
| 79 | $i = 1; | |
| 80 | ||
| 81 | // Reckon the total number of available menu items. | |
| 82 | foreach ($menu as $menu_item) {
| |
| 83 | if (!isset($menu_item['link']['hidden']) || $menu_item['link']['hidden'] == 0) {
| |
| 84 | $total_children++; | |
| 85 | } | |
| 86 | } | |
| 87 | ||
| 88 | foreach ($menu as $menu_item) {
| |
| 89 | ||
| 90 | $show_children = $megamenu_wrapper = $megamenu_column = $megamenu_content = FALSE; | |
| 91 | $item_class = $link_options = $link_class = array(); | |
| 92 | $mlid = $menu_item['link']['mlid']; | |
| 93 | ||
| 94 | /** | |
| 95 | * @see http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node/27922 | |
| 96 | */ | |
| 97 | if (YOURTHEMENAME_link_should_be_hidden($menu_item['link']['link_path'])) {
| |
| 98 | continue; | |
| 99 | } | |
| 100 | ||
| 101 | if (!isset($menu_item['link']['hidden']) || $menu_item['link']['hidden'] == 0) {
| |
| 102 | $item_class[] = ($trail && in_array($mlid, $trail)) ? 'active-trail' : ''; | |
| 103 | ||
| 104 | // Add helper classes to the menu items and hyperlinks. | |
| 105 | $settings['firstlast'] = ($settings['dfirstlast'] == 1 && $total_children == 1) ? 0 : $settings['firstlast']; | |
| 106 | $item_class[] = ($settings['firstlast'] == 1) ? (($i == 1) ? 'first' : (($i == $total_children) ? 'last' : 'middle')) : ''; | |
| 107 | $settings['zebra'] = ($settings['dzebra'] == 1 && $total_children == 1) ? 0 : $settings['zebra']; | |
| 108 | $item_class[] = ($settings['zebra'] == 1) ? (($i % 2) ? 'odd' : 'even') : ''; | |
| 109 | $item_class[] = ($settings['itemcount'] == 1) ? 'sf-item-' . $i : ''; | |
| 110 | $item_class[] = ($settings['itemdepth'] == 1) ? 'sf-depth-' . $menu_item['link']['depth'] : ''; | |
| 111 | $link_class[] = ($settings['itemdepth'] == 1) ? 'sf-depth-' . $menu_item['link']['depth'] : ''; | |
| 112 | $item_class[] = ($settings['liclass']) ? $settings['liclass'] : ''; | |
| 113 | if (strpos($settings['hlclass'], ' ')) {
| |
| 114 | $l = explode(' ', $settings['hlclass']);
| |
| 115 | foreach ($l as $c) {
| |
| 116 | $link_class[] = $c; | |
| 117 | } | |
| 118 | } | |
| 119 | else {
| |
| 120 | $link_class[] = $settings['hlclass']; | |
| 121 | } | |
| 122 | $i++; | |
| 123 | ||
| 124 | // Add hyperlinks description (title) to their text. | |
| 125 | $show_linkdescription = ($settings['linkdescription'] == 1 && !empty($menu_item['link']['localized_options']['attributes']['title'])) ? TRUE : FALSE; | |
| 126 | if ($show_linkdescription) {
| |
| 127 | if (!empty($settings['hldmenus'])) {
| |
| 128 | $show_linkdescription = (is_array($settings['hldmenus'])) ? ((in_array($mlid, $settings['hldmenus'])) ? TRUE : FALSE) : (($mlid == $settings['hldmenus']) ? TRUE : FALSE); | |
| 129 | } | |
| 130 | if (!empty($settings['hldexclude'])) {
| |
| 131 | $show_linkdescription = (is_array($settings['hldexclude'])) ? ((in_array($mlid, $settings['hldexclude'])) ? FALSE : $show_linkdescription) : (($settings['hldexclude'] == $mlid) ? FALSE : $show_linkdescription); | |
| 132 | } | |
| 133 | if ($show_linkdescription) {
| |
| 134 | $menu_item['link']['title'] .= '<span class="sf-description">'; | |
| 135 | $menu_item['link']['title'] .= (!empty($menu_item['link']['localized_options']['attributes']['title'])) ? $menu_item['link']['localized_options']['attributes']['title'] : array(); | |
| 136 | $menu_item['link']['title'] .= '</span>'; | |
| 137 | $link_options['html'] = TRUE; | |
| 138 | } | |
| 139 | } | |
| 140 | ||
| 141 | // Add custom HTML codes around the menu items. | |
| 142 | if ($sfsettings['wrapul'] && strpos($sfsettings['wrapul'], ',') !== FALSE) {
| |
| 143 | $wul = explode(',', $sfsettings['wrapul']);
| |
| 144 | // In case you just wanted to add something after the element. | |
| 145 | if (drupal_substr($sfsettings['wrapul'], 0) == ',') {
| |
| 146 | array_unshift($wul, ''); | |
| 147 | } | |
| 148 | } | |
| 149 | else {
| |
| 150 | $wul = array(); | |
| 151 | } | |
| 152 | ||
| 153 | // Add custom HTML codes around the hyperlinks. | |
| 154 | if ($settings['wraphl'] && strpos($settings['wraphl'], ',') !== FALSE) {
| |
| 155 | $whl = explode(',', $settings['wraphl']);
| |
| 156 | // The same as above | |
| 157 | if (drupal_substr($settings['wraphl'], 0) == ',') {
| |
| 158 | array_unshift($whl, ''); | |
| 159 | } | |
| 160 | } | |
| 161 | else {
| |
| 162 | $whl = array(); | |
| 163 | } | |
| 164 | ||
| 165 | // Add custom HTML codes around the hyperlinks text. | |
| 166 | if ($settings['wraphlt'] && strpos($settings['wraphlt'], ',') !== FALSE) {
| |
| 167 | $whlt = explode(',', $settings['wraphlt']);
| |
| 168 | // The same as above | |
| 169 | if (drupal_substr($settings['wraphlt'], 0) == ',') {
| |
| 170 | array_unshift($whlt, ''); | |
| 171 | } | |
| 172 | $menu_item['link']['title'] = $whlt[0] . check_plain($menu_item['link']['title']) . $whlt[1]; | |
| 173 | $link_options['html'] = TRUE; | |
| 174 | } | |
| 175 | ||
| 176 | ||
| 177 | if (!empty($menu_item['link']['has_children']) && !empty($menu_item['below']) && $depth != 0) {
| |
| 178 | // Megamenu is still beta, there is a good chance much of this will be changed. | |
| 179 | if (!empty($settings['megamenu_exclude'])) {
| |
| 180 | if (is_array($settings['megamenu_exclude'])) {
| |
| 181 | $megamenu = (in_array($mlid, $settings['megamenu_exclude'])) ? 0 : $megamenu; | |
| 182 | } | |
| 183 | else {
| |
| 184 | $megamenu = ($settings['megamenu_exclude'] == $mlid) ? 0 : $megamenu; | |
| 185 | } | |
| 186 | // Send the result to the sub-menu. | |
| 187 | $sfsettings['megamenu'] = $megamenu; | |
| 188 | } | |
| 189 | if ($megamenu == 1) {
| |
| 190 | $megamenu_wrapper = ($menu_item['link']['depth'] == $settings['megamenu_depth']) ? TRUE : FALSE; | |
| 191 | $megamenu_column = ($menu_item['link']['depth'] == $settings['megamenu_depth'] + 1) ? TRUE : FALSE; | |
| 192 | $megamenu_content = ($menu_item['link']['depth'] >= $settings['megamenu_depth'] && $menu_item['link']['depth'] <= $settings['megamenu_levels']) ? TRUE : FALSE; | |
| 193 | } | |
| 194 | // Render the sub-menu. | |
| 195 | $var = array( | |
| 196 | 'id' => $id, | |
| 197 | 'menu' => $menu_item['below'], | |
| 198 | 'depth' => $depth, 'trail' => $trail, | |
| 199 | 'sfsettings' => $sfsettings | |
| 200 | ); | |
| 201 | $children = theme('superfish_build', $var);
| |
| 202 | // Check to see whether it should be displayed. | |
| 203 | $show_children = (($menu_item['link']['depth'] <= $depth || $depth == -1) && $children['content']) ? TRUE : FALSE; | |
| 204 | if ($show_children) {
| |
| 205 | // Add item counter classes. | |
| 206 | if ($settings['itemcounter']) {
| |
| 207 | $item_class[] = 'sf-total-children-' . $children['total_children']; | |
| 208 | $item_class[] = 'sf-parent-children-' . $children['parent_children']; | |
| 209 | $item_class[] = 'sf-single-children-' . $children['single_children']; | |
| 210 | } | |
| 211 | // More helper classes. | |
| 212 | $item_class[] = ($megamenu_column) ? 'sf-megamenu-column' : ''; | |
| 213 | $item_class[] = $link_class[] = 'menuparent'; | |
| 214 | } | |
| 215 | $parent_children++; | |
| 216 | } | |
| 217 | else {
| |
| 218 | $item_class[] = 'sf-no-children'; | |
| 219 | $single_children++; | |
| 220 | } | |
| 221 | ||
| 222 | $item_class = implode(' ', array_filter($item_class));
| |
| 223 | ||
| 224 | if (isset($menu_item['link']['localized_options']['attributes']['class'])) {
| |
| 225 | $link_class_current = $menu_item['link']['localized_options']['attributes']['class']; | |
| 226 | $link_class = array_merge($link_class_current, array_filter($link_class)); | |
| 227 | } | |
| 228 | $menu_item['link']['localized_options']['attributes']['class'] = $link_class; | |
| 229 | ||
| 230 | $link_options['attributes'] = $menu_item['link']['localized_options']['attributes']; | |
| 231 | ||
| 232 | // Render the menu item. | |
| 233 | $output['content'] .= '<li id="menu-' . $mlid . '-' . $id . '"'; | |
| 234 | $output['content'] .= ($item_class) ? ' class="' . trim($item_class) . '">' : '>'; | |
| 235 | $output['content'] .= ($megamenu_column) ? '<div class="sf-megamenu-column">' : ''; | |
| 236 | $output['content'] .= isset($whl[0]) ? $whl[0] : ''; | |
| 237 | $output['content'] .= l($menu_item['link']['title'], $menu_item['link']['link_path'], $link_options); | |
| 238 | $output['content'] .= isset($whl[1]) ? $whl[1] : ''; | |
| 239 | $output['content'] .= ($megamenu_wrapper) ? '<ul class="sf-megamenu"><li class="sf-megamenu-wrapper ' . $item_class . '">' : ''; | |
| 240 | $output['content'] .= ($show_children) ? (isset($wul[0]) ? $wul[0] : '') : ''; | |
| 241 | $output['content'] .= ($show_children) ? (($megamenu_content) ? '<ol>' : '<ul>') : ''; | |
| 242 | $output['content'] .= ($show_children) ? $children['content'] : ''; | |
| 243 | $output['content'] .= ($show_children) ? (($megamenu_content) ? '</ol>' : '</ul>') : ''; | |
| 244 | $output['content'] .= ($show_children) ? (isset($wul[1]) ? $wul[1] : '') : ''; | |
| 245 | $output['content'] .= ($megamenu_wrapper) ? '</li></ul>' : ''; | |
| 246 | $output['content'] .= ($megamenu_column) ? '</div>' : ''; | |
| 247 | $output['content'] .= '</li>'; | |
| 248 | } | |
| 249 | } | |
| 250 | $output['total_children'] = $total_children; | |
| 251 | $output['parent_children'] = $parent_children; | |
| 252 | $output['single_children'] = $single_children; | |
| 253 | return $output; | |
| 254 | } | |
| 255 | ||
| 256 | /** | |
| 257 | * Overriding theme_site_map_menu_link() | |
| 258 | * | |
| 259 | * @param array $variables | |
| 260 | * @return string | |
| 261 | */ | |
| 262 | function YOURTHEMENAME_site_map_menu_link($variables) {
| |
| 263 | ||
| 264 | $element = $variables['element']; | |
| 265 | $sub_menu = ''; | |
| 266 | ||
| 267 | /** | |
| 268 | * @see http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node/27922 | |
| 269 | */ | |
| 270 | if (YOURTHEMENAME_link_should_be_hidden($element['#href'])) {
| |
| 271 | return ''; | |
| 272 | } | |
| 273 | ||
| 274 | if ($element['#below']) {
| |
| 275 | $sub_menu = drupal_render($element['#below']); | |
| 276 | } | |
| 277 | $output = l($element['#title'], $element['#href'], $element['#localized_options']); | |
| 278 | return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n"; | |
| 279 | } | |
| 280 | ||
| 281 | /** | |
| 282 | * Returns HTML for a set of links. | |
| 283 | * @see theme_links() | |
| 284 | */ | |
| 285 | function YOURTHEMENAME_links($variables) {
| |
| 286 | $links = $variables['links']; | |
| 287 | $attributes = $variables['attributes']; | |
| 288 | $heading = $variables['heading']; | |
| 289 | global $language_url; | |
| 290 | $output = ''; | |
| 291 | ||
| 292 | if (count($links) > 0) {
| |
| 293 | $output = ''; | |
| 294 | ||
| 295 | // Treat the heading first if it is present to prepend it to the | |
| 296 | // list of links. | |
| 297 | if (!empty($heading)) {
| |
| 298 | if (is_string($heading)) {
| |
| 299 | // Prepare the array that will be used when the passed heading | |
| 300 | // is a string. | |
| 301 | $heading = array( | |
| 302 | 'text' => $heading, | |
| 303 | // Set the default level of the heading. | |
| 304 | 'level' => 'h2', | |
| 305 | ); | |
| 306 | } | |
| 307 | $output .= '<' . $heading['level']; | |
| 308 | if (!empty($heading['class'])) {
| |
| 309 | $output .= drupal_attributes(array('class' => $heading['class']));
| |
| 310 | } | |
| 311 | $output .= '>' . check_plain($heading['text']) . '</' . $heading['level'] . '>'; | |
| 312 | } | |
| 313 | ||
| 314 | $output .= '<ul' . drupal_attributes($attributes) . '>'; | |
| 315 | ||
| 316 | $num_links = count($links); | |
| 317 | $i = 1; | |
| 318 | ||
| 319 | foreach ($links as $key => $link) {
| |
| 320 | ||
| 321 | /** | |
| 322 | * @see http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node/27922 | |
| 323 | */ | |
| 324 | if (YOURTHEMENAME_link_should_be_hidden($link['href'])) {
| |
| 325 | continue; | |
| 326 | } | |
| 327 | ||
| 328 | ||
| 329 | $class = array($key); | |
| 330 | ||
| 331 | // Add first, last and active classes to the list of links to help out themers. | |
| 332 | if ($i == 1) {
| |
| 333 | $class[] = 'first'; | |
| 334 | } | |
| 335 | if ($i == $num_links) {
| |
| 336 | $class[] = 'last'; | |
| 337 | } | |
| 338 | if (isset($link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page())) | |
| 339 | && (empty($link['language']) || $link['language']->language == $language_url->language)) {
| |
| 340 | $class[] = 'active'; | |
| 341 | } | |
| 342 | $output .= '<li' . drupal_attributes(array('class' => $class)) . '>';
| |
| 343 | ||
| 344 | if (isset($link['href'])) {
| |
| 345 | // Pass in $link as $options, they share the same keys. | |
| 346 | $output .= l($link['title'], $link['href'], $link); | |
| 347 | } | |
| 348 | elseif (!empty($link['title'])) {
| |
| 349 | // Some links are actually not links, but we wrap these in <span> for adding title and class attributes. | |
| 350 | if (empty($link['html'])) {
| |
| 351 | $link['title'] = check_plain($link['title']); | |
| 352 | } | |
| 353 | $span_attributes = ''; | |
| 354 | if (isset($link['attributes'])) {
| |
| 355 | $span_attributes = drupal_attributes($link['attributes']); | |
| 356 | } | |
| 357 | $output .= '<span' . $span_attributes . '>' . $link['title'] . '</span>'; | |
| 358 | } | |
| 359 | ||
| 360 | $i++; | |
| 361 | $output .= "</li>\n"; | |
| 362 | } | |
| 363 | ||
| 364 | $output .= '</ul>'; | |
| 365 | } | |
| 366 | ||
| 367 | return $output; | |
| 368 | } | |
| 369 | ||
| 370 | /** | |
| 371 | * Theming links (theme_link()) | |
| 372 | * @see http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_link/7 | |
| 373 | * | |
| 374 | */ | |
| 375 | function YOURTHEMENAME_link($variables) {
| |
| 376 | /** | |
| 377 | * @see http://drupal.stackexchange.com/questions/27907/enable-a-nodes-menu-item-when-on-that-node/27922 | |
| 378 | */ | |
| 379 | if (YOURTHEMENAME_link_should_be_hidden($variables['path'])) {
| |
| 380 | return ''; | |
| 381 | } | |
| 382 | ||
| 383 | return '<a href="' . check_plain(url($variables['path'], $variables['options'])) . '"' . drupal_attributes($variables['options']['attributes']) . '>' . ($variables['options']['html'] ? $variables['text'] : check_plain($variables['text'])) . '</a>'; | |
| 384 | } | |
| 385 | ||
| 386 | // .... |