Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Адаптация моего мода с PunBB 1.2.
Стандартный перенос мне не нравится, т.к. заставляет сначала сделать новую тему из переносимых постов, потом перенести эту тему в нужный раздел, затем слить две темы в одну.
Этим модом я добавляю дополнительную кнопку Перенести в Модерировать тему по нажатию которой сначала нужно выбрать раздел, а затем тему в которую будут перенесены выделенные сообщения.
Мод будет влючен в мою сборку начиная с ревизии 25!
1. Открываем файл moderate.php.
2. Находим
<p class="conr modbuttons"><input type="submit" name="split_posts" value="<?php echo $lang_misc['Split'] ?>"<?php echo $button_status ?> /> <input type="submit" name="delete_posts" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /></p>
и меняем на
<p class="conr modbuttons"><input type="submit" name="move_posts" value="<?php echo $lang_misc['Move'] ?>"<?php echo $button_status ?> /> <input type="submit" name="split_posts" value="<?php echo $lang_misc['Split'] ?>"<?php echo $button_status ?> /> <input type="submit" name="delete_posts" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /></p>
3. Находим
// Delete one or more posts
if (isset($_POST['delete_posts']) || isset($_POST['delete_posts_comply']))
и меняем на
// Перемещение одного и более сообщений в другую тему
if (isset($_POST['move_posts']) || isset($_POST['move_posts_forum']) || isset($_POST['move_posts_topic']))
{
$posts = $_POST['posts'];
if (empty($posts))
message($lang_misc['No posts selected']);
if (isset($_POST['move_posts_forum']) || isset($_POST['move_posts_topic']))
{
confirm_referrer('moderate.php');
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']))
{
$move_to_topic = isset($_POST['move_to_topic']) ? intval($_POST['move_to_topic']) : 0;
if ($move_to_topic < 1 || $move_to_topic == $tid)
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) != s ubstr_count($posts, ',') + 1)
message($lang_common['Bad request']);
// перемещаем
$add_text = '[color=#808080][i] '.$lang_misc['Post from topic'].' "'.$cur_topic['subject'].'"[/i]. '.$pun_user['username'].'[/color]'."\n\n";
$db->query('UPDATE '.$db->prefix.'posts SET topic_id='.$move_to_topic.', message=CONCAT(\''.$db->escape($add_text).'\', message) WHERE topic_id='.$tid.' AND id IN('.$posts.')') or error('Unable to update posts/topic', __FILE__, __LINE__, $db->error());
// обновим темы
$num_posts_deleted = s ubstr_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 = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
define('PUN_ACTIVE_PAGE', 'index');
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";
?>
</select>
</label>
<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 class="buttons"><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 = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
define('PUN_ACTIVE_PAGE', 'index');
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 class="buttons"><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';
// Перемещение одного и более сообщений в другую тему
}
// Delete one or more posts
else if (isset($_POST['delete_posts']) || isset($_POST['delete_posts_comply']))
4. Сохраняем файл moderate.php.
5. В языковые файлы misc.php добавляем новые элементы массива.
Для русского языка:
'Move posts' => 'Переместить сообщения',
'Move posts redirect' => 'Сообщения перемещены. Переадресация …',
'Post from topic' => 'Это сообщение перенесено из темы',
Для английского:
'Move posts' => 'Move posts',
'Move posts redirect' => 'Posts moved. Redirecting …',
'Post from topic' => 'This post is moved from topic',
Поверх этого ставите изменения из 4 поста этой темы.
Редактировался Visman (2010-10-22 17:24:36)
Моя сборка FluxBB 1.5, ForkBB · сообщество
Online
Вопрос. Сейчас если обсуждение на много страниц очень не удобно выбирать нужные сообщения. Нельзя выделить все нужные сообщения и приходится делать это порциями.
Есть ли выход?
Предлагаю сделать возможность выводить тему одним листом и выделять все нужные сообщения прям в ней.
Offline
Сейчас выхода нет.
Для этого надо плагин "Все/All" с ветки 1.2 переносить в ветку 1.4 в раздел модерации.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Online
Обновление плагина до версии 1.1.
Ставить на установленную версию 1.0
1. Открываем файл moderate.php.
2. Находим
$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());
и меняем на
$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);
$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$move_to_topic.' ORDER BY id LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
$first_post = $db->fetch_assoc($result);
$db->query('UPDATE '.$db->prefix.'topics SET posted='.$first_post['posted'].', first_post_id='.$first_post['id'].', poster=\''.$db->escape($first_post['poster']).'\', 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());
3. Сохраняем файл moderate.php.
Исправление учитывает вероятность смены первого поста в теме приемнике при переносе более ранних сообщений из темы источника.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Online
Подскажите, для 1.5 версии нормально встанет?
Offline
@terix, точно не скажу, но кажется ни чего в нем не менял используя в своей сборке.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Online
Затестил на локалхосте мод.
Создал новый топик, в него перенес сообщения из старого, в итоге вышло что в новом топике первыми идут сообщения перенесенные, а после уже первая месага из нового.
На старых версиях не было такого? Или это глюк на 1.5
Как я понимаю, это происходит в следствие того, что дата переносимых постов не меняется.
Редактировался terix (2012-10-21 20:31:29)
Offline
@terix, ни дата, ни порядковый номер переносимых постов не меняется. Из-за этого они встают не в конец топика назначения, а по порядку создания постов в форуме.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Online
Подскажите, пожалуйста, в каком месте вашего мода копать, чтобы задать текущую дату для переносимых постов.
Offline
Перемещение и изменение постов идет тут
// перемещаем
$add_text = '[color=#808080][i] '.$lang_misc['Post from topic'].' "'.$cur_topic['subject'].'"[/i]. '.$pun_user['username'].'[/color]'."\n\n";
$db->query('UPDATE '.$db->prefix.'posts SET topic_id='.$move_to_topic.', message=CONCAT(\''.$db->escape($add_text).'\', message) WHERE topic_id='.$tid.' AND id IN('.$posts.')') or error('Unable to update posts/topic', __FILE__, __LINE__, $db->error());
т.е. в SET кроме изменения полей topic_id и message можно добавить изменение поля posted. Но думаю это ни чего толкового не даст, так как вся сортировка постов в топиках идет по их id, а не по дате.
Думаю для вставки переносимых постов в конец темы нужно пересоздавать эти посты в базе с новыми id.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Online
Ясно, спасибо.
Offline
Страницы 1