Тема: MOD Перемещение сообщений
Наваял МОД для перемещения сообщений из одной темы в другую (принимающая тема должна существовать).
При перемещении сообщений в них ни чего не меняется, только привязка к теме.
Обновления данных по темам и форумам, в которых идет перемещение, происходит автоматически.
Мод затрагивает только файл moderate.php и 2 языковых файла/язык.
v 1.0 (тестировал на PunBB v 1.2.17)
v 1.0.1 - вернул header.php и footer.php на место (у меня они в папке include лежат)
v 1.0.2 - запрос на выборку списка тем переместил за вывод заголовка т.к. переменная $result могла быть изменена в header.php
v 1.1 - добавил возможность создания новой темы при переносе сообщений (если поле новой темы не заполнять, сообщения будут переносится в выбранную из выпадающего списка тему)
-------------------------------------------
1. Открываем файл moderate.php
2. Находим (~272 строка)
<p class="conr"><input type="submit" name="delete_posts" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /></p>Заменяем на
<p class="conr"><input type="submit" name="delete_posts" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /><input type="submit" name="move_posts" value="<?php echo $lang_misc['Move'] ?>"<?php echo $button_status ?> /></p>3. Находим (~90 строка)
// Delete one or more posts
if (isset($_POST['delete_posts']) || isset($_POST['delete_posts_comply']))Перед найденым ставим это
(v 1.1 - заменяем $move_to_topic = isset($_POST['move_to_topic']) ? intval($_POST['move_to_topic']) : 0; на кусок кода для создания новой темы
и добавляем новое поле в форму для ввода новой темы)
// Перемещение одного и более сообщений в другую тему
if (isset($_POST['move_posts']) || isset($_POST['move_posts_forum']) || isset($_POST['move_posts_topic']))
{
confirm_referrer('moderate.php');
$posts = $_POST['posts'];
if (empty($posts))
message($lang_misc['No posts selected']);
if (isset($_POST['move_posts_forum']) || isset($_POST['move_posts_topic']))
{
if (@preg_match('/[^0-9,]/', $posts))
message($lang_common['Bad request']);
$move_to_forum = isset($_POST['move_to_forum']) ? intval($_POST['move_to_forum']) : 0;
if ($move_to_forum < 1)
message($lang_common['Bad request']);
$result = $db->query('SELECT f.id FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE f.id='.$move_to_forum.' AND (fp.read_forum IS NULL OR fp.read_forum=1) AND f.redirect_url IS NULL') or error('Unable to fetch forum', __FILE__, __LINE__, $db->error());
if (!$db->num_rows($result))
message($lang_common['Bad request']);
if (isset($_POST['move_posts_topic']))
{
// версия 1.1
$subject = isset($_POST['req_subject']) ? pun_trim($_POST['req_subject']) : '';
if ($subject == '')
$move_to_topic = isset($_POST['move_to_topic']) ? intval($_POST['move_to_topic']) : 0;
else
{
$result = $db->query('SELECT * FROM '.$db->prefix.'posts WHERE id IN('.$posts.') AND topic_id='.$tid.' ORDER BY id LIMIT 1') or error('Unable to check posts', __FILE__, __LINE__, $db->error());
if (!$db->num_rows($result))
message($lang_common['Bad request']);
$cur_sub = $db->fetch_assoc($result);
$db->query('INSERT INTO '.$db->prefix.'topics (poster, subject, posted, last_post, last_poster, forum_id) VALUES(\''.$db->escape($cur_sub['poster']).'\', \''.$db->escape($subject).'\', '.$cur_sub['posted'].', '.$cur_sub['posted'].', \''.$db->escape($cur_sub['poster']).'\', '.$move_to_forum.')') or error('Unable to create topic', __FILE__, __LINE__, $db->error());
$move_to_topic = $db->insert_id();
}
// старая версия $move_to_topic = isset($_POST['move_to_topic']) ? intval($_POST['move_to_topic']) : 0;
if ($move_to_topic < 1)
message($lang_common['Bad request']);
$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE id='.$move_to_topic.' AND forum_id='.$move_to_forum) or error('Unable to fetch topic', __FILE__, __LINE__, $db->error());
if (!$db->num_rows($result))
message($lang_common['Bad request']);
// Verify that the post IDs are valid
$result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id IN('.$posts.') AND topic_id='.$tid) or error('Unable to check posts', __FILE__, __LINE__, $db->error());
if ($db->num_rows($result) != substr_count($posts, ',') + 1)
message($lang_common['Bad request']);
// перемещаем
$low_prio = ($db_type == 'mysql') ? 'LOW_PRIORITY ' : '';
$db->query('UPDATE '.$low_prio.$db->prefix.'posts SET topic_id='.$move_to_topic.' WHERE topic_id='.$tid.' AND id IN('.$posts.')') or error('Unable to update posts/topic', __FILE__, __LINE__, $db->error());
// обновим темы
$num_posts_deleted = substr_count($posts, ',') + 1;
$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
$last_post = $db->fetch_assoc($result);
$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$last_post['posted'].', last_post_id='.$last_post['id'].', last_poster=\''.$db->escape($last_post['poster']).'\', num_replies=num_replies-'.$num_posts_deleted.' WHERE id='.$tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$move_to_topic.' ORDER BY id DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
$last_post = $db->fetch_assoc($result);
$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$last_post['posted'].', last_post_id='.$last_post['id'].', last_poster=\''.$db->escape($last_post['poster']).'\', num_replies=num_replies+'.$num_posts_deleted.' WHERE id='.$move_to_topic) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
// обновим форумы
update_forum($fid);
if ($fid != $move_to_forum)
update_forum($move_to_forum);
redirect('viewtopic.php?id='.$tid, $lang_misc['Move posts redirect']);
}
$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
require PUN_ROOT.'header.php';
$result = $db->query('SELECT id, subject FROM '.$db->prefix.'topics WHERE forum_id='.$move_to_forum.' AND id<>'.$tid.' ORDER BY sticky DESC, last_post DESC') or error('Unable to fetch forum', __FILE__, __LINE__, $db->error());
if (!$db->num_rows($result))
message($lang_common['Bad request']);
?>
<div class="blockform">
<h2><span><?php echo $lang_misc['Move posts'] ?></span></h2>
<div class="box">
<form method="post" action="moderate.php?fid=<?php echo $fid ?>&tid=<?php echo $tid ?>">
<div class="inform">
<fieldset>
<legend><?php echo $lang_misc['Move legend'] ?></legend>
<div class="infldset">
<label><?php echo $lang_misc['Move to'].' '.$lang_common['Topic'] ?>
<select name="move_to_topic">
<?php
while ($cur_topic = $db->fetch_assoc($result))
echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</option>'."\n";
?>
</optgroup>
</select>
</label>
<br /><br />
<?php echo $lang_misc['New Topic'] ?> <input type="text" name="req_subject" size="70" maxlength="70" value="" />
<input type="hidden" name="posts" value="<?php echo $posts ?>" />
<input type="hidden" name="move_to_forum" value="<?php echo $move_to_forum ?>" />
</div>
</fieldset>
</div>
<p><input type="submit" name="move_posts_topic" value="<?php echo $lang_misc['Move'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
</form>
</div>
</div>
<?php
require PUN_ROOT.'footer.php';
}
$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
require PUN_ROOT.'header.php';
?>
<div class="blockform">
<h2><span><?php echo $lang_misc['Move posts'] ?></span></h2>
<div class="box">
<form method="post" action="moderate.php?fid=<?php echo $fid ?>&tid=<?php echo $tid ?>">
<div class="inform">
<fieldset>
<legend><?php echo $lang_misc['Move legend'] ?></legend>
<div class="infldset">
<label><?php echo $lang_misc['Move to'].' '.$lang_common['Forum'] ?>
<select name="move_to_forum">
<?php
$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.redirect_url IS NULL AND f.num_topics>0 ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
$cur_category = 0;
while ($cur_forum = $db->fetch_assoc($result))
{
if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
{
if ($cur_category)
echo "\t\t\t\t\t\t\t".'</optgroup>'."\n";
echo "\t\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($cur_forum['cat_name']).'">'."\n";
$cur_category = $cur_forum['cid'];
}
echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</option>'."\n";
}
?>
</optgroup>
</select>
</label>
<input type="hidden" name="posts" value="<?php echo implode(',', array_keys($posts)) ?>" />
</div>
</fieldset>
</div>
<p><input type="submit" name="move_posts_forum" value="<?php echo $lang_misc['Move'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
</form>
</div>
</div>
<?php
require PUN_ROOT.'footer.php';
}4. Сохранить файл moderate.php
5. Открыть файлы misc.php из языковых папок /lang/язык/
6. Добавить в массив $lang_misc следующие элементы (правильно устанавливайте запятые
)
(v 1.1 - добавляем 'New Topic')
'Move posts' => 'Переместить сообщения',
'Move posts redirect' => 'Сообщения перемещены. Переадресация...',
'New Topic' => 'Новая тема'7. Сохранить файлы misc.php в языковые папки /lang/язык/
8. Открыть файлы common.php из языковых папок /lang/язык/
9. Изменить текст элемента 'Delete posts' с 'Удалить сообщения' на 'Удалить/переместить сообщения' (соблюдать язык
)
10. Сохранить файлы common.php в языковые папки /lang/язык/