Файл: apwa/stk/tools/support/orphaned_posts.php
Строк: 111
<?php
/**
*
* @package Support Toolkit - Orphaned posts/topics
* @version $Id$
* @copyright (c) 2009 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
class orphaned_posts
{
function display_options()
{
global $db, $template, $user, $phpbb_root_path, $phpEx;
//
// Empty topics
//
$sql = 'SELECT t.topic_id
FROM ' . TOPICS_TABLE . ' t
LEFT JOIN ' . POSTS_TABLE . ' p ON (p.topic_id = t.topic_id)
WHERE t.topic_moved_id = 0
GROUP BY t.topic_id
HAVING COUNT(p.post_id) = 0';
$result = $db->sql_query($sql);
$topic_ids = array();
while ($row = $db->sql_fetchrow($result))
{
$topic_ids[] = (int) $row['topic_id'];
}
$db->sql_freeresult($result);
if (sizeof($topic_ids))
{
// Fetch information related to the topics
$sql = 'SELECT t.topic_id, t.topic_title, t.topic_poster, t.forum_id, f.forum_name, u.user_id, u.username, u.user_colour
FROM ' . TOPICS_TABLE . ' t
JOIN ' . USERS_TABLE . ' u ON (u.user_id = topic_poster)
JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id)
WHERE ' . $db->sql_in_set('t.topic_id', $topic_ids);
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('topics', array(
'FORUM_ID' => $row['forum_id'],
'FORUM_NAME' => $row['forum_name'],
'U_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'TOPIC_ID' => $row['topic_id'],
'TOPIC_TITLE' => $row['topic_title'],
'USER_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
'USER_ID' => $row['user_id'],
));
}
$db->sql_freeresult($result);
}
//
// Orphaned posts
//
$sql = 'SELECT post_id, post_time, post_username, post_subject, post_text, bbcode_uid, bbcode_bitfield, p.forum_id, f.forum_name, u.user_id, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p
JOIN ' . USERS_TABLE . ' u ON (u.user_id = p.poster_id)
JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = p.forum_id)
WHERE NOT EXISTS (SELECT topic_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = p.topic_id)';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$message = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], OPTION_FLAG_BBCODE | OPTION_FLAG_SMILIES);
$search_keywords = urlencode((strpos($row['post_subject'], 'Re: ') === 0) ? utf8_substr($row['post_subject'], 4) : $row['post_subject']);
$template->assign_block_vars('posts', array(
'FORUM_ID' => $row['forum_id'],
'FORUM_NAME' => $row['forum_name'],
'U_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'POST_ID' => $row['post_id'],
'POST_SUBJECT' => $row['post_subject'],
'POST_TEXT' => $message,
'SEARCH_URL' => append_sid("{$phpbb_root_path}search.$phpEx", 'keywords=' . $search_keywords . '&terms=all&sf=titleonly&sr=topics&submit=Search', true),
'USER_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
'USER_ID' => $row['user_id'],
));
}
$db->sql_freeresult($result);
//
// Orphaned shadow topics
//
$sql = 'SELECT t.topic_id, t.topic_moved_id, t.topic_title, t.topic_poster, t.forum_id, f.forum_name, u.user_id, u.username, u.user_colour
FROM ' . TOPICS_TABLE . ' t
JOIN ' . USERS_TABLE . ' u ON (u.user_id = t.topic_poster)
JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id)
WHERE topic_moved_id <> 0
AND NOT EXISTS (SELECT topic_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = t.topic_moved_id)';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('shadows', array(
'FORUM_ID' => $row['forum_id'],
'FORUM_NAME' => $row['forum_name'],
'U_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'TOPIC_ID' => $row['topic_id'],
'TOPIC_TITLE' => $row['topic_title'],
'USER_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
'USER_ID' => $row['user_id'],
));
}
$db->sql_freeresult($result);
$template->assign_vars(array(
'U_EMPTY_TOPICS' => append_sid(STK_INDEX, array('c' => 'support', 't' => 'orphaned_posts', 'mode' => 'empty_topics')),
'U_ORPHANED_POSTS' => append_sid(STK_INDEX, array('c' => 'support', 't' => 'orphaned_posts', 'mode' => 'orphaned_posts', 'submit' => 1)),
'U_ORPHANED_SHADOWS'=> append_sid(STK_INDEX, array('c' => 'support', 't' => 'orphaned_posts', 'mode' => 'orphaned_shadows')),
));
$template->set_filenames(array(
'body' => 'tools/orphaned_posts.html',
));
page_header($user->lang['ORPHANED_POSTS'], false);
page_footer();
}
/**
* Perform the right actions
* @param Array $error An array that will be filled with error messages that might occure
* @return void
*/
function run_tool(&$error)
{
global $db, $user;
$user->add_lang('ucp');
if (!check_form_key('orphaned_posts'))
{
$error[] = 'FORM_INVALID';
return;
}
$mode = request_var('mode', '');
switch ($mode)
{
case 'empty_topics':
case 'orphaned_shadows':
$topic_ids = request_var('topics', array(0 => 0));
if (!sizeof($topic_ids))
{
trigger_error('NO_TOPICS_SELECTED');
}
if (!function_exists('delete_topics'))
{
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
}
$return = delete_topics('topic_id', $topic_ids);
trigger_error(sprintf($user->lang['TOPICS_DELETED'], $return['topics']));
break;
case 'orphaned_posts':
if (isset($_POST['reassign']))
{
$post_map = request_var('posts', array(0 => 0));
foreach ($post_map as $post_id => $topic_id)
{
if ($topic_id == 0)
{
unset($post_map[$post_id]);
}
}
if (!sizeof($post_map))
{
trigger_error('NO_TOPIC_IDS');
}
// Make sure the specified topic IDs exist
$sql = 'SELECT topic_id FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
$result = $db->sql_query($sql);
$existing_topics = array();
while ($row = $db->sql_fetchrow($result))
{
$existing_topics[] = (int) $row['topic_id'];
}
$missing_topics = array_diff($topic_ids, $existing_topics);
if (sizeof($missing_topics))
{
trigger_error(sprintf($user->lang['NONEXISTENT_TOPIC_IDS'], implode(', ', $missing_topics)));
}
// Update the topics with their new IDs
foreach ($post_map as $post_id => $topic_id)
{
$sql = 'UPDATE ' . POSTS_TABLE . ' SET topic_id = ' . (int) $topic_id . ' WHERE post_id = ' . (int) $post_id;
$db->sql_query($sql);
}
trigger_error(sprintf($user->lang['POSTS_REASSIGNED'], sizeof($post_map)));
}
else if (isset($_POST['delete']))
{
$post_ids = request_var('posts_del', array(0 => 0));
if (!sizeof($post_ids))
{
trigger_error('NO_POSTS_SELECTED');
}
if (!function_exists('delete_posts'))
{
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
}
$return = delete_posts('post_id', $post_ids);
trigger_error(sprintf($user->lang['POSTS_DELETED'], $return));
}
else
{
trigger_error('NO_MODE');
}
break;
default:
trigger_error('NO_MODE');
break;
}
}
}