View difference between Paste ID: DKi5aSyq and PzQFhykn
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
// ....