123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647 |
- <?php
- /**
- * The moderation log is this file's only job.
- * It views it, and that's about all it does.
- *
- * Simple Machines Forum (SMF)
- *
- * @package SMF
- * @author Simple Machines http://www.simplemachines.org
- * @copyright 2013 Simple Machines and individual contributors
- * @license http://www.simplemachines.org/about/smf/license.php BSD
- *
- * @version 2.1 Alpha 1
- */
- if (!defined('SMF'))
- die('No direct access...');
- /**
- * Prepares the information from the moderation log for viewing.
- * Show the moderation log.
- * If clearing the log, leaves a message in the log to indicate it was cleared, by whom and when.
- * Requires the admin_forum permission.
- * Accessed via ?action=moderate;area=modlog.
- *
- * @uses Modlog template, main sub-template.
- */
- function ViewModlog()
- {
- global $txt, $modSettings, $context, $scripturl, $sourcedir, $user_info, $smcFunc;
- // Are we looking at the moderation log or the administration log.
- $context['log_type'] = isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'adminlog' ? 3 : 1;
- if ($context['log_type'] == 3)
- isAllowedTo('admin_forum');
- // These change dependant on whether we are viewing the moderation or admin log.
- if ($context['log_type'] == 3 || $_REQUEST['action'] == 'admin')
- $context['url_start'] = '?action=admin;area=logs;sa=' . ($context['log_type'] == 3 ? 'adminlog' : 'modlog') . ';type=' . $context['log_type'];
- else
- $context['url_start'] = '?action=moderate;area=modlog;type=' . $context['log_type'];
- $context['can_delete'] = allowedTo('admin_forum');
- loadLanguage('Modlog');
- $context['page_title'] = $context['log_type'] == 3 ? $txt['modlog_admin_log'] : $txt['modlog_view'];
- // The number of entries to show per page of log file.
- $context['displaypage'] = 30;
- // Handle deletion...
- if (isset($_POST['removeall']) && $context['can_delete'])
- {
- checkSession();
- validateToken('mod-ml');
- $smcFunc['db_query']('', '
- DELETE FROM {db_prefix}log_actions
- WHERE id_log = {int:moderate_log}',
- array(
- 'moderate_log' => $context['log_type'],
- )
- );
- $log_type = isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'adminlog' ? 'admin' : 'moderate';
- logAction('clearlog_' . $log_type, array(), $log_type);
-
- }
- elseif (!empty($_POST['remove']) && isset($_POST['delete']) && $context['can_delete'])
- {
- checkSession();
- validateToken('mod-ml');
- // No sneaky removing the 'cleared the log' entries.
- $smcFunc['db_query']('', '
- DELETE FROM {db_prefix}log_actions
- WHERE id_log = {int:moderate_log}
- AND id_action IN ({array_string:delete_actions})
- AND action NOT LIKE {string:clearlog}',
- array(
- 'delete_actions' => array_unique($_POST['delete']),
- 'moderate_log' => $context['log_type'],
- 'clearlog' => 'clearlog_%',
- )
- );
- }
- // Do the column stuff!
- $sort_types = array(
- 'action' =>'lm.action',
- 'time' => 'lm.log_time',
- 'member' => 'mem.real_name',
- 'group' => 'mg.group_name',
- 'ip' => 'lm.ip',
- );
- // Setup the direction stuff...
- $context['order'] = isset($_REQUEST['sort']) && isset($sort_types[$_REQUEST['sort']]) ? $_REQUEST['sort'] : 'time';
- // If we're coming from a search, get the variables.
- if (!empty($_REQUEST['params']) && empty($_REQUEST['is_search']))
- {
- $search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
- $search_params = @unserialize($search_params);
- }
- // This array houses all the valid search types.
- $searchTypes = array(
- 'action' => array('sql' => 'lm.action', 'label' => $txt['modlog_action']),
- 'member' => array('sql' => 'mem.real_name', 'label' => $txt['modlog_member']),
- 'group' => array('sql' => 'mg.group_name', 'label' => $txt['modlog_position']),
- 'ip' => array('sql' => 'lm.ip', 'label' => $txt['modlog_ip'])
- );
- if (!isset($search_params['string']) || (!empty($_REQUEST['search']) && $search_params['string'] != $_REQUEST['search']))
- $search_params_string = empty($_REQUEST['search']) ? '' : $_REQUEST['search'];
- else
- $search_params_string = $search_params['string'];
- if (isset($_REQUEST['search_type']) || empty($search_params['type']) || !isset($searchTypes[$search_params['type']]))
- $search_params_type = isset($_REQUEST['search_type']) && isset($searchTypes[$_REQUEST['search_type']]) ? $_REQUEST['search_type'] : (isset($searchTypes[$context['order']]) ? $context['order'] : 'member');
- else
- $search_params_type = $search_params['type'];
- $search_params_column = $searchTypes[$search_params_type]['sql'];
- $search_params = array(
- 'string' => $search_params_string,
- 'type' => $search_params_type,
- );
- // Setup the search context.
- $context['search_params'] = empty($search_params['string']) ? '' : base64_encode(serialize($search_params));
- $context['search'] = array(
- 'string' => $search_params['string'],
- 'type' => $search_params['type'],
- 'label' => $searchTypes[$search_params_type]['label'],
- );
- // If they are searching by action, then we must do some manual intervention to search in their language!
- if ($search_params['type'] == 'action' && !empty($search_params['string']))
- {
- // For the moment they can only search for ONE action!
- foreach ($txt as $key => $text)
- {
- if (substr($key, 0, 10) == 'modlog_ac_' && strpos($text, $search_params['string']) !== false)
- {
- $search_params['string'] = substr($key, 10);
- break;
- }
- }
- }
- require_once($sourcedir . '/Subs-List.php');
- // This is all the information required for a watched user listing.
- $listOptions = array(
- 'id' => 'moderation_log_list',
- 'width' => '100%',
- 'items_per_page' => $context['displaypage'],
- 'no_items_label' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin_log_' : '') . 'no_entries_found'],
- 'base_href' => $scripturl . $context['url_start'] . (!empty($context['search_params']) ? ';params=' . $context['search_params'] : ''),
- 'default_sort_col' => 'time',
- 'get_items' => array(
- 'function' => 'list_getModLogEntries',
- 'params' => array(
- (!empty($search_params['string']) ? ' INSTR({raw:sql_type}, {string:search_string})' : ''),
- array('sql_type' => $search_params_column, 'search_string' => $search_params['string']),
- $context['log_type'],
- ),
- ),
- 'get_count' => array(
- 'function' => 'list_getModLogEntryCount',
- 'params' => array(
- (!empty($search_params['string']) ? ' INSTR({raw:sql_type}, {string:search_string})' : ''),
- array('sql_type' => $search_params_column, 'search_string' => $search_params['string']),
- $context['log_type'],
- ),
- ),
- // This assumes we are viewing by user.
- 'columns' => array(
- 'action' => array(
- 'header' => array(
- 'value' => $txt['modlog_action'],
- 'class' => 'lefttext first_th',
- ),
- 'data' => array(
- 'db' => 'action_text',
- 'class' => 'smalltext',
- ),
- 'sort' => array(
- 'default' => 'lm.action',
- 'reverse' => 'lm.action DESC',
- ),
- ),
- 'time' => array(
- 'header' => array(
- 'value' => $txt['modlog_date'],
- 'class' => 'lefttext',
- ),
- 'data' => array(
- 'db' => 'time',
- 'class' => 'smalltext',
- ),
- 'sort' => array(
- 'default' => 'lm.log_time DESC',
- 'reverse' => 'lm.log_time',
- ),
- ),
- 'moderator' => array(
- 'header' => array(
- 'value' => $txt['modlog_member'],
- 'class' => 'lefttext',
- ),
- 'data' => array(
- 'db' => 'moderator_link',
- 'class' => 'smalltext',
- ),
- 'sort' => array(
- 'default' => 'mem.real_name',
- 'reverse' => 'mem.real_name DESC',
- ),
- ),
- 'position' => array(
- 'header' => array(
- 'value' => $txt['modlog_position'],
- 'class' => 'lefttext',
- ),
- 'data' => array(
- 'db' => 'position',
- 'class' => 'smalltext',
- ),
- 'sort' => array(
- 'default' => 'mg.group_name',
- 'reverse' => 'mg.group_name DESC',
- ),
- ),
- 'ip' => array(
- 'header' => array(
- 'value' => $txt['modlog_ip'],
- 'class' => 'lefttext',
- ),
- 'data' => array(
- 'db' => 'ip',
- 'class' => 'smalltext',
- ),
- 'sort' => array(
- 'default' => 'lm.ip',
- 'reverse' => 'lm.ip DESC',
- ),
- ),
- 'delete' => array(
- 'header' => array(
- 'value' => '<input type="checkbox" name="all" class="input_check" onclick="invertAll(this, this.form);" />',
- 'class' => 'centercol',
- ),
- 'data' => array(
- 'function' => create_function('$entry', '
- return \'<input type="checkbox" class="input_check" name="delete[]" value="\' . $entry[\'id\'] . \'"\' . ($entry[\'editable\'] ? \'\' : \' disabled="disabled"\') . \' />\';
- '),
- 'class' => 'centercol',
- ),
- ),
- ),
- 'form' => array(
- 'href' => $scripturl . $context['url_start'],
- 'include_sort' => true,
- 'include_start' => true,
- 'hidden_fields' => array(
- $context['session_var'] => $context['session_id'],
- 'params' => $context['search_params']
- ),
- 'token' => 'mod-ml',
- ),
- 'additional_rows' => array(
- array(
- 'position' => 'below_table_data',
- 'value' => '
- ' . $txt['modlog_search'] . ' (' . $txt['modlog_by'] . ': ' . $context['search']['label'] . '):
- <input type="text" name="search" size="18" value="' . $smcFunc['htmlspecialchars']($context['search']['string']) . '" class="input_text" />
- <input type="submit" name="is_search" value="' . $txt['modlog_go'] . '" class="button_submit" style="float:none" />
- ' . ($context['can_delete'] ? ' |
- <input type="submit" name="remove" value="' . $txt['modlog_remove'] . '" onclick="return confirm(\'' . $txt['modlog_remove_selected_confirm'] . '\');" class="button_submit" />
- <input type="submit" name="removeall" value="' . $txt['modlog_removeall'] . '" onclick="return confirm(\'' . $txt['modlog_remove_all_confirm'] . '\');" class="button_submit" />' : ''),
- 'class' => 'floatright',
- ),
- ),
- );
- createToken('mod-ml');
- // Create the watched user list.
- createList($listOptions);
- $context['sub_template'] = 'show_list';
- $context['default_list'] = 'moderation_log_list';
- if (isset($context['moderation_menu_name']))
- $context[$context['moderation_menu_name']]['tab_data'] = array(
- 'title' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin' : 'moderation') . '_log'],
- 'help' => $context['log_type'] == 3 ? 'adminlog' : 'modlog',
- 'description' => $txt['modlog_' . ($context['log_type'] == 3 ? 'admin' : 'moderation') . '_log_desc']
- );
- }
- /**
- * Get the number of mod log entries.
- * Callback for createList() in ViewModlog().
- *
- * @param $query_string
- * @param $query_params
- * @param $log_type
- */
- function list_getModLogEntryCount($query_string = '', $query_params = array(), $log_type = 1)
- {
- global $smcFunc, $user_info;
- $modlog_query = allowedTo('admin_forum') || $user_info['mod_cache']['bq'] == '1=1' ? '1=1' : ($user_info['mod_cache']['bq'] == '0=1' ? 'lm.id_board = 0 AND lm.id_topic = 0' : (strtr($user_info['mod_cache']['bq'], array('id_board' => 'b.id_board')) . ' AND ' . strtr($user_info['mod_cache']['bq'], array('id_board' => 't.id_board'))));
- $result = $smcFunc['db_query']('', '
- SELECT COUNT(*)
- FROM {db_prefix}log_actions AS lm
- LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lm.id_member)
- LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
- LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lm.id_board)
- LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lm.id_topic)
- WHERE id_log = {int:log_type}
- AND {raw:modlog_query}'
- . (!empty($query_string) ? '
- AND ' . $query_string : ''),
- array_merge($query_params, array(
- 'reg_group_id' => 0,
- 'log_type' => $log_type,
- 'modlog_query' => $modlog_query,
- ))
- );
- list ($entry_count) = $smcFunc['db_fetch_row']($result);
- $smcFunc['db_free_result']($result);
- return $entry_count;
- }
- /**
- * Gets the moderation log entries that match the specified parameters.
- * Callback for createList() in ViewModlog().
- *
- * @param $start
- * @param $items_per_page
- * @param $sort
- * @param $query_string
- * @param $query_params
- * @param $log_type
- */
- function list_getModLogEntries($start, $items_per_page, $sort, $query_string = '', $query_params = array(), $log_type = 1)
- {
- global $context, $scripturl, $txt, $smcFunc, $user_info;
- $modlog_query = allowedTo('admin_forum') || $user_info['mod_cache']['bq'] == '1=1' ? '1=1' : ($user_info['mod_cache']['bq'] == '0=1' ? 'lm.id_board = 0 AND lm.id_topic = 0' : (strtr($user_info['mod_cache']['bq'], array('id_board' => 'b.id_board')) . ' AND ' . strtr($user_info['mod_cache']['bq'], array('id_board' => 't.id_board'))));
- // Can they see the IP address?
- $seeIP = allowedTo('moderate_forum');
- // Here we have the query getting the log details.
- $result = $smcFunc['db_query']('', '
- SELECT
- lm.id_action, lm.id_member, lm.ip, lm.log_time, lm.action, lm.id_board, lm.id_topic, lm.id_msg, lm.extra,
- mem.real_name, mg.group_name
- FROM {db_prefix}log_actions AS lm
- LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lm.id_member)
- LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
- LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lm.id_board)
- LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lm.id_topic)
- WHERE id_log = {int:log_type}
- AND {raw:modlog_query}'
- . (!empty($query_string) ? '
- AND ' . $query_string : '') . '
- ORDER BY ' . $sort . '
- LIMIT ' . $start . ', ' . $items_per_page,
- array_merge($query_params, array(
- 'reg_group_id' => 0,
- 'log_type' => $log_type,
- 'modlog_query' => $modlog_query,
- ))
- );
- // Arrays for decoding objects into.
- $topics = array();
- $boards = array();
- $members = array();
- $messages = array();
- $entries = array();
- while ($row = $smcFunc['db_fetch_assoc']($result))
- {
- $row['extra'] = @unserialize($row['extra']);
- // Corrupt?
- $row['extra'] = is_array($row['extra']) ? $row['extra'] : array();
- // Add on some of the column stuff info
- if (!empty($row['id_board']))
- {
- if ($row['action'] == 'move')
- $row['extra']['board_to'] = $row['id_board'];
- else
- $row['extra']['board'] = $row['id_board'];
- }
- if (!empty($row['id_topic']))
- $row['extra']['topic'] = $row['id_topic'];
- if (!empty($row['id_msg']))
- $row['extra']['message'] = $row['id_msg'];
- // Is this associated with a topic?
- if (isset($row['extra']['topic']))
- $topics[(int) $row['extra']['topic']][] = $row['id_action'];
- if (isset($row['extra']['new_topic']))
- $topics[(int) $row['extra']['new_topic']][] = $row['id_action'];
- // How about a member?
- if (isset($row['extra']['member']))
- {
- // Guests don't have names!
- if (empty($row['extra']['member']))
- $row['extra']['member'] = $txt['modlog_parameter_guest'];
- else
- {
- // Try to find it...
- $members[(int) $row['extra']['member']][] = $row['id_action'];
- }
- }
- // Associated with a board?
- if (isset($row['extra']['board_to']))
- $boards[(int) $row['extra']['board_to']][] = $row['id_action'];
- if (isset($row['extra']['board_from']))
- $boards[(int) $row['extra']['board_from']][] = $row['id_action'];
- if (isset($row['extra']['board']))
- $boards[(int) $row['extra']['board']][] = $row['id_action'];
- // A message?
- if (isset($row['extra']['message']))
- $messages[(int) $row['extra']['message']][] = $row['id_action'];
- // IP Info?
- if (isset($row['extra']['ip_range']))
- if ($seeIP)
- $row['extra']['ip_range'] = '<a href="' . $scripturl . '?action=trackip;searchip=' . $row['extra']['ip_range'] . '">' . $row['extra']['ip_range'] . '</a>';
- else
- $row['extra']['ip_range'] = $txt['logged'];
- // Email?
- if (isset($row['extra']['email']))
- $row['extra']['email'] = '<a href="mailto:' . $row['extra']['email'] . '">' . $row['extra']['email'] . '</a>';
- // Bans are complex.
- if ($row['action'] == 'ban' || $row['action'] == 'banremove')
- {
- $row['action_text'] = $txt['modlog_ac_ban' . ($row['action'] == 'banremove' ? '_remove' : '')];
- foreach (array('member', 'email', 'ip_range', 'hostname') as $type)
- if (isset($row['extra'][$type]))
- $row['action_text'] .= $txt['modlog_ac_ban_trigger_' . $type];
- }
- // The array to go to the template. Note here that action is set to a "default" value of the action doesn't match anything in the descriptions. Allows easy adding of logging events with basic details.
- $entries[$row['id_action']] = array(
- 'id' => $row['id_action'],
- 'ip' => $seeIP ? $row['ip'] : $txt['logged'],
- 'position' => empty($row['real_name']) && empty($row['group_name']) ? $txt['guest'] : $row['group_name'],
- 'moderator_link' => $row['id_member'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>' : (empty($row['real_name']) ? ($txt['guest'] . (!empty($row['extra']['member_acted']) ? ' (' . $row['extra']['member_acted'] . ')' : '')) : $row['real_name']),
- 'time' => timeformat($row['log_time']),
- 'timestamp' => forum_time(true, $row['log_time']),
- 'editable' => substr($row['action'], 0, 8) !== 'clearlog',
- 'extra' => $row['extra'],
- 'action' => $row['action'],
- 'action_text' => isset($row['action_text']) ? $row['action_text'] : '',
- );
- }
- $smcFunc['db_free_result']($result);
- if (!empty($boards))
- {
- $request = $smcFunc['db_query']('', '
- SELECT id_board, name
- FROM {db_prefix}boards
- WHERE id_board IN ({array_int:board_list})
- LIMIT ' . count(array_keys($boards)),
- array(
- 'board_list' => array_keys($boards),
- )
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- foreach ($boards[$row['id_board']] as $action)
- {
- // Make the board number into a link - dealing with moving too.
- if (isset($entries[$action]['extra']['board_to']) && $entries[$action]['extra']['board_to'] == $row['id_board'])
- $entries[$action]['extra']['board_to'] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
- elseif (isset($entries[$action]['extra']['board_from']) && $entries[$action]['extra']['board_from'] == $row['id_board'])
- $entries[$action]['extra']['board_from'] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
- elseif (isset($entries[$action]['extra']['board']) && $entries[$action]['extra']['board'] == $row['id_board'])
- $entries[$action]['extra']['board'] = '<a href="' . $scripturl . '?board=' . $row['id_board'] . '.0">' . $row['name'] . '</a>';
- }
- }
- $smcFunc['db_free_result']($request);
- }
- if (!empty($topics))
- {
- $request = $smcFunc['db_query']('', '
- SELECT ms.subject, t.id_topic
- FROM {db_prefix}topics AS t
- INNER JOIN {db_prefix}messages AS ms ON (ms.id_msg = t.id_first_msg)
- WHERE t.id_topic IN ({array_int:topic_list})
- LIMIT ' . count(array_keys($topics)),
- array(
- 'topic_list' => array_keys($topics),
- )
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- foreach ($topics[$row['id_topic']] as $action)
- {
- $this_action = &$entries[$action];
- // This isn't used in the current theme.
- $this_action['topic'] = array(
- 'id' => $row['id_topic'],
- 'subject' => $row['subject'],
- 'href' => $scripturl . '?topic=' . $row['id_topic'] . '.0',
- 'link' => '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.0">' . $row['subject'] . '</a>'
- );
- // Make the topic number into a link - dealing with splitting too.
- if (isset($this_action['extra']['topic']) && $this_action['extra']['topic'] == $row['id_topic'])
- $this_action['extra']['topic'] = '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.' . (isset($this_action['extra']['message']) ? 'msg' . $this_action['extra']['message'] . '#msg' . $this_action['extra']['message'] : '0') . '">' . $row['subject'] . '</a>';
- elseif (isset($this_action['extra']['new_topic']) && $this_action['extra']['new_topic'] == $row['id_topic'])
- $this_action['extra']['new_topic'] = '<a href="' . $scripturl . '?topic=' . $row['id_topic'] . '.' . (isset($this_action['extra']['message']) ? 'msg' . $this_action['extra']['message'] . '#msg' . $this_action['extra']['message'] : '0') . '">' . $row['subject'] . '</a>';
- }
- }
- $smcFunc['db_free_result']($request);
- }
- if (!empty($messages))
- {
- $request = $smcFunc['db_query']('', '
- SELECT id_msg, subject
- FROM {db_prefix}messages
- WHERE id_msg IN ({array_int:message_list})
- LIMIT ' . count(array_keys($messages)),
- array(
- 'message_list' => array_keys($messages),
- )
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- foreach ($messages[$row['id_msg']] as $action)
- {
- $this_action = &$entries[$action];
- // This isn't used in the current theme.
- $this_action['message'] = array(
- 'id' => $row['id_msg'],
- 'subject' => $row['subject'],
- 'href' => $scripturl . '?msg=' . $row['id_msg'],
- 'link' => '<a href="' . $scripturl . '?msg=' . $row['id_msg'] . '">' . $row['subject'] . '</a>',
- );
- // Make the message number into a link.
- if (isset($this_action['extra']['message']) && $this_action['extra']['message'] == $row['id_msg'])
- $this_action['extra']['message'] = '<a href="' . $scripturl . '?msg=' . $row['id_msg'] . '">' . $row['subject'] . '</a>';
- }
- }
- $smcFunc['db_free_result']($request);
- }
- if (!empty($members))
- {
- $request = $smcFunc['db_query']('', '
- SELECT real_name, id_member
- FROM {db_prefix}members
- WHERE id_member IN ({array_int:member_list})
- LIMIT ' . count(array_keys($members)),
- array(
- 'member_list' => array_keys($members),
- )
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- foreach ($members[$row['id_member']] as $action)
- {
- // Not used currently.
- $entries[$action]['member'] = array(
- 'id' => $row['id_member'],
- 'name' => $row['real_name'],
- 'href' => $scripturl . '?action=profile;u=' . $row['id_member'],
- 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>'
- );
- // Make the member number into a name.
- $entries[$action]['extra']['member'] = '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>';
- }
- }
- $smcFunc['db_free_result']($request);
- }
- // Do some formatting of the action string.
- $callback = pregReplaceCurry('list_getModLogEntriesCallback', 3);
- foreach ($entries as $k => $entry)
- {
- // Make any message info links so its easier to go find that message.
- if (isset($entry['extra']['message']) && (empty($entry['message']) || empty($entry['message']['id'])))
- $entries[$k]['extra']['message'] = '<a href="' . $scripturl . '?msg=' . $entry['extra']['message'] . '">' . $entry['extra']['message'] . '</a>';
- // Mark up any deleted members, topics and boards.
- foreach (array('board', 'board_from', 'board_to', 'member', 'topic', 'new_topic') as $type)
- if (!empty($entry['extra'][$type]) && is_numeric($entry['extra'][$type]))
- $entries[$k]['extra'][$type] = sprintf($txt['modlog_id'], $entry['extra'][$type]);
- if (empty($entries[$k]['action_text']))
- $entries[$k]['action_text'] = isset($txt['modlog_ac_' . $entry['action']]) ? $txt['modlog_ac_' . $entry['action']] : $entry['action'];
- $entries[$k]['action_text'] = preg_replace_callback('~\{([A-Za-z\d_]+)\}~i', $callback($entries, $k), $entries[$k]['action_text']);
- }
- // Back we go!
- return $entries;
- }
- /**
- * Mog Log Replacment Callback.
- *
- * Our callback that does the actual replacments.
- *
- * Original code from: http://php.net/manual/en/function.preg-replace-callback.php#88013
- * This is needed until SMF only supports PHP 5.3+ and we change to "use"
- *
- * @param string $entries
- * @param string $key
- * @param string $matches
- * @return string the replaced results.
- */
- function list_getModLogEntriesCallback($entries, $key, $matches)
- {
- return isset($entries[$key]['extra'][$matches[1]]) ? $entries[$key]['extra'][$matches[1]] : '';
- }
- ?>
|