Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Наваял МОД для перемещения сообщений из одной темы в другую (принимающая тема должна существовать).
При перемещении сообщений в них ни чего не меняется, только привязка к теме.
Обновления данных по темам и форумам, в которых идет перемещение, происходит автоматически.
Мод затрагивает только файл 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/язык/
Редактировался Visman (2009-02-23 08:04:01)
Перед найденым ставим это
По-моему, пожадничал товарищ Visman и кусок кода в конце откушал
Пожалуйста, сделайте как нужно, мод хороший, но код неполный.
<?php
require PUN_ROOT.'include/footer.php';
}
Это ведь не конец кода?
Редактировался xoxol3 (2008-04-13 11:01:35)
Это ведь не конец кода?
А разве не работает?
Посмотрел по своим записям, насчитал 148 строк в этом куске, тут также 148 строк, все на месте.
xoxol3 пишет:Это ведь не конец кода?
А разве не работает?
Посмотрел по своим записям, насчитал 148 строк в этом куске, тут также 148 строк, все на месте.
Я нифига не понимаю в РНР, но по кр. мере закрывающий тег ?> полюбому нужен.
Так он наверное в файле moderate.php дальше встречается.
Я нифига не понимаю в РНР, но по кр. мере закрывающий тег ?> полюбому нужен.
Дальше идет как раз код PHP, а не HTML, так что ни чего закрывать не надо!
Здрравствуйте. Поставил вышеозначеный мод. Он не переместил, а удалил контролльный пост. Что я сделал не так? Указания темы для переноса не появилось, он просто спросил: -Удалить? И удалил... Если сочтёте возможным пришлю изменённые файлы. Изначально, не счёл это удобным.
XeSuo.
P.S.-разве файл message_delete.php lдолженостаться в неизменённом виде?
X.S.
Редактировался XeSuo (2008-04-14 13:33:42)
А все 10 пунктов были выполнены?
(Если все правильно было сделано, то рядом с кнопкой Удалить в moderate.php должна была появиться кнопка Переместить. Пункт 2 мода)
Спасибо, но вроде да. Через час ещё раз проверю структуру файлов и отпишусь.
С уважением
XeSuo.
Добавлено спустя 39 минут 30 секунд:
Ещё раз просмотрел все три файла, вроде всё так как написано. Перезалил. Р-тат тот-же. "Удалить" и ни какой другой кнопки.
X.S.
А пользуемся ссылкой для модераторов, которая внизу страницы темы находится?
Она еще должна была поменятся с Удалить на Удалить/переместить сообщения.
Добавлено спустя 51 секунду:
И не три файла, пять, если два языка стоит (русский и английский).
Спасибо, недопонял однако. Ссылкой пользуемся, не поменял англ. файлы. Сейчас схожу в магазин, приду сделаю их и доложусь.
Спасибо.
XeSuo.
Переделал файлы из папки анг. и залил. "0".
XeSuo.
21:50 нашёл ошибу своей невнимательности, вылечил, появилась кнопка "переместить" -рядом с "удалить", которая перемещает:
Warning: require(./include/header.php) [function.require]: failed to open stream: No such
file or directory in /home/user/public_html/forum/moderate.php on line 190
Warning: require(./include/header.php) [function.require]: failed to open stream: No such
file or directory in /home/user/public_html/forum/moderate.php on line 190
Fatal error: require() [function.require]: Failed opening required './include/header.php'
(include_path='.:/usr/lib/php:/usr/local/lib/php') in
/home/user/public_html/forum/moderate.php on line 190
строка 189 - $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
строка 190 в moderate.php гласит: - require PUN_ROOT.'include/header.php';
Но header.php у меня лежаит в корне изначально. Я и открыл-то его впервые час назад. Мне его лучше в инклюд кинуть или путь переписать?
Xe Suo.
Бросил header.php в include:
Переместить сообщения
Выберите назначение для переноса
Переместить в Форум Объявления по форумам.
Вернуться назад
Warning: require(./include/footer.php) [function.require]: failed to open stream: ��� ������ ����� ���
�������� in /home/user/public_html/forum/moderate.php on line 236
Warning: require(./include/footer.php) [function.require]: failed to open stream: ��� ������ ����� ���
�������� in /home/user/public_html/forum/moderate.php on line 236
Fatal error: require() [function.require]: Failed opening required './include/footer.php'
(include_path='.:/usr/lib/php:/usr/local/lib/php') in
/home/user/public_html/forum/moderate.php on line 236
line 236: - require PUN_ROOT.'include/footer.php';
бросил footer.php в include, почти заработало, но не появились названия тем, куда переносить.
XeSuo.
Редактировался XeSuo (2008-04-14 22:19:03)
Но header.php у меня лежаит в корне изначально.
Верни назад, а все строчки include/header.php замени на header.php (это у меня в инклуд все лишние файлы перемещены, мой недочет)
include/footer.php
аналогично, меняем на footer.php
После нажатия на Переместить (когда уже в модерировании темы сидишь) должна появиться страница с выбором форума, после выбора форума уже появляется страница с выбором темы из этого форума и уже потом сообщения перемещаются.
Редактировался Visman (2008-04-15 03:09:22)
С добрым утром. Выкинул из инклюда, заменил пути. Окно принимающей темы маааленькое и пустое. Собственно как и вчера. Я не знаю принципов пхп, вставка основного кода в модерате.пхп, осуществлена, как и все подобные части файла: до неё 2 пустые строки и после (?). А может не там, а в ленг?
'Delete posts' - в коммон.пхп(ру) - 154 строка,
$lang_misc - 'Move posts' => 'Переместить сообщения',
'Move posts redirect' => 'Сообщения перемещены. Переадресация...' - 44,45(ру)строки;
енг - 'Delete posts' => 'Delete/move multiple posts', - 149 строка коммон.пхп;
'Move posts' => 'Move posts' ,
'Move posts redirect' => 'Posts moved.Redirecting …', ;44,45 строки.
Спасибо
Xe Suo
P.S.-принимающая тема создана, но список вообще пустой. Какой участок управляет его созданием?
X.S.
Мод не создает новой темы, он только перемещает сообщения из одной темы в другую (принимающая тема должна существовать, должна быть не закрыта и должна отличаться от передающей темы).
За перемещение сообщений отвечает этот чусток кода:
// перемещаем
$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());
Писал его по аналогии с другими апдейтами используемыми в коде форума.
Если поле выбора темы и сообщении о том что все нормально прошло и редиректа, сообщения в новую тему не перешли, то пробуем заменить этот код на этот:
// перемещаем
$db->query('UPDATE '.$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());
Добавлено спустя 1 минуту 49 секунд:
Если про языковые файлы не понятно, то напишу из дома часика через 2-3.
Этот вариант не сработал.
Список названий принимающих тем не открылся.
XeSuo.
да,кстати у меня тоже...форум выбрал куда перемещать...а вот темы не открылись...
А что открывается после выбора форума и нажатии на кн Переместить?
Это (в текстовом формате страничку сделал, картинку лень заливать)
[mono]Переместить сообщения
Выберите назначение для переноса
Переместить в Тема:
Переместить Вернуться назад
[/mono]
Если да, то блок
<div class="blockform">
хтмл-кода страницы из браузера выложите сюда, вот так:
<div class="blockform">
<h2><span>Переместить сообщения</span></h2>
<div class="box">
<form method="post" action="moderate.php?fid=2&tid=8">
<div class="inform">
<fieldset>
<legend>Выберите назначение для переноса</legend>
<div class="infldset">
<label>Переместить в Тема <select name="move_to_topic">
<option value="1">Test post</option>
<option value="10">test</option>
</optgroup>
</select>
</label>
<input type="hidden" name="posts" value="185" />
<input type="hidden" name="move_to_forum" value="1" />
</div>
</fieldset>
</div>
<p><input type="submit" name="move_posts_topic" value="Переместить" /><a href="javascript:history.go(-1)">Вернуться назад</a></p>
</form>
</div>
</div>
Я УСТАНОВИЛ МОД MovePost Mod ... но он действует только в англ. части форума....!
Как сделать чтобы и в русской был?
<div class="blockform">
<h2><span>Переместить сообщения</span></h2>
<div class="box">
<form method="post" action="moderate.php?fid=15&tid=7">
<div class="inform">
<fieldset>
<legend>Выберите назначение для переноса</legend>
<div class="infldset">
<label>Переместить в Тема <select name="move_to_topic">
</optgroup>
</select>
</label>
<input type="hidden" name="posts" value="32" />
<input type="hidden" name="move_to_forum" value="28" />
</div>
</fieldset>
</div>
<p><input type="submit" name="move_posts_topic" value="Переместить" /><a href="javascript:history.go(-1)">Вернуться назад</a></p>
</form>
</div>
</div>
XeSuo.
P.S.- ну не умею я редакторами пользоваться. И в секретарши по возрасту не пройду, однако.
X.S.
XeSuo
Нда, запрос который формирует список тем выдает пустой результат.
Очень странно. Буду смотреть.
SerebroSuper
Возможно надо внести изменения в языковые файлы которые хранятся в папке lang\Russian\.
Добавлено спустя 4 минуты 15 секунд:
XeSuo
Вместо этого запроса в моде
$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());
размести вот это
message('SELECT id, subject FROM '.$db->prefix.'topics WHERE forum_id='.$move_to_forum.' AND id<>'.$tid.' ORDER BY sticky DESC, last_post DESC');
и попробуй переместить какое-либо сообщение.
Сюда напиши, что он выведет на странице с выбором темы для перемещения.
Редактировался Visman (2008-04-15 15:45:06)
Кую...
Редактировался XeSuo (2008-04-15 15:55:15)
Так, причина возможно в этом куске кода:
$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']);
$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
require PUN_ROOT.'include/header.php';
Надо заменить его на
$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
require PUN_ROOT.'include/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']);
т.к. возможно у тебя в header.php есть запрос с переменной $result, а у меня его нет
SELECT id, subject FROM foo_topics WHERE forum_id=28 AND id<>7 ORDER BY sticky DESC, last_post DESC -это на стр. темы для перемещения.
Не увидел, чечас почитаю.
X.S.
P.S.-строка 210: - $result_header = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'reports WHERE zapped IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error());
X.S.
Редактировался XeSuo (2008-04-15 16:17:49)
По предыдущему моему сообщению измени код мода в moderate.php и проверь работу мода.