annotate modules/dblog/dblog.admin.inc @ 1:c1f4ac30525a 6.0

Drupal 6.0
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:28:28 +0100
parents
children 589fb7c02327
rev   line source
webmaster@1 1 <?php
webmaster@1 2 // $Id: dblog.admin.inc,v 1.6 2008/01/08 10:35:41 goba Exp $
webmaster@1 3
webmaster@1 4 /**
webmaster@1 5 * @file
webmaster@1 6 * Administrative page callbacks for the dblog module.
webmaster@1 7 */
webmaster@1 8
webmaster@1 9 /**
webmaster@1 10 * dblog module settings form.
webmaster@1 11 *
webmaster@1 12 * @ingroup forms
webmaster@1 13 * @see system_settings_form()
webmaster@1 14 */
webmaster@1 15 function dblog_admin_settings() {
webmaster@1 16 $form['dblog_row_limit'] = array(
webmaster@1 17 '#type' => 'select',
webmaster@1 18 '#title' => t('Discard log entries above the following row limit'),
webmaster@1 19 '#default_value' => variable_get('dblog_row_limit', 1000),
webmaster@1 20 '#options' => drupal_map_assoc(array(100, 1000, 10000, 100000, 1000000)),
webmaster@1 21 '#description' => t('The maximum number of rows to keep in the database log. Older entries will be automatically discarded. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)', array('@cron' => url('admin/reports/status')))
webmaster@1 22 );
webmaster@1 23
webmaster@1 24 return system_settings_form($form);
webmaster@1 25 }
webmaster@1 26
webmaster@1 27 /**
webmaster@1 28 * Menu callback; displays a listing of log messages.
webmaster@1 29 */
webmaster@1 30 function dblog_overview() {
webmaster@1 31 $filter = dblog_build_filter_query();
webmaster@1 32 $rows = array();
webmaster@1 33 $icons = array(
webmaster@1 34 WATCHDOG_NOTICE => '',
webmaster@1 35 WATCHDOG_WARNING => theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')),
webmaster@1 36 WATCHDOG_ERROR => theme('image', 'misc/watchdog-error.png', t('error'), t('error')),
webmaster@1 37 );
webmaster@1 38 $classes = array(
webmaster@1 39 WATCHDOG_NOTICE => 'dblog-notice',
webmaster@1 40 WATCHDOG_WARNING => 'dblog-warning',
webmaster@1 41 WATCHDOG_ERROR => 'dblog-error',
webmaster@1 42 );
webmaster@1 43
webmaster@1 44 $output = drupal_get_form('dblog_filter_form');
webmaster@1 45
webmaster@1 46 $header = array(
webmaster@1 47 ' ',
webmaster@1 48 array('data' => t('Type'), 'field' => 'w.type'),
webmaster@1 49 array('data' => t('Date'), 'field' => 'w.wid', 'sort' => 'desc'),
webmaster@1 50 t('Message'),
webmaster@1 51 array('data' => t('User'), 'field' => 'u.name'),
webmaster@1 52 array('data' => t('Operations')),
webmaster@1 53 );
webmaster@1 54
webmaster@1 55 $sql = "SELECT w.wid, w.uid, w.severity, w.type, w.timestamp, w.message, w.variables, w.link, u.name FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid";
webmaster@1 56 $tablesort = tablesort_sql($header);
webmaster@1 57 if (!empty($filter['where'])) {
webmaster@1 58 $result = pager_query($sql ." WHERE ". $filter['where'] . $tablesort, 50, 0, NULL, $filter['args']);
webmaster@1 59 }
webmaster@1 60 else {
webmaster@1 61 $result = pager_query($sql . $tablesort, 50);
webmaster@1 62 }
webmaster@1 63
webmaster@1 64 while ($dblog = db_fetch_object($result)) {
webmaster@1 65 $rows[] = array('data' =>
webmaster@1 66 array(
webmaster@1 67 // Cells
webmaster@1 68 $icons[$dblog->severity],
webmaster@1 69 t($dblog->type),
webmaster@1 70 format_date($dblog->timestamp, 'small'),
webmaster@1 71 l(truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE), 'admin/reports/event/'. $dblog->wid, array('html' => TRUE)),
webmaster@1 72 theme('username', $dblog),
webmaster@1 73 $dblog->link,
webmaster@1 74 ),
webmaster@1 75 // Attributes for tr
webmaster@1 76 'class' => "dblog-". preg_replace('/[^a-z]/i', '-', $dblog->type) .' '. $classes[$dblog->severity]
webmaster@1 77 );
webmaster@1 78 }
webmaster@1 79
webmaster@1 80 if (!$rows) {
webmaster@1 81 $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 6));
webmaster@1 82 }
webmaster@1 83
webmaster@1 84 $output .= theme('table', $header, $rows, array('id' => 'admin-dblog'));
webmaster@1 85 $output .= theme('pager', NULL, 50, 0);
webmaster@1 86
webmaster@1 87 return $output;
webmaster@1 88 }
webmaster@1 89
webmaster@1 90 /**
webmaster@1 91 * Menu callback; generic function to display a page of the most frequent
webmaster@1 92 * dblog events of a specified type.
webmaster@1 93 */
webmaster@1 94 function dblog_top($type) {
webmaster@1 95
webmaster@1 96 $header = array(
webmaster@1 97 array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
webmaster@1 98 array('data' => t('Message'), 'field' => 'message')
webmaster@1 99 );
webmaster@1 100
webmaster@1 101 $result = pager_query("SELECT COUNT(wid) AS count, message, variables FROM {watchdog} WHERE type = '%s' GROUP BY message, variables ". tablesort_sql($header), 30, 0, "SELECT COUNT(DISTINCT(message)) FROM {watchdog} WHERE type = '%s'", $type);
webmaster@1 102
webmaster@1 103 $rows = array();
webmaster@1 104 while ($dblog = db_fetch_object($result)) {
webmaster@1 105 $rows[] = array($dblog->count, truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE));
webmaster@1 106 }
webmaster@1 107
webmaster@1 108 if (empty($rows)) {
webmaster@1 109 $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 2));
webmaster@1 110 }
webmaster@1 111
webmaster@1 112 $output = theme('table', $header, $rows);
webmaster@1 113 $output .= theme('pager', NULL, 30, 0);
webmaster@1 114
webmaster@1 115 return $output;
webmaster@1 116 }
webmaster@1 117
webmaster@1 118 /**
webmaster@1 119 * Menu callback; displays details about a log message.
webmaster@1 120 */
webmaster@1 121 function dblog_event($id) {
webmaster@1 122 $severity = watchdog_severity_levels();
webmaster@1 123 $output = '';
webmaster@1 124 $result = db_query('SELECT w.*, u.name, u.uid FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid WHERE w.wid = %d', $id);
webmaster@1 125 if ($dblog = db_fetch_object($result)) {
webmaster@1 126 $rows = array(
webmaster@1 127 array(
webmaster@1 128 array('data' => t('Type'), 'header' => TRUE),
webmaster@1 129 t($dblog->type),
webmaster@1 130 ),
webmaster@1 131 array(
webmaster@1 132 array('data' => t('Date'), 'header' => TRUE),
webmaster@1 133 format_date($dblog->timestamp, 'large'),
webmaster@1 134 ),
webmaster@1 135 array(
webmaster@1 136 array('data' => t('User'), 'header' => TRUE),
webmaster@1 137 theme('username', $dblog),
webmaster@1 138 ),
webmaster@1 139 array(
webmaster@1 140 array('data' => t('Location'), 'header' => TRUE),
webmaster@1 141 l($dblog->location, $dblog->location),
webmaster@1 142 ),
webmaster@1 143 array(
webmaster@1 144 array('data' => t('Referrer'), 'header' => TRUE),
webmaster@1 145 l($dblog->referer, $dblog->referer),
webmaster@1 146 ),
webmaster@1 147 array(
webmaster@1 148 array('data' => t('Message'), 'header' => TRUE),
webmaster@1 149 _dblog_format_message($dblog),
webmaster@1 150 ),
webmaster@1 151 array(
webmaster@1 152 array('data' => t('Severity'), 'header' => TRUE),
webmaster@1 153 $severity[$dblog->severity],
webmaster@1 154 ),
webmaster@1 155 array(
webmaster@1 156 array('data' => t('Hostname'), 'header' => TRUE),
webmaster@1 157 check_plain($dblog->hostname),
webmaster@1 158 ),
webmaster@1 159 array(
webmaster@1 160 array('data' => t('Operations'), 'header' => TRUE),
webmaster@1 161 $dblog->link,
webmaster@1 162 ),
webmaster@1 163 );
webmaster@1 164 $attributes = array('class' => 'dblog-event');
webmaster@1 165 $output = theme('table', array(), $rows, $attributes);
webmaster@1 166 }
webmaster@1 167 return $output;
webmaster@1 168 }
webmaster@1 169
webmaster@1 170 /**
webmaster@1 171 * Build query for dblog administration filters based on session.
webmaster@1 172 */
webmaster@1 173 function dblog_build_filter_query() {
webmaster@1 174 if (empty($_SESSION['dblog_overview_filter'])) {
webmaster@1 175 return;
webmaster@1 176 }
webmaster@1 177
webmaster@1 178 $filters = dblog_filters();
webmaster@1 179
webmaster@1 180 // Build query
webmaster@1 181 $where = $args = array();
webmaster@1 182 foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) {
webmaster@1 183 $filter_where = array();
webmaster@1 184 foreach ($filter as $value) {
webmaster@1 185 $filter_where[] = $filters[$key]['where'];
webmaster@1 186 $args[] = $value;
webmaster@1 187 }
webmaster@1 188 if (!empty($filter_where)) {
webmaster@1 189 $where[] = '('. implode(' OR ', $filter_where) .')';
webmaster@1 190 }
webmaster@1 191 }
webmaster@1 192 $where = !empty($where) ? implode(' AND ', $where) : '';
webmaster@1 193
webmaster@1 194 return array(
webmaster@1 195 'where' => $where,
webmaster@1 196 'args' => $args,
webmaster@1 197 );
webmaster@1 198 }
webmaster@1 199
webmaster@1 200
webmaster@1 201 /**
webmaster@1 202 * List dblog administration filters that can be applied.
webmaster@1 203 */
webmaster@1 204 function dblog_filters() {
webmaster@1 205 $filters = array();
webmaster@1 206
webmaster@1 207 foreach (_dblog_get_message_types() as $type) {
webmaster@1 208 $types[$type] = $type;
webmaster@1 209 }
webmaster@1 210
webmaster@1 211 if (!empty($types)) {
webmaster@1 212 $filters['type'] = array(
webmaster@1 213 'title' => t('Type'),
webmaster@1 214 'where' => "w.type = '%s'",
webmaster@1 215 'options' => $types,
webmaster@1 216 );
webmaster@1 217 }
webmaster@1 218
webmaster@1 219 $filters['severity'] = array(
webmaster@1 220 'title' => t('Severity'),
webmaster@1 221 'where' => 'w.severity = %d',
webmaster@1 222 'options' => watchdog_severity_levels(),
webmaster@1 223 );
webmaster@1 224
webmaster@1 225 return $filters;
webmaster@1 226 }
webmaster@1 227
webmaster@1 228 /**
webmaster@1 229 * Formats a log message for display.
webmaster@1 230 *
webmaster@1 231 * @param $dblog
webmaster@1 232 * An object with at least the message and variables properties
webmaster@1 233 */
webmaster@1 234 function _dblog_format_message($dblog) {
webmaster@1 235 // Legacy messages and user specified text
webmaster@1 236 if ($dblog->variables === 'N;') {
webmaster@1 237 return $dblog->message;
webmaster@1 238 }
webmaster@1 239 // Message to translate with injected variables
webmaster@1 240 else {
webmaster@1 241 return t($dblog->message, unserialize($dblog->variables));
webmaster@1 242 }
webmaster@1 243 }
webmaster@1 244
webmaster@1 245
webmaster@1 246 /**
webmaster@1 247 * Return form for dblog administration filters.
webmaster@1 248 *
webmaster@1 249 * @ingroup forms
webmaster@1 250 * @see dblog_filter_form_submit()
webmaster@1 251 * @see dblog_filter_form_validate()
webmaster@1 252 */
webmaster@1 253 function dblog_filter_form() {
webmaster@1 254 $session = &$_SESSION['dblog_overview_filter'];
webmaster@1 255 $session = is_array($session) ? $session : array();
webmaster@1 256 $filters = dblog_filters();
webmaster@1 257
webmaster@1 258 $form['filters'] = array(
webmaster@1 259 '#type' => 'fieldset',
webmaster@1 260 '#title' => t('Filter log messages'),
webmaster@1 261 '#theme' => 'dblog_filters',
webmaster@1 262 '#collapsible' => TRUE,
webmaster@1 263 '#collapsed' => empty($session),
webmaster@1 264 );
webmaster@1 265 foreach ($filters as $key => $filter) {
webmaster@1 266 $form['filters']['status'][$key] = array(
webmaster@1 267 '#title' => $filter['title'],
webmaster@1 268 '#type' => 'select',
webmaster@1 269 '#multiple' => TRUE,
webmaster@1 270 '#size' => 8,
webmaster@1 271 '#options' => $filter['options'],
webmaster@1 272 );
webmaster@1 273 if (!empty($session[$key])) {
webmaster@1 274 $form['filters']['status'][$key]['#default_value'] = $session[$key];
webmaster@1 275 }
webmaster@1 276 }
webmaster@1 277
webmaster@1 278 $form['filters']['buttons']['submit'] = array(
webmaster@1 279 '#type' => 'submit',
webmaster@1 280 '#value' => t('Filter'),
webmaster@1 281 );
webmaster@1 282 if (!empty($session)) {
webmaster@1 283 $form['filters']['buttons']['reset'] = array(
webmaster@1 284 '#type' => 'submit',
webmaster@1 285 '#value' => t('Reset')
webmaster@1 286 );
webmaster@1 287 }
webmaster@1 288
webmaster@1 289 return $form;
webmaster@1 290 }
webmaster@1 291
webmaster@1 292 /**
webmaster@1 293 * Validate result from dblog administration filter form.
webmaster@1 294 */
webmaster@1 295 function dblog_filter_form_validate($form, &$form_state) {
webmaster@1 296 if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['type']) && empty($form_state['values']['severity'])) {
webmaster@1 297 form_set_error('type', t('You must select something to filter by.'));
webmaster@1 298 }
webmaster@1 299 }
webmaster@1 300
webmaster@1 301 /**
webmaster@1 302 * Process result from dblog administration filter form.
webmaster@1 303 */
webmaster@1 304 function dblog_filter_form_submit($form, &$form_state) {
webmaster@1 305 $op = $form_state['values']['op'];
webmaster@1 306 $filters = dblog_filters();
webmaster@1 307 switch ($op) {
webmaster@1 308 case t('Filter'):
webmaster@1 309 foreach ($filters as $name => $filter) {
webmaster@1 310 if (isset($form_state['values'][$name])) {
webmaster@1 311 $_SESSION['dblog_overview_filter'][$name] = $form_state['values'][$name];
webmaster@1 312 }
webmaster@1 313 }
webmaster@1 314 break;
webmaster@1 315 case t('Reset'):
webmaster@1 316 $_SESSION['dblog_overview_filter'] = array();
webmaster@1 317 break;
webmaster@1 318 }
webmaster@1 319 return 'admin/reports/dblog';
webmaster@1 320 }