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