total control - admin dashboard
[indybay:drupal.git] / docs / sites / all / modules / contrib / total_control / includes / total_control.inc
1 <?php
2
3 /**
4  * @file
5  *
6  * Helper functions for total control.
7  *
8  */
9  
10 /**
11  * Submit function for content type form
12  *
13  * @param $form
14  *   The form triggering the display to be added
15  * @param $form_state
16  *   The state of the form when the request is made
17  *
18  */ 
19 function total_control_add_type_submit($form, &$form_state) {
20   // Get the type names.
21   $machine_type = $form_state['values']['type'];
22   $content_type = $form_state['values']['name'];
23   total_control_views_add_display($content_type, $machine_type);
24 }
25
26 /**
27  * Submit function for delete content type confirm form
28  *
29  * @param $form
30  *   The form triggering the display to be added
31  * @param $form_state
32  *   The state of the form when the request is made
33  *
34  */ 
35 function total_control_remove_type_submit($form, &$form_state) {
36   // Get the type name.
37   $machine_type = $form_state['values']['type'];
38   total_control_views_delete_page_display($machine_type);
39   total_control_views_delete_pane_display($machine_type);
40 }
41
42 /**
43  * Removes view page displays.
44  *
45  * @param $type
46  *   The machine readable name of the content type
47  *
48  */
49 function total_control_views_delete_page_display($type) {
50   $view = views_get_view('control_content');
51   if (array_key_exists('page_tc_' . $type, $view->display)) {
52     unset($view->display['page_tc_' . $type]);
53     $view->save();
54     menu_cache_clear_all();
55   }
56
57   return;
58 }
59
60 /**
61  * Removes view pane displays.
62  *
63  * @param $type
64  *   The machine readable name of the content type
65  *
66  */
67 function total_control_views_delete_pane_display($type) {
68   $view = views_get_view('control_content_panes');
69   if (array_key_exists('pane_tc_' . $type, $view->display)) {
70     unset($view->display['pane_tc_' . $type]);
71     $view->save();
72   }
73
74   return;
75 }
76
77 /**
78  * Adds view displays.
79  *
80  * @param $content_type
81  *   The human readable name of the content type
82  * @param $machine_type
83  *   The machine readable name of the content type
84  *
85  */
86 function total_control_views_add_display($content_type = '', $machine_type = '') {
87   if ($machine_type = '') {
88     drupal_set_message(t('no content type provided'), 'error');
89     return;
90   }
91
92   // Get total control settings.
93   $auto_page_default = variable_get('total_control_auto_pages', array());
94   $auto_pane_default = variable_get('total_control_auto_panels', array());
95
96   if (!empty($auto_page_default) && (array_key_exists('type', $auto_page_default)) 
97       && !($auto_page_default['type'] === 0)) {
98     // Add page display.
99     $view = views_get_view('control_content');
100     if (!array_key_exists('page_tc_' . $machine_type, $view->display)) { 
101       total_control_add_views_page_display($view, $content_type, $machine_type);
102       $defaults = variable_get('total_control_type_pages', array());
103       if (array_key_exists($machine_type, $defaults) || $defaults[$machine_type] != $machine_type) {
104         $defaults[$machine_type] = $machine_type;
105         $defaults = variable_set('total_control_type_pages', $defaults);
106       }
107     }
108     else {
109       drupal_set_message(t('Total Control was unable to create your 
110         administrative page view because a view already exists with the name: 
111         !name', array('!name' => 'page_tc_' . $machine_type)));
112     }
113   }
114   
115   if (!empty($auto_pane_default) && (array_key_exists('type', $auto_pane_default)) 
116       && !($auto_pane_default['type'] === 0)) {
117     // Add pane display.
118     $paneview = views_get_view('control_content_panes');
119     if (!array_key_exists('pane_tc_' . $machine_type, $paneview->display)) {
120       total_control_add_views_pane_display($paneview, $content_type, $machine_type);
121       $defaults = variable_get('total_control_type_panes', array());
122       $defaults[$machine_type] = $machine_type;
123       $defaults = variable_set('total_control_type_panes', $defaults);
124     }
125     else {
126       drupal_set_message(t('Total Control was unable to create your 
127         administrative pane view because a view already exists with the name: 
128         !name', array('!name' => 'pane_tc_' . $machine_type)));
129     }
130   }
131
132  return;
133 }
134
135 /**
136  * Adds a pane display to the view
137  *
138  * @param $view
139  *   The view to which the display is added
140  * @param $content_type
141  *   The human-readable content type name
142  * @param $machine_type
143  *   The machine-readable content type name
144  *
145  */
146 function total_control_add_views_pane_display(&$view, $content_type, $machine_type) {  
147   // Build the display.
148   $handler = $view->new_display('panel_pane', $content_type . ' pane', 'panel_pane_tc_' . $machine_type);
149   $handler->display->display_options['defaults']['title'] = FALSE;
150   $handler->display->display_options['title'] = 'New ' . $content_type . ' content';
151   $handler->display->display_options['defaults']['filters'] = FALSE;
152   // Add a filter for Content: Type.
153   $handler->display->display_options['filters']['type']['id'] = 'type';
154   $handler->display->display_options['filters']['type']['table'] = 'node';
155   $handler->display->display_options['filters']['type']['field'] = 'type';
156   $handler->display->display_options['filters']['type']['value'] = array(
157     $machine_type => $machine_type,
158   );
159   $handler->display->display_options['filters']['type']['expose']['operator'] = FALSE;
160   $handler->display->display_options['pane_title'] = 'New ' . $content_type . ' content';
161   $handler->display->display_options['pane_description'] = 'Total Control ' . $content_type . ' summary';
162   $handler->display->display_options['pane_category']['name'] = 'Total Control';
163   $handler->display->display_options['pane_category']['weight'] = '0';
164   $handler->display->display_options['allow']['items_per_page'] = 'items_per_page';
165
166   // save the view and return
167   $view->save();
168   return;
169 }
170
171 /**
172  * Adds a page display to an existing view
173  *
174  * @param $view
175  *   The view to which the display is added
176  * @param $content_type
177  *   The human-readable content type name
178  * @param $machine_type
179  *   The machine-readable content type name
180  *
181  */
182 function total_control_add_views_page_display(&$view, $content_type, $machine_type) {
183   // Prepare variables.
184   $machine_path =  str_replace('_', '-', $machine_type);
185   // Build the display.
186   $handler = $view->new_display('page', $content_type . ' Page', 'page_tc_' . $machine_type);
187
188   $handler->display->display_options['title'] = $content_type . ' content';
189   $handler->display->display_options['defaults']['title'] = FALSE;
190   $handler->display->display_options['defaults']['header'] = FALSE;
191   $handler->display->display_options['defaults']['filters'] = FALSE;
192   $handler->display->display_options['path'] = 'admin/dashboard/content/' . $machine_path;
193   $handler->display->display_options['menu']['type'] = 'tab';
194   $handler->display->display_options['menu']['title'] = $content_type . ' content';
195   $handler->display->display_options['menu']['weight'] = '0';
196
197   // Filters differ depending on search module.
198   $filters = total_control_add_filters($machine_type);
199   $handler->override_option('filters', $filters);
200
201   // Save the view, flush the menu cache, and return.
202   $view->save();
203   menu_cache_clear_all();
204
205   return;
206 }
207
208 /**
209  * Returns filters to a view - tests for existence of search module
210  *
211  * @param $machine_type
212  *   The machine-readable content type name
213  *
214  * @return $filters
215  *   An array of filters for the view
216  *
217  */
218 function total_control_add_filters($machine_type = NULL) {
219   $filters = array(
220     'status' => array(
221       'id' => 'status',
222       'table' => 'node',
223       'field' => 'status',
224       'value' => '1',
225       'exposed' => TRUE,
226       'expose' => array(
227         'identifier' => 'status',
228         'label' => 'Published',
229         'required' => FALSE,
230       ),
231     ),
232     'uid' => array(
233       'id' => 'uid',
234       'table' => 'users',
235       'field' => 'uid',
236       'operator' => 'in',
237       'value' => '',
238       'exposed' => TRUE,
239       'expose' => array(
240         'operator_id' => 'uid_op',
241         'label' => 'Author',
242         'operator' => 'uid_op',
243         'identifier' => 'uid',
244         'required' => FALSE,
245         'reduce' => 0,
246       ),
247     )
248   );
249
250   if ($machine_type != NULL) {
251     $filters['type_1'] = array(
252       'id' => 'type_1',
253       'table' => 'node',
254       'field' => 'type',
255       'value' => array(
256         $machine_type => $machine_type,
257       ),
258       'expose' => array(
259         'operator' => FALSE,
260       ),
261     );
262   }
263
264   if (module_exists('search')) {
265     $filters['keys'] = array(
266       'id' => 'keys',
267       'table' => 'search_index',
268       'field' => 'keys',
269       'exposed' => TRUE,
270       'expose' => array(
271         'operator_id' => 'keys_op',
272         'label' => 'Search:',
273         'operator' => 'keys_op',
274         'identifier' => 'keys',
275         'required' => FALSE,
276       ),
277     );
278   }
279
280   return $filters;
281 }
282
283 /**
284  * Retrieves overview data for all content on the site.
285  *
286  * @param $conf
287  *   Panel content pane config data.
288  *
289  * @return $items
290  *   An array of items for a bulleted list.
291  *
292  */
293 function total_control_get_content_overview($conf = array()) {
294   $items = array();
295   $types = node_type_get_types();
296   $comments_exist = module_exists('comment');
297
298   foreach ($types as $type => $object) {
299     // Compare against type option on pane config.
300     if ((!array_key_exists($type, $conf['types'])) || (isset($conf['types']) && $conf['types'][$type] == $type)) { 
301       $type_count = db_query("SELECT count(*) FROM {node} WHERE type = :type and status = 1", array(':type' => $type))->fetchField();
302       $content_data[$type] = format_plural($type_count, '1 ' . $object->name . ' item', '@count ' . $object->name . ' items');
303
304       // Check if comments module is enabled.
305       if ($comments_exist) {
306
307         // Compare against comment options on pane config.
308         if (array_key_exists($type, $conf['comments']) && $conf['comments'][$type] === $type) {
309           $comment_count = db_query("SELECT count(DISTINCT cid) FROM {comment} c INNER JOIN {node} n ON c.nid = n.nid WHERE n.type = :type and c.status = 1 AND n.status = 1", array(':type' => $type))->fetchField();
310           $content_data[$type . '_comments'] =  format_plural($comment_count, '1 comment', '@count comments');
311
312           // Compare against spam option checkbox on pane config.
313           if (isset($conf['spam']) && $conf['spam'] == 1) {
314             $spam_count = db_query("SELECT count(DISTINCT c.cid) FROM {comment} c INNER JOIN {node} n ON c.nid = n.nid WHERE n.type = :type and c.status = 0 AND n.status = 1", array(':type' => $type))->fetchField();
315             $content_data[$type . '_comments_spam'] = format_plural($spam_count, '1 spam', '@count spam');
316           }
317         }
318       }
319
320       $line =  $content_data[$type];
321       $line .= (isset($content_data[$type . '_comments']))? ' with ' . $content_data[$type . '_comments'] : '' ;
322       $line .= (isset($content_data[$type . '_comments_spam']))? ' (' . $content_data[$type . '_comments_spam'] . ')' : '' ;
323       $items[] = $line;
324     }
325   }
326
327   return $items;
328 }
329
330 /**
331  * Adds content settings to the panel pane config form.
332  *
333  * @param $form
334  *   Panel pane config form.
335  * @param $conf
336  *   Panel content pane config data.
337  *
338  */
339 function total_control_add_content_pane_settings(&$form, $conf = array()) {
340   $types = node_type_get_types();
341   $type_options = array();
342   $type_defaults = array();
343   $comment_defaults = array();
344
345   // Set defaults based on pane config.
346   if (isset($conf['types'])) {
347     $type_defaults = $conf['types'];
348   }
349
350   if (isset($conf['comments'])) {
351     $comment_defaults = $conf['comments'];
352   }
353
354   foreach ($types as $machine_type => $type) {
355     $type_options[$machine_type] = $type->name;
356     // Display new content types by default.
357     if (!array_key_exists($machine_type, $type_defaults)) {
358       $type_defaults[$machine_type] = $machine_type;
359     }
360     // Do not display comments on new types by default unless it's a blog or a forum.
361     if (!array_key_exists($machine_type, $comment_defaults)) {
362       if ($machine_type == 'blog' || $machine_type == 'forum topic') {
363         $comment_defaults[$machine_type] = $machine_type;
364       }
365       else {
366         $comment_defaults[$machine_type] = 0;
367       }
368     }
369   }
370
371   $form['types'] = array(
372     '#type' => 'checkboxes',
373     '#title' => t('Show <strong>post</strong> counts for the following content types'),
374     '#options' => $type_options,
375     '#default_value' => $type_defaults,
376   );
377
378   if (module_exists('comment')) {
379     $form['comments'] = array(
380       '#type' => 'checkboxes',
381       '#title' => t('Show <strong>comment</strong> counts for the following content types'),
382       '#options' => $type_options,
383       '#default_value' => $comment_defaults,
384     );
385     $spam_options = array(
386       0 => t('no'), 
387       1 => t('Include spam counts with comments')
388     );
389     $form['spam'] = array(
390       '#type' => 'checkbox',
391       '#title' => t('Include spam counts with comments'),
392       '#options' => $spam_options,
393       '#default_value' => ($form_state['op'] == 'add')? 1 : $conf['spam'],
394     );
395   }
396 }
397
398 /**
399  * Retrieves overview data for all users on the site.
400  *
401  * @param $conf
402  *   Panel content pane config data.
403  *
404  * @return $items
405  *   A structured array of items containing user data, in the following format:
406  *     $items = array(
407  *       'all' => 16,
408  *       'active' => 9,
409  *       'blocked' => 2,
410  *       'roles' => array(
411  *         3 => array(
412  *           'name' => 'Administrator',
413  *           'count' => 4,
414  *         ),
415  *       ),
416  *     );
417  */
418 function total_control_get_user_overview($conf = array()) {
419   $items = array();
420
421   // User Overview
422   if (!$conf['user'] || $conf['user'] == 1) {
423     $items['all'] = db_query("SELECT count(*) FROM {users}")->fetchField();
424     $items['active'] = db_query("SELECT count(*) FROM {users} WHERE status = 1 AND login <> 0")->fetchField();
425     $items['blocked'] = db_query("SELECT count(*) FROM {users} WHERE status = 0")->fetchField();
426   }
427
428   // Roles Overview
429   $roles = user_roles(TRUE);
430   $items['roles'] = array();
431   foreach ($roles as $rid => $role) {
432     if (($rid != 2) && (array_key_exists($rid, $conf['roles']) && $conf['roles'][$rid])) {
433       $user_role_count = db_query("SELECT count(*) FROM {users} u INNER JOIN {users_roles} r on u.uid = r.uid WHERE r.rid = :rid", array(':rid' => $rid))->fetchField();
434       $items['roles'][$rid] = array();
435       $items['roles'][$rid]['name'] = $role;
436       $items['roles'][$rid]['count'] = $user_role_count;
437     }
438   }
439
440   return $items;
441 }
442
443 /**
444  * Adds user settings to the panel pane config form.
445  *
446  * @param $form
447  *   Panel pane config form.
448  * @param $conf
449  *   Panel content pane config data.
450  *
451  */
452 function total_control_add_user_pane_settings(&$form, $conf = array()) {
453   $user_options = array(
454     0 => t('no'), 
455     1 => t('Include the total number of user accounts, including active and blocked.'));
456   $form['user'] = array(
457     '#type' => 'checkbox',
458     '#title' => t('Include the total number of user accounts, including active and blocked.'),
459     '#options' => $user_options,
460     '#default_value' => ($form_state['op'] == 'add')? TRUE : $conf['user'],
461     );
462
463   $roles = user_roles(TRUE);
464   $roles_options = array();
465   $roles_defaults = array();
466   foreach ($roles as $rid => $role) {
467     if ($rid != 2) {
468       $roles_options[$rid] = $role;
469       $roles_defaults[] = $rid;
470     }
471   }
472
473   if (!empty($roles_options)) {
474     $form['roles'] = array(
475       '#type' => 'checkboxes',
476       '#title' => t('Include the number of user accounts with the following roles:'),
477       '#options' => $roles_options,
478       '#default_value' => ($conf['roles'])? $conf['roles']: $roles_defaults,
479       );
480   }
481 }