dd34bad2da2d67b09b1916ee7e68b237ae8087f0
[drupal-theme-rahunas+rootcandy] / rootcandy / template.php
1 <?php
2 // $Id: template.php,v 1.36.2.19 2009/03/31 13:06:15 sign Exp $
3
4 function _rootcandy_admin_links() {
5   global $user;
6   if ($user->uid) {
7     $links[] = '<a href="'. url('user') .'" class="user-name">'. $user->name .'</a>';
8     $links[] = '<a href="'. url('logout') .'">'. t('Logout') .'</a>';
9     $links = implode(' | ', $links);
10
11     return $links;
12   }
13 }
14
15 function rootcandy_body_class($left = NULL, $right = NULL) {
16   $class = '';
17   if ($left != '' AND $right) {
18     $class = 'sidebars';
19   }
20   else if ($left != '' AND $right == '') {
21     $class = 'sidebar-left';
22   }
23   else if ($left == '' AND $right != '') {
24     $class = 'sidebar-right';
25   }
26
27   // Add classes describing the menu trail of the page.
28   $class .= rootcandy_get_page_classes();
29
30   if (isset($class)) {
31     print ' class="'. $class .'"';
32   }
33 }
34
35 function _rootcandy_admin_navigation() {
36   $path = base_path() . path_to_theme();
37   $base = path_to_theme();
38
39   /**
40    *
41    */
42   // get users role
43   global $user;
44
45   if ($user->uid != 1) {
46     // get sorted roles
47     $role_weights = theme_get_setting('role-weight');
48     if ($role_weights) {
49       $filter_out = array_keys($user->roles);
50       $roles = array_intersect(array_flip($role_weights), $filter_out);
51       ksort($roles);
52       $keys = array_keys($roles);
53       $role = $roles[$keys[0]];
54
55       $rootcandy_navigation = theme_get_setting('rootcandy_navigation_source_'.$role);
56     }
57   }
58   else {
59     $rootcandy_navigation = '_rootcandy_default_navigation';
60   }
61
62   if (!$rootcandy_navigation) {
63     if (!$user->uid) {
64       $menu_tree[] = array('href' => 'user/login', 'title' => t('User login'));
65     }
66   }
67   elseif ($rootcandy_navigation == '_rootcandy_default_navigation') {
68     // build default menu
69     $menu_tree[] = array('href' => 'admin', 'title' => t('Dashboard'));
70     $menu_tree[] = array('href' => 'admin/content', 'title' => t('Content'));
71     if (variable_get('node_admin_theme', '0')) {
72       $menu_tree[] = array('href' => 'node/add', 'title' => t('Create content'));
73     }
74     $menu_tree[] = array('href' => 'admin/build', 'title' => t('Building'));
75     $menu_tree[] = array('href' => 'admin/settings', 'title' => t('Configuration'));
76     $menu_tree[] = array('href' => 'admin/user', 'title' => t('Users'));
77     $menu_tree[] = array('href' => 'admin/reports', 'title' => t('Reports'));
78     $menu_tree[] = array('href' => 'admin/help', 'title' => t('Help'));
79   }
80   else {
81     $menu_tree = menu_navigation_links($rootcandy_navigation);
82   }
83
84   if ($menu_tree) {
85     $size = theme_get_setting('rootcandy_navigation_icons_size');
86     $icons_disabled = theme_get_setting('rootcandy_navigation_icons');
87     $class = ' class = i'.$size;
88     $output = '<ul'.$class.'>';
89
90     $custom_icons = rootcandy_custom_icons();
91     if (!isset($custom_icons)) {
92       $custom_icons = '';
93     }
94
95     $match = _rootcandy_besturlmatch($_GET['q'],$menu_tree);
96     foreach ($menu_tree as $key => $item) {
97       $id = '';
98       $icon = '';
99       $class= '';
100       // icons
101       if (!$icons_disabled) {
102         $size = theme_get_setting('rootcandy_navigation_icons_size');
103         if (!isset($size)) $size = 24;
104         $arg = explode("/", $item['href']);
105         $icon = _rootcandy_icon($arg, $size, 'admin', $custom_icons);
106         if ($icon) $icon = $icon .'<br />';
107       }
108       if ($key == $match) {
109         $id = ' id="current"';
110         if (!$icons_disabled && $size) {
111           $id = ' id="current-'. $size .'"';
112         }
113       }
114       $output .= '<li'. $id . $class .'><a href="'. url($item['href']) .'">'. $icon . $item['title'] .'</a>';
115       $output .= '</li>';
116     }
117     $output .= '</ul>';
118   }
119
120   return $output;
121 }
122
123 function _rootcandy_besturlmatch($needle, $menuitems) {
124   $lastmatch = null;
125   $lastmatchlen = 0;
126   $urlparts = explode('/', $needle);
127   $partcount = count($urlparts);
128
129   foreach($menuitems as $key => $menuitem) {
130     $href = $menuitem['href'];
131     $menuurlparts = explode('/', $href);
132     $matches = _rootcandy_countmatches($urlparts, $menuurlparts);
133     if (($matches > $lastmatchlen) || (($matches == $lastmatchlen) && (($lastmatch && strlen($menuitems[$lastmatch]['href'])) > strlen($href)) )) {
134       $lastmatchlen = $matches;
135       $lastmatch = $key;
136     }
137   }
138   return $lastmatch;
139 }
140
141 /**
142  * Override or insert PHPTemplate variables into the templates.
143  */
144 function rootcandy_preprocess_page(&$vars) {
145   // get secondary links
146   $vars['tabs2'] = menu_secondary_local_tasks();
147
148   // color.module integration
149   if (module_exists('color')) {
150     _color_page_alter($vars);
151   }
152
153   if (arg(0) == 'admin' || (variable_get('test',1) AND ((arg(0) == 'node' AND is_numeric(arg(1)) AND arg(2) == 'edit') || (arg(0) == 'node' AND arg(1) == 'add')))) {
154     $vars['go_home'] = '<a href="'.url().'">'.t('Go Back to Homepage').'</a>';
155   }
156
157   // get theme settings
158   $vars['hide_header'] = theme_get_setting('rootcandy_header_display');
159
160   // append legal notice
161   $vars['closure'] .= '<div id="legal-notice">Theme created by <a href="http://sotak.co.uk" target="_blank">Marek Sotak</a></div>';
162
163   $vars['hide_content'] = '';
164
165   // dashboard
166   if (arg(0) == 'admin' AND !arg(1)) {
167     if (!theme_get_setting('rootcandy_dashboard_display')) {
168       $vars['dashboard'] = 1;
169       // display help and messages in regions
170       switch (theme_get_setting('rootcandy_dashboard_help')) {
171         case 'left':
172           $vars['dashboard_left'] = $vars['help'] . $vars['dashboard_left'];
173           unset ($vars['help']);
174           break;
175         case 'right':
176           $vars['dashboard_right'] = $vars['help'] . $vars['dashboard_right'];
177           unset ($vars['help']);
178           break;
179       }
180
181       switch (theme_get_setting('rootcandy_dashboard_messages')) {
182         case 'left':
183           $vars['dashboard_left'] = $vars['messages'] . $vars['dashboard_left'];
184           unset ($vars['messages']);
185           break;
186         case 'right':
187           $vars['dashboard_right'] = $vars['messages'] . $vars['dashboard_right'];
188           unset ($vars['messages']);
189           break;
190       }
191     }
192     if (theme_get_setting('rootcandy_dashboard_content_display')) {
193       $vars['hide_content'] = theme_get_setting('rootcandy_dashboard_content_display');
194     }
195   }
196 }
197
198 /**
199  * Returns the rendered local tasks. The default implementation renders
200  * them as tabs. Overridden to split the secondary tasks.
201  *
202  * @ingroup themeable
203  */
204 function rootcandy_menu_local_tasks() {
205   return menu_primary_local_tasks();
206 }
207
208 function _rootcandy_icon($name, $size = '16', $subdir = '', $icons = '') {
209   $url = implode("/", $name);
210   $name = implode("-", $name);
211   $path = path_to_theme();
212   if ($subdir) {
213     $subdir = $subdir .'/';
214   }
215
216   if (isset($icons[$url])) {
217     $icon = $icons[$url];
218   }
219   else {
220     $icon = $path .'/icons/i'. $size .'/'. $subdir . $name .'.png';
221   }
222
223   $output = theme('image', $icon);
224
225   if (!$output) {
226     $icon = $path .'/icons/i'. $size .'/misc/unknown.png';
227     $output = theme('image', $icon);
228   }
229
230   return $output;
231 }
232
233 function rootcandy_custom_icons() {
234   $custom_icons = theme_get_setting('rootcandy_navigation_custom_icons');
235   if (isset($custom_icons)) {
236     $list = explode("\n",$custom_icons);
237     $list = array_map('trim', $list);
238     $list = array_filter($list, 'strlen');
239     foreach ($list as $opt) {
240       // Sanitize the user input with a permissive filter.
241       $opt = rootcandy_filter_xss($opt);
242       if (strpos($opt, '|') !== FALSE) {
243         list($key, $value) = explode('|', $opt);
244         $icons[$key] = $value ? $value : $key;
245       }
246       else {
247         $icons[$opt] = $opt;
248       }
249     }
250   }
251   if (isset($icons)) {
252     return $icons;
253   }
254 }
255
256 function rootcandy_filter_xss($string) {
257   return filter_xss($string);
258 }
259
260 /**
261  * Read the theme settings' default values from the .info and save them into the database.
262  *
263  * @param $theme
264  *   The actual name of theme that is being checked.
265  */
266 function rootcandy_settings_init($theme) {
267   $themes = list_themes();
268
269   // Get the default values from the .info file.
270   $defaults = $themes[$theme]->info['settings'];
271
272   // Get the theme settings saved in the database.
273   $settings = theme_get_settings($theme);
274   // Don't save the toggle_node_info_ variables.
275   if (module_exists('node')) {
276     foreach (node_get_types() as $type => $name) {
277       unset($settings['toggle_node_info_'. $type]);
278     }
279   }
280   // Save default theme settings.
281   variable_set(
282     str_replace('/', '_', 'theme_'. $theme .'_settings'),
283     array_merge($defaults, $settings)
284   );
285   // Force refresh of Drupal internals.
286   theme_get_setting('', TRUE);
287 }
288
289 /*
290  * In addition to initializing the theme settings during HOOK_theme(), init them
291  * when viewing/resetting the admin/build/themes/settings/THEME forms.
292  */
293 if (arg(0) == 'admin' && arg(2) == 'themes' && arg(4)) {
294   global $theme_key;
295   rootcandy_settings_init($theme_key);
296 }
297
298 function rootcandy_get_page_classes($path = NULL) {
299   if (!isset($path)) $path = $_GET['q'];
300   if ($path) {
301     $classes = '';
302     $menu_item = explode('/', $path);
303     if (count($menu_item)) {
304       foreach ($menu_item as $key => $page) {
305         $menu_item[$key] = strtr($page, '-', '_');
306       }
307
308       do {
309         $classes .= ' '. implode('-', $menu_item);
310         array_pop($menu_item);
311       } while (count($menu_item));
312     }
313   }
314
315   return $classes;
316 }
317
318 function rootcandy_breadcrumb($breadcrumb) {
319   if (!empty($breadcrumb)) {
320     /*
321      * Modern browsers (Firefox 1.5 and above, Internet Explorer 5.0 and above,
322      * Safari not checked) would automatically change the double-arrows (») to
323      * the other direction once it detects a right-to-left page. So no need to
324      * reverse the array, and no need to use reversed-direction arrows.
325      */
326     return '<div class="breadcrumb">'. str_replace(t('Administer'), t('Dashboard'), implode(' » ', $breadcrumb)) .'</div>';
327   }
328 }
329
330 function _rootcandy_links($links, $attributes = array('class' => 'links')) {
331   $output = '';
332
333   if (count($links) > 0) {
334     $output = '<ul'. drupal_attributes($attributes) .'>';
335
336     $num_links = count($links);
337     $i = 1;
338
339     foreach ($links as $key => $link) {
340       $class = $key;
341
342       // Add first, last and active classes to the list of links to help out themers.
343       if ($i == 1) {
344         $class .= ' first';
345       }
346       if ($i == $num_links) {
347         $class .= ' last';
348       }
349
350       $check_path = $_GET['q'];
351       $check_path = explode("/", $check_path);
352       $q_path = $check_path[0] .'/'. $check_path[1] .'/'. $check_path[2];
353       if (isset($link['href']) && ($link['href'] == $q_path || ($link['href'] == '<front>' && drupal_is_front_page()))) {
354         $class .= ' active';
355       }
356       $output .= '<li'. drupal_attributes(array('class' => $class)) .'>';
357
358       if (isset($link['href'])) {
359         // Pass in $link as $options, they share the same keys.
360         $output .= l($link['title'], $link['href'], $link);
361       }
362       else if (!empty($link['title'])) {
363         // Some links are actually not links, but we wrap these in <span> for adding title and class attributes
364         if (empty($link['html'])) {
365           $link['title'] = check_plain($link['title']);
366         }
367         $span_attributes = '';
368         if (isset($link['attributes'])) {
369           $span_attributes = drupal_attributes($link['attributes']);
370         }
371         $output .= '<span'. $span_attributes .'>'. $link['title'] .'</span>';
372       }
373
374       $i++;
375       $output .= "</li>\n";
376     }
377
378     $output .= '</ul>';
379   }
380
381   return $output;
382 }
383
384 function rootcandy_menu_item_link($link) {
385   if($link['href'] == 'admin'){
386     $link['title'] = t('Dashboard');
387   }
388
389   return theme_menu_item_link($link);
390 }
391
392 function _rootcandy_countmatches($arrayone, $arraytwo) {
393   $matches = 0;
394   foreach($arraytwo as $i => $part) {
395     if (!isset($arrayone[$i])) break;
396     if ($arrayone[$i] == $part) $matches = $i+1;
397   }
398   return $matches;
399 }