public static function watchdog_label($tab, $cat, $rid, $events = array(), $label = null, $details = true) { $ret = array('category' => $cat); if ($rid !== null) { $r = self::get_record($tab, $rid); if ($r === null) { return null; } if (!self::get_access($tab, 'view', $r)) { return null; } if (is_array($label)) { $label = Utils_RecordBrowserCommon::record_link_open_tag_r($tab, $r) . call_user_func($label, $r, true) . Utils_RecordBrowserCommon::record_link_close_tag(); $label = self::create_default_record_tooltip_ajax($label, $tab, $rid); } elseif ($label) { $label = Utils_RecordBrowserCommon::create_linked_label_r($tab, $label, $r); $label = self::create_default_record_tooltip_ajax($label, $tab, $rid); } else { $label = Utils_RecordBrowserCommon::create_default_linked_label($tab, $rid, false, false); } $ret['title'] = $label; $ret['view_href'] = Utils_RecordBrowserCommon::create_record_href($tab, $rid); $events_display = array(); $events = array_reverse($events); $other_events = array(); $header = false; foreach ($events as $v) { if (count($events_display) > 20) { $other_events[__('And more...')] = 1; break; } $param = explode('_', $v); switch ($param[0]) { case 'C': $what = 'Created'; $event_display = array('who' => Base_UserCommon::get_user_label($r['created_by'], true), 'when' => Base_RegionalSettingsCommon::time2reg($r['created_on']), 'what' => _V($what)); break; case 'D': if (!isset($what)) { $what = 'Deleted'; } case 'R': if (!isset($what)) { $what = 'Restored'; } if (!isset($param[1])) { $event_display = array('who' => '', 'when' => '', 'what' => _V($what)); break; } case 'E': $event_display = self::get_edit_details_modify_record($tab, $r['id'], $param[1], $details); if (isset($event_display['what']) && !empty($event_display['what'])) { $header = true; } break; case 'N': $event_display = false; switch ($param[1]) { case '+': $action = __('Note linked'); break; case '-': $action = __('Note unlinked'); break; default: if (!isset($other_events[$param[1]])) { $other_events[$param[1]] = 0; } $other_events[$param[1]]++; $event_display = null; break; } if ($event_display === false) { $date = isset($param[3]) ? Base_RegionalSettingsCommon::time2reg($param[3]) : ''; $who = isset($param[4]) ? Base_UserCommon::get_user_label($param[4], true) : ''; $action .= ' - ' . self::create_default_linked_label('utils_attachment', $param[2]); $event_display = array('what' => $action, 'who' => $who, 'when' => $date); } break; default: $event_display = array('what' => _V($v)); } if ($event_display) { $events_display[] = $event_display; } } foreach ($other_events as $k => $v) { $events_display[] = array('what' => _V($k) . ($v > 1 ? ' [' . $v . ']' : '')); } if ($events_display) { $theme = Base_ThemeCommon::init_smarty(); if ($header) { $theme->assign('header', array(__('Field'), __('Old value'), __('New value'))); } $theme->assign('events', $events_display); $tpl = 'changes_list'; if (Utils_WatchdogCommon::email_mode()) { $record_data = self::get_record_tooltip_data($tab, $rid); $theme->assign('record', $record_data); $tpl = 'changes_list_email'; } ob_start(); Base_ThemeCommon::display_smarty($theme, 'Utils_RecordBrowser', $tpl); $output = ob_get_clean(); $ret['events'] = $output; } else { // if we've generated empty events for certain record, then // it's possible that some of the fields, that have changed, // are hidden so we have to check if there are any other events // If all events are the same and output is empty we can safely // mark all as notified. $all_events = Utils_WatchdogCommon::check_if_notified($tab, $rid); if (count($all_events) == count($events)) { Utils_WatchdogCommon::notified($tab, $rid); } $ret = null; } } return $ret; }
public function applet($conf, &$opts) { $categories = array(); $methods = DB::GetAssoc('SELECT id,callback FROM utils_watchdog_category'); foreach ($methods as $k => $v) { $methods[$k] = explode('::', $v); if (isset($conf['category_' . $k]) && $conf['category_' . $k] && is_numeric($k)) { $categories[] = $k; } } if (empty($categories)) { print __('No category selected'); return; } $records_limit = isset($conf['records_limit']) ? $conf['records_limit'] : 15; if ($records_limit == '__all__') { $records_limit = null; } $header = array(array('name' => __('Cat.'), 'width' => 5), array('name' => __('Title'), 'width' => 15)); if (count($categories) == 1) { $title = call_user_func($methods[$categories[0]]); $opts['title'] = __('Watchdog - %s', array($title['category'])); $header = array(array('name' => __('Title'))); } elseif (count($categories) == count($methods)) { $opts['title'] = __('Watchdog - All'); } else { $opts['title'] = __('Watchdog - Selection'); } $only_new = ' AND last_seen_event<(SELECT MAX(id) FROM utils_watchdog_event AS uwe WHERE uwe.internal_id=uws.internal_id AND uwe.category_id=uws.category_id)'; $records = DB::GetAll('SELECT internal_id,category_id FROM utils_watchdog_subscription AS uws WHERE user_id=%d ' . $only_new . 'AND category_id IN (' . implode(',', $categories) . ')', array(Acl::get_user())); $gb = $this->init_module(Utils_GenericBrowser::module_name(), 'subscriptions', 'subscriptions'); $gb->set_table_columns($header); $something_to_purge = false; $count = 0; foreach ($records as $rec_key => $w) { $k = $w['internal_id']; $v = $w['category_id']; $changes = Utils_WatchdogCommon::check_if_notified($v, $k); if (!is_array($changes)) { $changes = array(); } $data = call_user_func($methods[$v], $k, $changes); if ($data == null) { // mark events as seen when user can't see them Utils_WatchdogCommon::notified($v, $k); unset($records[$rec_key]); continue; } $gb_row = $gb->get_new_row(); if (count($categories) == 1) { $gb_row->add_data($data['title']); } else { $gb_row->add_data($data['category'], $data['title']); } $gb_row->add_action(Utils_WatchdogCommon::get_confirm_change_subscr_href($v, $k), 'Stop Watching', __('Click to stop watching this record for changes'), Base_ThemeCommon::get_template_file(Utils_Watchdog::module_name(), 'watching_small_new_events.png')); $gb_row->add_action($data['view_href'], 'View'); if ($only_new || Utils_WatchdogCommon::check_if_notified($v, $k) !== true) { $gb_row->set_attrs('name="watchdog_table_row_' . $v . '__' . $k . '"'); load_js('modules/Utils/Watchdog/applet_mark_as_read.js'); $gb_row->add_action('href="javascript:void(0);" onclick="watchdog_applet_mark_as_read(\'' . $v . '__' . $k . '\')"', 'Mark as Read', __('Mark as read'), Base_ThemeCommon::get_template_file(Utils_Watchdog::module_name(), 'mark_as_read.png')); $something_to_purge = true; } if (isset($data['events']) && $data['events']) { $gb_row->add_info($data['events'], true); } $count++; if ($records_limit && $count >= $records_limit) { break; } } $records_qty = count($records); if ($records_limit && $count < $records_qty) { print __('Displaying %s of %s records', array($count, $records_qty)); } $this->set_module_variable('display_at_time', time()); if ($something_to_purge) { $opts['actions'][] = '<a ' . Utils_TooltipCommon::open_tag_attrs(__('Mark all entries as read')) . ' ' . $this->create_confirm_callback_href(__('This will mark all entries in selected categories as read, are you sure you want to continue?'), array($this, 'purge_subscriptions_applet'), array($categories)) . '><img src="' . Base_ThemeCommon::get_template_file('Utils_Watchdog', 'purge.png') . '" border="0"></a>'; } $this->display_module($gb); }
public static function notification() { /*$methods = DB::GetAssoc('SELECT id,callback FROM utils_watchdog_category'); foreach ($methods as $k=>$v) { $methods[$k] = explode('::',$v); } $time_sql = $time ? ' AND uwe.event_time > %T' : ''; $only_new = " AND last_seen_event<(SELECT MAX(id) FROM utils_watchdog_event AS uwe WHERE uwe.internal_id=uws.internal_id AND uwe.category_id=uws.category_id$time_sql)"; $args = array(Acl::get_user()); if ($time) { $args[] = $time; } $records = DB::GetAll('SELECT internal_id,category_id,last_seen_event FROM utils_watchdog_subscription AS uws WHERE user_id=%d '.$only_new, $args); $ret = array(); $tray = array(); if ($records) { $last_event_id = DB::GetOne('SELECT MAX(id) FROM utils_watchdog_event'); foreach ($records as $v) { $changes = Utils_WatchdogCommon::check_if_notified($v['category_id'], $v['internal_id']); if (!is_array($changes)) $changes = array(); $data = call_user_func($methods[$v['category_id']], $v['internal_id'], $changes, false); if ($data==null) continue; $msg = __("You've got unread notifications"); $ret['watchdog_'. $last_event_id] = '<b>'.__('Watchdog - %s', array($msg)).'</b> '; $tray['watchdog_' . $last_event_id] = array('title'=>__('Watchdog'), 'body'=>$msg); break; } }*/ $ret = array(); $tray = array(); $methods = DB::GetAssoc('SELECT id,callback FROM utils_watchdog_category'); $only_new = ' AND last_seen_event<(SELECT MAX(id) FROM utils_watchdog_event AS uwe WHERE uwe.internal_id=uws.internal_id AND uwe.category_id=uws.category_id)'; $records = DB::GetAll('SELECT internal_id,category_id FROM utils_watchdog_subscription AS uws WHERE user_id=%d ' . $only_new, array(Acl::get_user())); foreach ($records as $rec_key => $w) { $k = $w['internal_id']; $v = $w['category_id']; $changes = Utils_WatchdogCommon::check_if_notified($v, $k); if (!is_array($changes)) { $changes = array(); } $data = call_user_func($methods[$v], $k, $changes); if ($data == null) { // mark events as seen when user can't see them Utils_WatchdogCommon::notified($v, $k); unset($records[$rec_key]); continue; } $ret['watchdog_' . $v . '_' . $k] = '<b>' . __('Watchdog - %s: %s', array($data['category'], $data['title'])) . '</b>' . (isset($data['events']) ? '<br />' . $data['events'] : ''); $tray['watchdog_' . $v . '_' . $k] = array('title' => __('Watchdog - %s', array($data['category'])), 'body' => $data['title']); } return array('notifications' => $ret, 'tray' => $tray); }
public static function tray_notification() { $methods = DB::GetAssoc('SELECT id,callback FROM utils_watchdog_category'); foreach ($methods as $k=>$v) { $methods[$k] = explode('::',$v); } $only_new = ' AND last_seen_event<(SELECT MAX(id) FROM utils_watchdog_event AS uwe WHERE uwe.internal_id=uws.internal_id AND uwe.category_id=uws.category_id)'; $records = DB::GetAll('SELECT internal_id,category_id,last_seen_event FROM utils_watchdog_subscription AS uws WHERE user_id=%d '.$only_new, array(Acl::get_user())); $ret = array(); $tray = array(); foreach ($records as $v) { $changes = Utils_WatchdogCommon::check_if_notified($v['category_id'], $v['internal_id']); if (!is_array($changes)) $changes = array(); $data = call_user_func($methods[$v['category_id']], $v['internal_id'], $changes, false); if ($data==null) continue; $ret['watchdog_'.$v['internal_id'].'_'.$v['category_id'].'_'.$v['last_seen_event']] = '<b>'.__('Watchdog - %s', array($data['category'])).':</b> '.$data['title']; $tray['watchdog_'.$v['internal_id'].'_'.$v['category_id'].'_'.$v['last_seen_event']] = array('title'=>__('Watchdog - %s', array($data['category'])), 'body'=>$data['title']); if (isset($data['events']) && $data['events']) { $ret['watchdog_'.$v['internal_id'].'_'.$v['category_id'].'_'.$v['last_seen_event']] .= '<br><font size=-5 color=gray>'.$data['events'].'</font>'; } } return array('notifications'=>$ret, 'tray'=>$tray); }