annotate modules/dblog/dblog.admin.inc @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Administrative page callbacks for the Database Logging module.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Page callback: Displays a listing of database log messages.
danielebarchiesi@0 10 *
danielebarchiesi@0 11 * Messages are truncated at 56 chars. Full-length messages can be viewed on the
danielebarchiesi@0 12 * message details page.
danielebarchiesi@0 13 *
danielebarchiesi@0 14 * @see dblog_clear_log_form()
danielebarchiesi@0 15 * @see dblog_event()
danielebarchiesi@0 16 * @see dblog_filter_form()
danielebarchiesi@0 17 * @see dblog_menu()
danielebarchiesi@0 18 *
danielebarchiesi@0 19 * @ingroup logging_severity_levels
danielebarchiesi@0 20 */
danielebarchiesi@0 21 function dblog_overview() {
danielebarchiesi@0 22 $filter = dblog_build_filter_query();
danielebarchiesi@0 23 $rows = array();
danielebarchiesi@0 24 $classes = array(
danielebarchiesi@0 25 WATCHDOG_DEBUG => 'dblog-debug',
danielebarchiesi@0 26 WATCHDOG_INFO => 'dblog-info',
danielebarchiesi@0 27 WATCHDOG_NOTICE => 'dblog-notice',
danielebarchiesi@0 28 WATCHDOG_WARNING => 'dblog-warning',
danielebarchiesi@0 29 WATCHDOG_ERROR => 'dblog-error',
danielebarchiesi@0 30 WATCHDOG_CRITICAL => 'dblog-critical',
danielebarchiesi@0 31 WATCHDOG_ALERT => 'dblog-alert',
danielebarchiesi@0 32 WATCHDOG_EMERGENCY => 'dblog-emerg',
danielebarchiesi@0 33 );
danielebarchiesi@0 34
danielebarchiesi@0 35 $build['dblog_filter_form'] = drupal_get_form('dblog_filter_form');
danielebarchiesi@0 36 $build['dblog_clear_log_form'] = drupal_get_form('dblog_clear_log_form');
danielebarchiesi@0 37
danielebarchiesi@0 38 $header = array(
danielebarchiesi@0 39 '', // Icon column.
danielebarchiesi@0 40 array('data' => t('Type'), 'field' => 'w.type'),
danielebarchiesi@0 41 array('data' => t('Date'), 'field' => 'w.wid', 'sort' => 'desc'),
danielebarchiesi@0 42 t('Message'),
danielebarchiesi@0 43 array('data' => t('User'), 'field' => 'u.name'),
danielebarchiesi@0 44 array('data' => t('Operations')),
danielebarchiesi@0 45 );
danielebarchiesi@0 46
danielebarchiesi@0 47 $query = db_select('watchdog', 'w')->extend('PagerDefault')->extend('TableSort');
danielebarchiesi@0 48 $query->leftJoin('users', 'u', 'w.uid = u.uid');
danielebarchiesi@0 49 $query
danielebarchiesi@0 50 ->fields('w', array('wid', 'uid', 'severity', 'type', 'timestamp', 'message', 'variables', 'link'))
danielebarchiesi@0 51 ->addField('u', 'name');
danielebarchiesi@0 52 if (!empty($filter['where'])) {
danielebarchiesi@0 53 $query->where($filter['where'], $filter['args']);
danielebarchiesi@0 54 }
danielebarchiesi@0 55 $result = $query
danielebarchiesi@0 56 ->limit(50)
danielebarchiesi@0 57 ->orderByHeader($header)
danielebarchiesi@0 58 ->execute();
danielebarchiesi@0 59
danielebarchiesi@0 60 foreach ($result as $dblog) {
danielebarchiesi@0 61 $rows[] = array('data' =>
danielebarchiesi@0 62 array(
danielebarchiesi@0 63 // Cells
danielebarchiesi@0 64 array('class' => 'icon'),
danielebarchiesi@0 65 t($dblog->type),
danielebarchiesi@0 66 format_date($dblog->timestamp, 'short'),
danielebarchiesi@0 67 theme('dblog_message', array('event' => $dblog, 'link' => TRUE)),
danielebarchiesi@0 68 theme('username', array('account' => $dblog)),
danielebarchiesi@0 69 filter_xss($dblog->link),
danielebarchiesi@0 70 ),
danielebarchiesi@0 71 // Attributes for tr
danielebarchiesi@0 72 'class' => array(drupal_html_class('dblog-' . $dblog->type), $classes[$dblog->severity]),
danielebarchiesi@0 73 );
danielebarchiesi@0 74 }
danielebarchiesi@0 75
danielebarchiesi@0 76 $build['dblog_table'] = array(
danielebarchiesi@0 77 '#theme' => 'table',
danielebarchiesi@0 78 '#header' => $header,
danielebarchiesi@0 79 '#rows' => $rows,
danielebarchiesi@0 80 '#attributes' => array('id' => 'admin-dblog'),
danielebarchiesi@0 81 '#empty' => t('No log messages available.'),
danielebarchiesi@0 82 );
danielebarchiesi@0 83 $build['dblog_pager'] = array('#theme' => 'pager');
danielebarchiesi@0 84
danielebarchiesi@0 85 return $build;
danielebarchiesi@0 86 }
danielebarchiesi@0 87
danielebarchiesi@0 88 /**
danielebarchiesi@0 89 * Page callback: Shows the most frequent log messages of a given event type.
danielebarchiesi@0 90 *
danielebarchiesi@0 91 * Messages are not truncated on this page because events detailed herein do not
danielebarchiesi@0 92 * have links to a detailed view.
danielebarchiesi@0 93 *
danielebarchiesi@0 94 * @param string $type
danielebarchiesi@0 95 * Type of database log events to display (e.g., 'search').
danielebarchiesi@0 96 *
danielebarchiesi@0 97 * @return array
danielebarchiesi@0 98 * A build array in the format expected by drupal_render().
danielebarchiesi@0 99 *
danielebarchiesi@0 100 * @see dblog_menu()
danielebarchiesi@0 101 */
danielebarchiesi@0 102 function dblog_top($type) {
danielebarchiesi@0 103
danielebarchiesi@0 104 $header = array(
danielebarchiesi@0 105 array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
danielebarchiesi@0 106 array('data' => t('Message'), 'field' => 'message')
danielebarchiesi@0 107 );
danielebarchiesi@0 108 $count_query = db_select('watchdog');
danielebarchiesi@0 109 $count_query->addExpression('COUNT(DISTINCT(message))');
danielebarchiesi@0 110 $count_query->condition('type', $type);
danielebarchiesi@0 111
danielebarchiesi@0 112 $query = db_select('watchdog', 'w')->extend('PagerDefault')->extend('TableSort');
danielebarchiesi@0 113 $query->addExpression('COUNT(wid)', 'count');
danielebarchiesi@0 114 $query = $query
danielebarchiesi@0 115 ->fields('w', array('message', 'variables'))
danielebarchiesi@0 116 ->condition('w.type', $type)
danielebarchiesi@0 117 ->groupBy('message')
danielebarchiesi@0 118 ->groupBy('variables')
danielebarchiesi@0 119 ->limit(30)
danielebarchiesi@0 120 ->orderByHeader($header);
danielebarchiesi@0 121 $query->setCountQuery($count_query);
danielebarchiesi@0 122 $result = $query->execute();
danielebarchiesi@0 123
danielebarchiesi@0 124 $rows = array();
danielebarchiesi@0 125 foreach ($result as $dblog) {
danielebarchiesi@0 126 $rows[] = array($dblog->count, theme('dblog_message', array('event' => $dblog)));
danielebarchiesi@0 127 }
danielebarchiesi@0 128
danielebarchiesi@0 129 $build['dblog_top_table'] = array(
danielebarchiesi@0 130 '#theme' => 'table',
danielebarchiesi@0 131 '#header' => $header,
danielebarchiesi@0 132 '#rows' => $rows,
danielebarchiesi@0 133 '#empty' => t('No log messages available.'),
danielebarchiesi@0 134 );
danielebarchiesi@0 135 $build['dblog_top_pager'] = array('#theme' => 'pager');
danielebarchiesi@0 136
danielebarchiesi@0 137 return $build;
danielebarchiesi@0 138 }
danielebarchiesi@0 139
danielebarchiesi@0 140 /**
danielebarchiesi@0 141 * Page callback: Displays details about a specific database log message.
danielebarchiesi@0 142 *
danielebarchiesi@0 143 * @param int $id
danielebarchiesi@0 144 * Unique ID of the database log message.
danielebarchiesi@0 145 *
danielebarchiesi@0 146 * @return array|string
danielebarchiesi@0 147 * If the ID is located in the Database Logging table, a build array in the
danielebarchiesi@0 148 * format expected by drupal_render(); otherwise, an empty string.
danielebarchiesi@0 149 *
danielebarchiesi@0 150 * @see dblog_menu()
danielebarchiesi@0 151 */
danielebarchiesi@0 152 function dblog_event($id) {
danielebarchiesi@0 153 $severity = watchdog_severity_levels();
danielebarchiesi@0 154 $result = db_query('SELECT w.*, u.name, u.uid FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid WHERE w.wid = :id', array(':id' => $id))->fetchObject();
danielebarchiesi@0 155 if ($dblog = $result) {
danielebarchiesi@0 156 $rows = array(
danielebarchiesi@0 157 array(
danielebarchiesi@0 158 array('data' => t('Type'), 'header' => TRUE),
danielebarchiesi@0 159 t($dblog->type),
danielebarchiesi@0 160 ),
danielebarchiesi@0 161 array(
danielebarchiesi@0 162 array('data' => t('Date'), 'header' => TRUE),
danielebarchiesi@0 163 format_date($dblog->timestamp, 'long'),
danielebarchiesi@0 164 ),
danielebarchiesi@0 165 array(
danielebarchiesi@0 166 array('data' => t('User'), 'header' => TRUE),
danielebarchiesi@0 167 theme('username', array('account' => $dblog)),
danielebarchiesi@0 168 ),
danielebarchiesi@0 169 array(
danielebarchiesi@0 170 array('data' => t('Location'), 'header' => TRUE),
danielebarchiesi@0 171 l($dblog->location, $dblog->location),
danielebarchiesi@0 172 ),
danielebarchiesi@0 173 array(
danielebarchiesi@0 174 array('data' => t('Referrer'), 'header' => TRUE),
danielebarchiesi@0 175 l($dblog->referer, $dblog->referer),
danielebarchiesi@0 176 ),
danielebarchiesi@0 177 array(
danielebarchiesi@0 178 array('data' => t('Message'), 'header' => TRUE),
danielebarchiesi@0 179 theme('dblog_message', array('event' => $dblog)),
danielebarchiesi@0 180 ),
danielebarchiesi@0 181 array(
danielebarchiesi@0 182 array('data' => t('Severity'), 'header' => TRUE),
danielebarchiesi@0 183 $severity[$dblog->severity],
danielebarchiesi@0 184 ),
danielebarchiesi@0 185 array(
danielebarchiesi@0 186 array('data' => t('Hostname'), 'header' => TRUE),
danielebarchiesi@0 187 check_plain($dblog->hostname),
danielebarchiesi@0 188 ),
danielebarchiesi@0 189 array(
danielebarchiesi@0 190 array('data' => t('Operations'), 'header' => TRUE),
danielebarchiesi@0 191 $dblog->link,
danielebarchiesi@0 192 ),
danielebarchiesi@0 193 );
danielebarchiesi@0 194 $build['dblog_table'] = array(
danielebarchiesi@0 195 '#theme' => 'table',
danielebarchiesi@0 196 '#rows' => $rows,
danielebarchiesi@0 197 '#attributes' => array('class' => array('dblog-event')),
danielebarchiesi@0 198 );
danielebarchiesi@0 199 return $build;
danielebarchiesi@0 200 }
danielebarchiesi@0 201 else {
danielebarchiesi@0 202 return '';
danielebarchiesi@0 203 }
danielebarchiesi@0 204 }
danielebarchiesi@0 205
danielebarchiesi@0 206 /**
danielebarchiesi@0 207 * Builds a query for database log administration filters based on session.
danielebarchiesi@0 208 *
danielebarchiesi@0 209 * @return array
danielebarchiesi@0 210 * An associative array with keys 'where' and 'args'.
danielebarchiesi@0 211 */
danielebarchiesi@0 212 function dblog_build_filter_query() {
danielebarchiesi@0 213 if (empty($_SESSION['dblog_overview_filter'])) {
danielebarchiesi@0 214 return;
danielebarchiesi@0 215 }
danielebarchiesi@0 216
danielebarchiesi@0 217 $filters = dblog_filters();
danielebarchiesi@0 218
danielebarchiesi@0 219 // Build query
danielebarchiesi@0 220 $where = $args = array();
danielebarchiesi@0 221 foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) {
danielebarchiesi@0 222 $filter_where = array();
danielebarchiesi@0 223 foreach ($filter as $value) {
danielebarchiesi@0 224 $filter_where[] = $filters[$key]['where'];
danielebarchiesi@0 225 $args[] = $value;
danielebarchiesi@0 226 }
danielebarchiesi@0 227 if (!empty($filter_where)) {
danielebarchiesi@0 228 $where[] = '(' . implode(' OR ', $filter_where) . ')';
danielebarchiesi@0 229 }
danielebarchiesi@0 230 }
danielebarchiesi@0 231 $where = !empty($where) ? implode(' AND ', $where) : '';
danielebarchiesi@0 232
danielebarchiesi@0 233 return array(
danielebarchiesi@0 234 'where' => $where,
danielebarchiesi@0 235 'args' => $args,
danielebarchiesi@0 236 );
danielebarchiesi@0 237 }
danielebarchiesi@0 238
danielebarchiesi@0 239 /**
danielebarchiesi@0 240 * Creates a list of database log administration filters that can be applied.
danielebarchiesi@0 241 *
danielebarchiesi@0 242 * @return array
danielebarchiesi@0 243 * Associative array of filters. The top-level keys are used as the form
danielebarchiesi@0 244 * element names for the filters, and the values are arrays with the following
danielebarchiesi@0 245 * elements:
danielebarchiesi@0 246 * - title: Title of the filter.
danielebarchiesi@0 247 * - where: The filter condition.
danielebarchiesi@0 248 * - options: Array of options for the select list for the filter.
danielebarchiesi@0 249 */
danielebarchiesi@0 250 function dblog_filters() {
danielebarchiesi@0 251 $filters = array();
danielebarchiesi@0 252
danielebarchiesi@0 253 foreach (_dblog_get_message_types() as $type) {
danielebarchiesi@0 254 $types[$type] = t($type);
danielebarchiesi@0 255 }
danielebarchiesi@0 256
danielebarchiesi@0 257 if (!empty($types)) {
danielebarchiesi@0 258 $filters['type'] = array(
danielebarchiesi@0 259 'title' => t('Type'),
danielebarchiesi@0 260 'where' => "w.type = ?",
danielebarchiesi@0 261 'options' => $types,
danielebarchiesi@0 262 );
danielebarchiesi@0 263 }
danielebarchiesi@0 264
danielebarchiesi@0 265 $filters['severity'] = array(
danielebarchiesi@0 266 'title' => t('Severity'),
danielebarchiesi@0 267 'where' => 'w.severity = ?',
danielebarchiesi@0 268 'options' => watchdog_severity_levels(),
danielebarchiesi@0 269 );
danielebarchiesi@0 270
danielebarchiesi@0 271 return $filters;
danielebarchiesi@0 272 }
danielebarchiesi@0 273
danielebarchiesi@0 274 /**
danielebarchiesi@0 275 * Returns HTML for a log message.
danielebarchiesi@0 276 *
danielebarchiesi@0 277 * @param array $variables
danielebarchiesi@0 278 * An associative array containing:
danielebarchiesi@0 279 * - event: An object with at least the message and variables properties.
danielebarchiesi@0 280 * - link: (optional) Format message as link, event->wid is required.
danielebarchiesi@0 281 *
danielebarchiesi@0 282 * @ingroup themeable
danielebarchiesi@0 283 */
danielebarchiesi@0 284 function theme_dblog_message($variables) {
danielebarchiesi@0 285 $output = '';
danielebarchiesi@0 286 $event = $variables['event'];
danielebarchiesi@0 287 // Check for required properties.
danielebarchiesi@0 288 if (isset($event->message) && isset($event->variables)) {
danielebarchiesi@0 289 // Messages without variables or user specified text.
danielebarchiesi@0 290 if ($event->variables === 'N;') {
danielebarchiesi@0 291 $output = $event->message;
danielebarchiesi@0 292 }
danielebarchiesi@0 293 // Message to translate with injected variables.
danielebarchiesi@0 294 else {
danielebarchiesi@0 295 $output = t($event->message, unserialize($event->variables));
danielebarchiesi@0 296 }
danielebarchiesi@0 297 if ($variables['link'] && isset($event->wid)) {
danielebarchiesi@0 298 // Truncate message to 56 chars.
danielebarchiesi@0 299 $output = truncate_utf8(filter_xss($output, array()), 56, TRUE, TRUE);
danielebarchiesi@0 300 $output = l($output, 'admin/reports/event/' . $event->wid, array('html' => TRUE));
danielebarchiesi@0 301 }
danielebarchiesi@0 302 }
danielebarchiesi@0 303 return $output;
danielebarchiesi@0 304 }
danielebarchiesi@0 305
danielebarchiesi@0 306 /**
danielebarchiesi@0 307 * Form constructor for the database logging filter form.
danielebarchiesi@0 308 *
danielebarchiesi@0 309 * @see dblog_filter_form_validate()
danielebarchiesi@0 310 * @see dblog_filter_form_submit()
danielebarchiesi@0 311 * @see dblog_overview()
danielebarchiesi@0 312 *
danielebarchiesi@0 313 * @ingroup forms
danielebarchiesi@0 314 */
danielebarchiesi@0 315 function dblog_filter_form($form) {
danielebarchiesi@0 316 $filters = dblog_filters();
danielebarchiesi@0 317
danielebarchiesi@0 318 $form['filters'] = array(
danielebarchiesi@0 319 '#type' => 'fieldset',
danielebarchiesi@0 320 '#title' => t('Filter log messages'),
danielebarchiesi@0 321 '#collapsible' => TRUE,
danielebarchiesi@0 322 '#collapsed' => empty($_SESSION['dblog_overview_filter']),
danielebarchiesi@0 323 );
danielebarchiesi@0 324 foreach ($filters as $key => $filter) {
danielebarchiesi@0 325 $form['filters']['status'][$key] = array(
danielebarchiesi@0 326 '#title' => $filter['title'],
danielebarchiesi@0 327 '#type' => 'select',
danielebarchiesi@0 328 '#multiple' => TRUE,
danielebarchiesi@0 329 '#size' => 8,
danielebarchiesi@0 330 '#options' => $filter['options'],
danielebarchiesi@0 331 );
danielebarchiesi@0 332 if (!empty($_SESSION['dblog_overview_filter'][$key])) {
danielebarchiesi@0 333 $form['filters']['status'][$key]['#default_value'] = $_SESSION['dblog_overview_filter'][$key];
danielebarchiesi@0 334 }
danielebarchiesi@0 335 }
danielebarchiesi@0 336
danielebarchiesi@0 337 $form['filters']['actions'] = array(
danielebarchiesi@0 338 '#type' => 'actions',
danielebarchiesi@0 339 '#attributes' => array('class' => array('container-inline')),
danielebarchiesi@0 340 );
danielebarchiesi@0 341 $form['filters']['actions']['submit'] = array(
danielebarchiesi@0 342 '#type' => 'submit',
danielebarchiesi@0 343 '#value' => t('Filter'),
danielebarchiesi@0 344 );
danielebarchiesi@0 345 if (!empty($_SESSION['dblog_overview_filter'])) {
danielebarchiesi@0 346 $form['filters']['actions']['reset'] = array(
danielebarchiesi@0 347 '#type' => 'submit',
danielebarchiesi@0 348 '#value' => t('Reset')
danielebarchiesi@0 349 );
danielebarchiesi@0 350 }
danielebarchiesi@0 351 return $form;
danielebarchiesi@0 352 }
danielebarchiesi@0 353
danielebarchiesi@0 354 /**
danielebarchiesi@0 355 * Form validation handler for dblog_filter_form().
danielebarchiesi@0 356 *
danielebarchiesi@0 357 * @see dblog_filter_form_submit()
danielebarchiesi@0 358 */
danielebarchiesi@0 359 function dblog_filter_form_validate($form, &$form_state) {
danielebarchiesi@0 360 if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['type']) && empty($form_state['values']['severity'])) {
danielebarchiesi@0 361 form_set_error('type', t('You must select something to filter by.'));
danielebarchiesi@0 362 }
danielebarchiesi@0 363 }
danielebarchiesi@0 364
danielebarchiesi@0 365 /**
danielebarchiesi@0 366 * Form submission handler for dblog_filter_form().
danielebarchiesi@0 367 *
danielebarchiesi@0 368 * @see dblog_filter_form_validate()
danielebarchiesi@0 369 */
danielebarchiesi@0 370 function dblog_filter_form_submit($form, &$form_state) {
danielebarchiesi@0 371 $op = $form_state['values']['op'];
danielebarchiesi@0 372 $filters = dblog_filters();
danielebarchiesi@0 373 switch ($op) {
danielebarchiesi@0 374 case t('Filter'):
danielebarchiesi@0 375 foreach ($filters as $name => $filter) {
danielebarchiesi@0 376 if (isset($form_state['values'][$name])) {
danielebarchiesi@0 377 $_SESSION['dblog_overview_filter'][$name] = $form_state['values'][$name];
danielebarchiesi@0 378 }
danielebarchiesi@0 379 }
danielebarchiesi@0 380 break;
danielebarchiesi@0 381 case t('Reset'):
danielebarchiesi@0 382 $_SESSION['dblog_overview_filter'] = array();
danielebarchiesi@0 383 break;
danielebarchiesi@0 384 }
danielebarchiesi@0 385 return 'admin/reports/dblog';
danielebarchiesi@0 386 }
danielebarchiesi@0 387
danielebarchiesi@0 388 /**
danielebarchiesi@0 389 * Form constructor for the form that clears out the log.
danielebarchiesi@0 390 *
danielebarchiesi@0 391 * @see dblog_clear_log_submit()
danielebarchiesi@0 392 * @ingroup forms
danielebarchiesi@0 393 */
danielebarchiesi@0 394 function dblog_clear_log_form($form) {
danielebarchiesi@0 395 $form['dblog_clear'] = array(
danielebarchiesi@0 396 '#type' => 'fieldset',
danielebarchiesi@0 397 '#title' => t('Clear log messages'),
danielebarchiesi@0 398 '#description' => t('This will permanently remove the log messages from the database.'),
danielebarchiesi@0 399 '#collapsible' => TRUE,
danielebarchiesi@0 400 '#collapsed' => TRUE,
danielebarchiesi@0 401 );
danielebarchiesi@0 402 $form['dblog_clear']['clear'] = array(
danielebarchiesi@0 403 '#type' => 'submit',
danielebarchiesi@0 404 '#value' => t('Clear log messages'),
danielebarchiesi@0 405 '#submit' => array('dblog_clear_log_submit'),
danielebarchiesi@0 406 );
danielebarchiesi@0 407
danielebarchiesi@0 408 return $form;
danielebarchiesi@0 409 }
danielebarchiesi@0 410
danielebarchiesi@0 411 /**
danielebarchiesi@0 412 * Form submission handler for dblog_clear_log_form().
danielebarchiesi@0 413 */
danielebarchiesi@0 414 function dblog_clear_log_submit() {
danielebarchiesi@0 415 $_SESSION['dblog_overview_filter'] = array();
danielebarchiesi@0 416 db_delete('watchdog')->execute();
danielebarchiesi@0 417 drupal_set_message(t('Database log cleared.'));
danielebarchiesi@0 418 }