Imported Upstream version 6.x+1.3
[drupal-theme-rahunas+rootcandy] / rootcandy / template.php
1 <?php
2 // $Id: template.php,v 1.36.2.36 2009/09/11 18:26:20 sign Exp $
3
4 /**
5  * @file
6  * The theme template.php file
7  */
8
9 function _rootcandy_admin_links() {
10   global $user;
11   if ($user->uid) {
12     $links[] = '<a href="'. url('user') .'" class="user-name">'. $user->name .'</a>';
13     $links[] = '<a href="'. url('logout') .'">'. t('Logout') .'</a>';
14     $links = implode(' | ', $links);
15
16     return $links;
17   }
18 }
19
20 function rootcandy_body_class($left = NULL, $right = NULL) {
21   $class = '';
22   if ($left != '' AND $right) {
23     $class = 'sidebars';
24   }
25   else if ($left != '' AND $right == '') {
26     $class = 'sidebar-left';
27   }
28   else if ($left == '' AND $right != '') {
29     $class = 'sidebar-right';
30   }
31
32   // Add classes describing the menu trail of the page.
33   $class .= rootcandy_get_page_classes();
34
35   if (isset($class)) {
36     print ' class="'. $class .'"';
37   }
38 }
39
40 function _rootcandy_admin_navigation() {
41   $path = base_path() . path_to_theme();
42   $base = path_to_theme();
43
44   // get users role
45   global $user;
46
47   if ($user->uid != 1) {
48     // get sorted roles
49     $role_menu = _rootcandy_init_role_menu();
50     if ($role_menu) {
51       $rootcandy_navigation = theme_get_setting('rootcandy_navigation_source_'. $role_menu);
52     }
53   }
54   else {
55     $rootcandy_navigation = theme_get_setting('rootcandy_navigation_source_admin');
56     if (!isset($rootcandy_navigation)) {
57       $rootcandy_navigation = '_rootcandy_default_navigation';
58     }
59   }
60
61   if (!$rootcandy_navigation) {
62     if (!$user->uid) {
63       $menu_tree[] = array('href' => 'user/login', 'title' => t('User login'));
64     }
65   }
66   elseif ($rootcandy_navigation == '_rootcandy_default_navigation') {
67     // build default menu
68     $menu_tree[] = array('href' => 'admin', 'title' => t('Dashboard'));
69     $menu_tree[] = array('href' => 'admin/content', 'title' => t('Content'));
70     if (variable_get('node_admin_theme', '0')) {
71       $menu_tree[] = array('href' => 'node/add', 'title' => t('Create content'));
72     }
73     $menu_tree[] = array('href' => 'admin/build', 'title' => t('Building'));
74     $menu_tree[] = array('href' => 'admin/settings', 'title' => t('Configuration'));
75     $menu_tree[] = array('href' => 'admin/user', 'title' => t('Users'));
76     $menu_tree[] = array('href' => 'admin/reports', 'title' => t('Reports'));
77     if (module_exists('help')) {
78       $menu_tree[] = array('href' => 'admin/help', 'title' => t('Help'));
79     }
80   }
81   else {
82     $menu_tree = menu_navigation_links($rootcandy_navigation);
83   }
84
85   if ($menu_tree) {
86     $size = theme_get_setting('rootcandy_navigation_icons_size');
87     $icons_disabled = theme_get_setting('rootcandy_navigation_icons');
88     $class = ' class = "i'. $size .'"';
89     $output = '<ul'. $class .'>';
90
91     $custom_icons = rootcandy_custom_icons();
92     if (!isset($custom_icons)) {
93       $custom_icons = '';
94     }
95
96     $match = _rootcandy_besturlmatch($_GET['q'], $menu_tree);
97     foreach ($menu_tree as $key => $item) {
98       $id = '';
99       $icon = '';
100       $class= '';
101       // icons
102       if (!$icons_disabled) {
103         $size = theme_get_setting('rootcandy_navigation_icons_size');
104         if (!isset($size)) $size = 24;
105         $arg = explode("/", $item['href']);
106         $icon = _rootcandy_icon($arg, $size, 'admin', $custom_icons);
107         if ($icon) $icon = $icon .'<br />';
108       }
109       if ($key == $match) {
110         $id = ' id="current"';
111         if (!$icons_disabled && $size) {
112           $id = ' id="current-'. $size .'"';
113         }
114       }
115
116       // add a class to li
117       $class = ' class="'. implode($arg, '-') .'"';
118
119       $output .= '<li'. $id . $class .'><a href="'. url($item['href']) .'">'. $icon . $item['title'] .'</a>';
120       $output .= '</li>';
121     }
122     $output .= '</ul>';
123   }
124
125   return $output;
126 }
127
128 function _rootcandy_besturlmatch($needle, $menuitems) {
129   $needle = drupal_get_path_alias($needle);
130   $lastmatch = NULL;
131   $lastmatchlen = 0;
132   $urlparts = explode('/', $needle);
133   $partcount = count($urlparts);
134
135   foreach ($menuitems as $key => $menuitem) {
136     $href = $menuitem['href'];
137     $menuurlparts = explode('/', $href);
138     $matches = _rootcandy_countmatches($urlparts, $menuurlparts);
139     if (($matches > $lastmatchlen) || (($matches == $lastmatchlen) && (($lastmatch && drupal_strlen($menuitems[$lastmatch]['href'])) > drupal_strlen($href)) )) {
140       $lastmatchlen = $matches;
141       $lastmatch = $key;
142     }
143   }
144   return $lastmatch;
145 }
146
147 /**
148  * Override or insert PHPTemplate variables into the templates.
149  */
150 function rootcandy_preprocess_page(&$vars) {
151   // get secondary links
152   $vars['tabs2'] = menu_secondary_local_tasks();
153
154   // color.module integration
155   if (module_exists('color')) {
156     _color_page_alter($vars);
157   }
158
159   // notify users that they can change settings in theme settings
160   $admin_theme = variable_get('admin_theme', 'garland');
161   if (arg(0) == 'admin' AND arg(1) == 'settings' AND arg(2) == 'admin' AND ($admin_theme == 'rootcandy' OR $admin_theme == 'rootcandy_fixed' OR $admin_theme == 'rootcandy_dark')) {
162     $message = t('Thank you for using RootCandy.<br />Did you know, that Root Candy has advanced settings (Theme-specific settings fieldset)? You can change these settings at <a href="@configure-page">theme configuration page</a>.', array('@configure-page' => url('admin/build/themes/settings/'. $admin_theme)));
163     $vars['messages'] .= '<div class="messages rootcandy">'. $message .'</div>';
164   }
165
166   if (arg(0) == 'admin' || ((arg(0) == 'node' AND is_numeric(arg(1)) AND arg(2) == 'edit') || (arg(0) == 'node' AND arg(1) == 'add'))) {
167     $vars['go_home'] = '<a href="'. url() .'">'. t('Go Back to Homepage') .'</a>';
168   }
169
170   // get theme settings
171   $vars['hide_header'] = theme_get_setting('rootcandy_header_display');
172   $vars['hide_panel'] = theme_get_setting('rootcandy_hide_panel');
173
174   // append legal notice
175   $vars['closure'] .= '<div id="legal-notice">Theme created by <a href="http://sotak.co.uk" rel="external">Marek Sotak</a></div>';
176
177   $vars['hide_content'] = '';
178
179
180   // check whether help is disabled
181   if (theme_get_setting('rootcandy_help_display')) {
182     unset($vars['help']);
183   }
184
185   // dashboard
186   if (arg(0) == 'admin' AND !arg(1)) {
187     if (!theme_get_setting('rootcandy_dashboard_display')) {
188       $vars['dashboard'] = 1;
189
190       // display help and messages in regions
191       switch (theme_get_setting('rootcandy_dashboard_help')) {
192         case 'left':
193           $vars['dashboard_left'] = $vars['help'] . $vars['dashboard_left'];
194           unset($vars['help']);
195           break;
196         case 'right':
197           $vars['dashboard_right'] = $vars['help'] . $vars['dashboard_right'];
198           unset($vars['help']);
199           break;
200       }
201
202       switch (theme_get_setting('rootcandy_dashboard_messages')) {
203         case 'left':
204           $vars['dashboard_left'] = $vars['messages'] . $vars['dashboard_left'];
205           unset($vars['messages']);
206           break;
207         case 'right':
208           $vars['dashboard_right'] = $vars['messages'] . $vars['dashboard_right'];
209           unset($vars['messages']);
210           break;
211       }
212     }
213     if (theme_get_setting('rootcandy_dashboard_content_display')) {
214       $vars['hide_content'] = theme_get_setting('rootcandy_dashboard_content_display');
215     }
216   }
217
218   $vars['panel_navigation'] = '<a id="open" class="open" href="#"><span class="panel-open">'. t('Open Panel') .'</span></a>';
219   $vars['panel_navigation'] .= '<a id="close" style="display: none;" class="close" href="#"><span class="panel-close">'. t('Close Panel') .'</span></a>';
220 }
221
222 function rootcandy_admin_block_content($content) {
223   if (!$content) {
224     return '';
225   }
226
227   if (system_admin_compact_mode()) {
228     drupal_add_js(drupal_get_path('theme', 'rootcandy') .'/compact-icon.js');
229     drupal_add_css(drupal_get_path('theme', 'rootcandy') .'/compact-icon.css');
230     $counter = 1;
231     $output = '<ul class="admin-menu-compact">';
232     foreach ($content as $item) {
233       $additional_class = $counter % 4 == 0 ? ' last' : ''; //Append class last to every 4th item signifying a new row
234       $item['localized_options']['html'] = TRUE;
235
236       if ($image = _rootcandy_menu_icon($item['href'])) {
237         $link = l($image .'<br />'. $item['title'], $item['href'], $item['localized_options']);
238       }
239       else {
240         $link = l(theme('image', drupal_get_path('theme', 'rootcandy') .'/icons/i32/misc/unknown.png') .'<br />'. $item['title'], $item['href'], $item['localized_options']);
241       }
242
243       $output .= '<li class="leaf'. $additional_class .'">'. $link .'</li>';
244       $counter++;
245     }
246     $output .= '</ul>';
247   }
248   else {
249     $output = '<dl class="admin-list">';
250     foreach ($content as $item) {
251       $output .= '<dt>'. l($item['title'], $item['href'], $item['localized_options']) .'</dt>';
252       $output .= '<dd>'. $item['description'] .'</dd>';
253     }
254     $output .= '</dl>';
255   }
256
257   return $output;
258 }
259
260 function _rootcandy_menu_icon($href) {
261   $filename = drupal_get_path('theme', 'rootcandy') .'/icons/i32/admin/'. str_replace('/', '-', drupal_strtolower($href)) .'.png';
262   return theme('image', $filename);
263 }
264
265 /**
266  * Returns the rendered local tasks. The default implementation renders
267  * them as tabs. Overridden to split the secondary tasks.
268  *
269  * @ingroup themeable
270  */
271 function rootcandy_menu_local_tasks() {
272   return menu_primary_local_tasks();
273 }
274
275 function _rootcandy_icon($name, $size = '16', $subdir = '', $icons = '') {
276   $url = implode("/", $name);
277   $name = implode("-", $name);
278   $path = path_to_theme();
279   if ($subdir) {
280     $subdir = $subdir .'/';
281   }
282
283   if (isset($icons[$url])) {
284     $icon = $icons[$url];
285   }
286   else {
287     $icon = $path .'/icons/i'. $size .'/'. $subdir . $name .'.png';
288   }
289
290   $output = theme('image', $icon);
291
292   if (!$output) {
293     $icon = $path .'/icons/i'. $size .'/misc/unknown.png';
294     $output = theme('image', $icon);
295   }
296
297   return $output;
298 }
299
300 function rootcandy_custom_icons() {
301   $custom_icons = theme_get_setting('rootcandy_navigation_custom_icons');
302   if (isset($custom_icons)) {
303     $list = explode("\n", $custom_icons);
304     $list = array_map('trim', $list);
305     $list = array_filter($list, 'strlen');
306     foreach ($list as $opt) {
307       // Sanitize the user input with a permissive filter.
308       $opt = rootcandy_filter_xss($opt);
309       if (strpos($opt, '|') !== FALSE) {
310         list($key, $value) = explode('|', $opt);
311         $icons[$key] = $value ? $value : $key;
312       }
313       else {
314         $icons[$opt] = $opt;
315       }
316     }
317   }
318   if (isset($icons)) {
319     return $icons;
320   }
321 }
322
323 function rootcandy_filter_xss($string) {
324   return filter_xss($string);
325 }
326
327 /**
328  * Read the theme settings' default values from the .info and save them into the database.
329  *
330  * @param $theme
331  *   The actual name of theme that is being checked.
332  */
333 function rootcandy_settings_init($theme) {
334   $themes = list_themes();
335
336   // Get the default values from the .info file.
337   $defaults = (is_array($themes[$theme]->info['settings'])) ? $themes[$theme]->info['settings'] : array();
338
339   // Get the theme settings saved in the database.
340   $settings = theme_get_settings($theme);
341   // Don't save the toggle_node_info_ variables.
342   if (module_exists('node')) {
343     foreach (node_get_types() as $type => $name) {
344       unset($settings['toggle_node_info_'. $type]);
345     }
346   }
347
348   // Save default theme settings.
349   variable_set(
350     str_replace('/', '_', 'theme_'. $theme .'_settings'),
351     array_merge($defaults, $settings)
352   );
353   // Force refresh of Drupal internals.
354   theme_get_setting('', TRUE);
355 }
356
357 /*
358  * In addition to initializing the theme settings during HOOK_theme(), init them
359  * when viewing/resetting the admin/build/themes/settings/THEME forms.
360  */
361 if (arg(0) == 'admin' && arg(2) == 'themes' && arg(4)) {
362   global $theme_key;
363   rootcandy_settings_init($theme_key);
364 }
365
366 function rootcandy_get_page_classes($path = NULL) {
367   if (!isset($path)) $path = $_GET['q'];
368   if ($path) {
369     $classes = '';
370     $menu_item = explode('/', $path);
371     if (count($menu_item)) {
372       foreach ($menu_item as $key => $page) {
373         $menu_item[$key] = strtr($page, '-', '_');
374       }
375
376       do {
377         $classes .= ' '. implode('-', $menu_item);
378         array_pop($menu_item);
379       } while (count($menu_item));
380     }
381   }
382
383   return $classes;
384 }
385
386 function rootcandy_breadcrumb($breadcrumb) {
387   if (!empty($breadcrumb)) {
388     /*
389      * Modern browsers (Firefox 1.5 and above, Internet Explorer 5.0 and above,
390      * Safari not checked) would automatically change the double-arrows (») to
391      * the other direction once it detects a right-to-left page. So no need to
392      * reverse the array, and no need to use reversed-direction arrows.
393      */
394     return '<div class="breadcrumb">'. str_replace(t('Administer'), t('Dashboard'), implode(' » ', $breadcrumb)) .'</div>';
395   }
396 }
397
398 function _rootcandy_links($links, $attributes = array('class' => 'links')) {
399   $output = '';
400
401   if (count($links) > 0) {
402     $output = '<ul'. drupal_attributes($attributes) .'>';
403
404     $num_links = count($links);
405     $i = 1;
406
407     foreach ($links as $key => $link) {
408       $class = $key;
409
410       // Add first, last and active classes to the list of links to help out themers.
411       if ($i == 1) {
412         $class .= ' first';
413       }
414       if ($i == $num_links) {
415         $class .= ' last';
416       }
417
418       $check_path = $_GET['q'];
419       $check_path = explode("/", $check_path);
420       $q_path = $check_path[0] .'/'. $check_path[1] .'/'. $check_path[2];
421       if (isset($link['href']) && ($link['href'] == $q_path || ($link['href'] == '<front>' && drupal_is_front_page()))) {
422         $class .= ' active';
423       }
424       $output .= '<li'. drupal_attributes(array('class' => $class)) .'>';
425
426       if (isset($link['href'])) {
427         // Pass in $link as $options, they share the same keys.
428         $output .= l($link['title'], $link['href'], $link);
429       }
430       else if (!empty($link['title'])) {
431         // Some links are actually not links, but we wrap these in <span> for adding title and class attributes
432         if (empty($link['html'])) {
433           $link['title'] = check_plain($link['title']);
434         }
435         $span_attributes = '';
436         if (isset($link['attributes'])) {
437           $span_attributes = drupal_attributes($link['attributes']);
438         }
439         $output .= '<span'. $span_attributes .'>'. $link['title'] .'</span>';
440       }
441
442       $i++;
443       $output .= "</li>\n";
444     }
445
446     $output .= '</ul>';
447   }
448
449   return $output;
450 }
451
452 function rootcandy_menu_item_link($link) {
453   if ($link['href'] == 'admin') {
454     $link['title'] = t('Dashboard');
455   }
456
457   return theme_menu_item_link($link);
458 }
459
460 function _rootcandy_countmatches($arrayone, $arraytwo) {
461   $matches = 0;
462   foreach ($arraytwo as $i => $part) {
463     if (!isset($arrayone[$i])) break;
464     if ($arrayone[$i] == $part) $matches = $i+1;
465   }
466   return $matches;
467 }
468
469 function rootcandy_system_settings_form($form) {
470   $themes = list_themes();
471   $enabled_theme = arg(4);
472   if ($form['#id'] == 'system-theme-settings' AND ($enabled_theme == 'rootcandy' || $themes[$enabled_theme]->base_theme == 'rootcandy')) {
473
474     foreach ($form['theme_specific']['rows'] as $rid => $row) {
475       //we are only interested in numeric keys
476       if (intval($rid)) {
477         $this_row = $row['data']['#value'];
478         //Add the weight field to the row
479         $weight = $form['theme_specific']['rows'][$rid]['role-weight-'. $rid]['#value'];
480         $this_row[] = drupal_render($form['theme_specific']['navigation']['nav-by-role']['rootcandy_navigation_source_'. $rid]);
481         $this_row[] = drupal_render($form['theme_specific']['rows'][$rid]['role-weight-'. $rid]);
482         //Add the row to the array of rows
483         $table_rows[$weight] = array('data' => $this_row, 'class' => 'draggable');
484       }
485     }
486     ksort($table_rows);
487
488     $header = array(
489       "Role", "Navigation menu", "Order"
490     );
491
492     $form['theme_specific']['navigation']['role-weights']['content']['#value'] = theme('table', $header, $table_rows, array('id' => 'rootcandy-settings-table'));
493     $output = drupal_render($form);
494
495     drupal_add_tabledrag('rootcandy-settings-table', 'order', 'sibling', 'weight');
496   }
497   else {
498     $output = drupal_render($form);
499   }
500   return $output;
501 }
502
503 function rootcandy_theme() {
504   return array(
505     'system_settings_form' => array(
506       'arguments' => array('form' => NULL),
507     ),
508   );
509 }
510
511 function _rootcandy_init_role_menu() {
512   global $theme_key;
513   global $user;
514   $i = 100;
515   $settings = theme_get_settings($theme_key);
516   $menu = array();
517
518   $roles = user_roles(FALSE);
519
520   foreach ($user->roles as $rid => $role) {
521     if (!$weight = $settings['role-weight-'. $rid]) {
522       $settings['role-weight-'. $rid] = $i++;
523     }
524     $menu[$settings['role-weight-'. $rid]] = $rid;
525   }
526   ksort($menu);
527   return $menu[key($menu)];
528 }