Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Новая версия 1.0.4
Проведена ревизия, никаких багов не обнаружено. Склейка сообщений сделана принудительной, отказаться от склейки могут только админы и модеры, у них есть в форме ответа галочка "склеить с предыдущим", по дефолту галочка включена.
Для работы рекомендуется в Юзергруппах в админ-панели установить для всех групп Post Flood interval меньше 20 секунд, можно даже 0. У нас стоит 10.
Скачать: http://punbb.ru/downloads/Merge_Post_1_0_4.zip
Редактировался hcs (2007-02-05 18:52:00)
Очень полезный мод, счас затестю
При попытке запостить:
An error was encountered
Error: Unable to fetch forum info.
Есть мнение, что ошибка где-то здесь:
#
#---------[ 5. AFTER ADD ]---------------------------------------------
#, MAX(p.id) AS last_post_id
#
#---------[ 6. FIND (line: ~ 46) ]---------------------------------------------------
#forums AS f ON f.id=t.forum_id
#
#---------[ 7. AFTER ADD ]---------------------------------------------------------
#LEFT JOIN '.$db->prefix.'posts as p ON p.topic_id=t.id
Редактировался SDTux (2006-03-13 20:41:52)
Не понятно немного что он делает?
я правильно понял что он должен у одного и того же юзверя если он запостил два поста сразу - последний пост просто добавляется к предыдущему как дополнение?
Да, именно это. При том задается интервал, в течение которого это действует - т.е. через определенное время пост будет добавлен как отдельный.
ооо! классно.
поставлю себе обязательно.
Ошибка, однозначно здесь:
// Fetch some info about the topic and/or the forum
if ($tid)
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.image_upload, t.subject, t.closed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_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 t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
else
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.image_upload 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 (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
LEFT JOIN получается 2 раза, если следовать твоей инструкции:
if ($tid)
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.image_upload, t.subject, t.closed, MAX(p.id) AS last_post_id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'posts as p ON p.topic_id=t.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 t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
else
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, fp.image_upload 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 (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
Редактировался SDTux (2006-03-13 23:34:11)
Ну LEFT JOIN действительно 2 раза, но это же 2 разные таблицы!
У меня запрос выглядит так
$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.subject, t.closed, MAX(p.id) AS last_post_id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'posts as p ON p.topic_id=t.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 t.id='.$tid.' GROUP BY t.id') or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
SDTux было бы весьма полезно на время тестирования потсавить $pun_debug=1, чтобы было видно строку, в которой ошибка запроса. Потому что хоть и изменяем один запрос, другие изменения затрагивают еще кучу запросов косвенно!
Щас попробую поставить на чистый punbb
Тьфу!!! Сорри
Как всегда, маленькое досадное недоразумение! Забыл в ридми указать еще одно изменение в запросе. Поскольку там добавляется статистическая функция, то нужно добавлять GROUP BY, а про него я забыл написать! Еще раз извините!
Делать так:
Ищем в строке 46
WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid
Добавляем сразу после этого
.' GROUP BY t.id'
Теперь должно работать 100пудово
"Вот теперь тебя люблю я, вот теперь тебя хвалю я" (с)
работает
Если будут проблемы с локалями (к примеру будет писать не Добавлено дата-такаято а кракозябры ), то нужно попробовать
в lang/ваш язык/common.php
вместо
setlocale(LC_TIME,$locale);
попробовать
setlocale(LC_TIME, 'ru_RU.CP1251');
У меня заработало только при таких изменениях, но это на федоре. На других системах если будут кракозябры возможно придется подбирать индивидуально, если стандартные знаечения не будут подходить.
hcs: спасибо мужик, но есть пара предложений:
1- Надо чтобы после склейки Post Count(Число сообщений) не увеличивался
2- Не большая модификация к надписи "Добавленно 14.03.2006 12:59:43", сделать ее так "Dev1L добавил это сообщение 14.03.2006 в 12:59:43"
Но важнее всего 1 пункт, заранее благодарен
1. Чтобы счетчик сообщений не увеличивался при склейке, сделать следующее:
файл post.php найти строки ~355
if (!$pun_user['is_guest'])
{
$low_prio = ($db_type == 'mysql') ? 'LOW_PRIORITY ' : '';
$db->query('UPDATE '.$low_prio.$db->prefix.'users SET num_posts=num_posts+1, last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
}
заменить на
if (!$pun_user['is_guest'])
{
$low_prio = ($db_type == 'mysql') ? 'LOW_PRIORITY ' : '';
if ($merged)
$db->query('UPDATE '.$low_prio.$db->prefix.'users SET last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
else
$db->query('UPDATE '.$low_prio.$db->prefix.'users SET num_posts=num_posts+1, last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
}
Редактировался hcs (2006-03-14 09:20:30)
классный мод!
всё работает чики-чики.
Потестил в опросе - тоже работает без проблем.
Нужна ещё одна важная деталь:
когда темы помечаются как прочитанные и в них добавляется новое сообщение как добавление - то тема не светится как непрочитанная. Т.е. пост запостили а никто об этом не знает - тема по прежнему как прочтённая
Ну как думаете, сделать чтобы счетчик постов не увеличивался в финальном варианте?
Думаю, что счетчик должен соответствовать реальному числу отдельных постов, т.е. при использовании мерджа, увеличивать счетчик не надо.
ну конечно счётчик не должен увеличиваться. это же специально против накруток делается.
Короче позволил себе довести до ума этот мод. Продолжаем менять вместе со мной, если уже поставили этот мод. Потом выложу на панрес полный мод с инсталлом, если щас не будет ошибок.
Значит что добавлено:
В формах ответа теперь стоит галка "склеить если последний пост мой", это на тот случай если посты не нужно склеивать ( поверьте, бывает такая необходимость, из своего опыта), по дефолту галка установлена.
И настройка времени действия склейки в админке (admin>options>Time and timeouts).
#
#---------[ 1. OPEN ]-------------------------------------------------------
#
post.php
#
#---------[ 2. FIND (line: ~ 85) ]---------------------------------------------------------
#
if (!$pun_user['is_guest'] && !$fid)
#
#---------[ 3. REPLACE WITH ]---------------------------------------------------------
#
if (!$pun_user['is_guest'] && !$fid && isset($_POST['merge']))
#
#---------[ 4. FIND (line: ~ 150) ]---------------------------------------------------------
#
time()-$last_poster_id['posted']<$merge_timeout
#
#---------[ 3. REPLACE WITH ]---------------------------------------------------------
#
time()-$last_poster_id['posted']<$pun_config['o_merge_timeout']
#
#---------[ 18. FIND (line: ~ 557) ]---------------------------------------------------------
#
$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['hide_smilies']) ? ' checked="checked"' : '').' />'.$lang_post['Hide smilies'];
#
#---------[ 19. AFTER ADD ]---------------------------------------------------------
#
$checkboxes[] = '<label><input type="checkbox" name="merge" value="1" checked="checked" />'.$lang_post['Merge posts'];
#
#---------[ 20. OPEN ]-------------------------------------------------
#
/lang/Your Language/post.php
#
#---------[ 21. FIND (line: ~ 30) ]---------------------------------------------------
#
'Edit post' => 'Edit post',
#
#---------[ 22. AFTER ADD ]-------------------------------------------------
#
'Merge posts' => 'Merge if previous post is yours',
#
#---------[ 26. OPEN ]-------------------------------------------------
#
viewtopic.php
#
#---------[ 27. FIND (line: ~ 28) ]---------------------------------------------------
#
require PUN_ROOT.'include/common.php';
#
#---------[ 28. AFTER ADD ]-------------------------------------------------
#
require PUN_ROOT.'lang/'.$pun_user['language'].'/post.php';
#
#---------[ 29. FIND (line: ~ 416) ]---------------------------------------------------
#
<ul class="bblinks">
<li><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a>: <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
<li><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a>: <?php echo ($pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
<li><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a>: <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
</ul>
#
#---------[ 30. AFTER ADD ]-------------------------------------------------
#
<label><input type="checkbox" name="merge" value="1" checked="checked" /><?php echo $lang_post['Merge posts']; ?><br /></label>
#
#---------[ 31. OPEN ]-------------------------------------------------
#
admin_options.php
#
#---------[ 32. FIND (line: ~ 353) ]---------------------------------------------------
#
<tr>
<th scope="row">Redirect time</th>
<td>
<input type="text" name="form[redirect_delay]" size="3" maxlength="3" value="<?php echo $pun_config['o_redirect_delay'] ?>" />
<span>Number of seconds to wait when redirecting. If set to 0, no redirect page will be displayed (not recommended).</span>
</td>
</tr>
#
#---------[ 33. AFTER ADD ]-------------------------------------------------
#
<tr>
<th scope="row">Merge time</th>
<td>
<input type="text" name="form[merege_timeout]" size="5" maxlength="5" value="<?php echo $pun_config['o_merge_timeout'] ?>" />
<span>Time of merge of the post.</span>
</td>
</tr>
#
#---------[ 34. SAVE/UPLOAD ]-------------------------------------------------
#
Еще нужно добавить поле o_merge_timeout в таблицу config:
INSERT INTO config (conf_name, conf_value) VALUES('o_merge_timeout', 300)
Редактировался hcs (2006-03-14 13:38:47)
а никак нельзя сделать чтобы при добавлении добавления темка начинала светиться как непрочитанная?
Честно говоря этот механизм мне непонятен, так что пока придется с этим смириться. К тому же этим страдает форум вцелом, я так полагаю, а не только мой мод?
этим страдает форум вцелом, я так полагаю, а не только мой мод?
просто нужно как-то сделать чтобы пост становился как новый пост после добавления в него добавленного поста и тогда тема будет светиться как непрочитанная.
я выставил на больший промежуток времени. где-то на 1 час. за это время пост прочтут. а потом этот чел добавляет новый пост (добавленный) а тема не светится...
А вон чо, понял. Нужно подумать.
Значит так. В процессе поиска решения проблемы обнаружил в таблице topics ранее не попадавшее мне на глаза поле last_post_id, что в корне перевернуло моё представление о том как можно получить нужные данные. Меня и раньше не устраивал факт, что пришлось ввести дополнительный запрос, а сейчас стало уже очевидно, что я допустил серъёзный промах, да ещё и статистическую функцию задействовал. В принципе это не критично, к тому же даже при таком подходе мод работает, но мне, как добросовестному разработчику наличие более изящного и менее ресурсоёмкого решения не даёт покоя. Вобщем всем кто уже этот мод поставил предлагаю сделать дополнительные изменения, тем более что в релизе будет именно так, и апгрейд потом будет затруднителен, только установка по новой.
Поехали:
#
#---------[ 1. OPEN ]-------------------------------------------------------
#
post.php
#
#---------[ 2. FIND (line: ~ 46) ]---------------------------------------------------------
#
MAX(p.id) AS last_post_id
#
#---------[ 3. REPLACE WITH ]---------------------------------------------
#
p.id AS post_id, p.poster_id, p.message, p.posted
#
#---------[ 4. FIND (line: ~ 46) ]---------------------------------------------------------
#
LEFT JOIN '.$db->prefix.'posts as p ON p.topic_id=t.id
#
#---------[ 5. REPLACE WITH ]---------------------------------------------
#
LEFT JOIN '.$db->prefix.'posts AS p ON (t.last_post_id=p.id AND p.poster_id='.$pun_user['id'].')
#
#---------[ 6. FIND (line: ~ 46) ]---------------------------------------------------------
#
.' GROUP BY t.id'
#
#---------[ 7. DELETE THIS ]---------------------------------------------------------
#
.' GROUP BY t.id'
#
#---------[ 8. FIND (line: ~ 160) ]---------------------------------------------------------
#
if (!$pun_user['is_guest'] && !$fid && isset($_POST['merge']))
{
$result = $db->query("SELECT id, poster_id, message, posted FROM ".$db->prefix."posts WHERE id=".$cur_posting['last_post_id']) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
$last_poster_id = $db->fetch_assoc($result);
if ($last_poster_id['poster_id'] == $pun_user['id'] && time()-$last_poster_id['posted']<$merge_timeout)
{
$message= pun_linebreaks(pun_trim("[color=#808080][i]".$lang_post['Added']." ".strftime("%c%T")."[/i][/color]")) . "\n" . $message;
$merged=true;
}
}
#
#---------[ 9. REPLACE WITH ]---------------------------------------------
#
if (!$pun_user['is_guest'] && !$fid && isset($_POST['merge']) && $cur_posting['poster_id']!=NULL && $cur_posting['message']!=NULL && time()-$cur_posting['posted']<$merge_timeout)
{
$message= pun_linebreaks(pun_trim("[color=#808080][i]".$lang_post['Added']." ".strftime("%c")." : [/i][/color]")) . "\n" . $message;
$merged=true;
}
#
#---------[ 10. FIND (line: ~ 199) ]---------------------------------------------------------
#
if ($merged)
{
$message = $last_poster_id['message'] . "\n\n" . $message;
$db->query('UPDATE '.$db->prefix.'posts SET message=\''.$db->escape($message).'\' WHERE id='.$last_poster_id['id']) or error('Unable to merge post', __FILE__, __LINE__, $db->error());
$new_pid=$last_poster_id['id'];
}
#
#---------[ 11. REPLACE WITH ]---------------------------------------------
#
if ($merged)
{
$message = $cur_posting['message'] . "\n\n" . $message;
$db->query('UPDATE '.$db->prefix.'posts SET message=\''.$db->escape($message).'\' WHERE id='.$cur_posting['post_id']) or error('Unable to merge post', __FILE__, __LINE__, $db->error());
$new_pid=$cur_posting['post_id'];
}
Инструкция в первом посте обновлена.
Редактировался hcs (2006-03-14 18:07:36)