Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2006-03-13 20:01:59

hcs
Гость

Мод склейки сообщений - Merge post

Новая версия 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)

#2 2006-03-13 20:26:53

SDTux
Гость

Re: Мод склейки сообщений - Merge post

Очень полезный мод, счас затестю

#3 2006-03-13 20:40:00

SDTux
Гость

Re: Мод склейки сообщений - Merge post

При попытке запостить:

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)

#4 2006-03-13 21:17:07

Demo
Гость

Re: Мод склейки сообщений - Merge post

Не понятно немного что он делает?
я правильно понял что он должен у одного и того же юзверя если он запостил два поста сразу - последний пост просто добавляется к предыдущему как дополнение?

#5 2006-03-13 21:37:32

SDTux
Гость

Re: Мод склейки сообщений - Merge post

Да, именно это. При том задается интервал, в течение которого это действует - т.е. через определенное время пост будет добавлен как отдельный.

#6 2006-03-13 22:45:25

Demo
Гость

Re: Мод склейки сообщений - Merge post

ооо! классно.
поставлю себе обязательно.

#7 2006-03-13 23:32:39

SDTux
Гость

Re: Мод склейки сообщений - Merge post

Ошибка, однозначно здесь:

// 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)

#8 2006-03-14 04:58:57

hcs
Гость

Re: Мод склейки сообщений - Merge post

Ну 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());

#9 2006-03-14 05:02:34

hcs
Гость

Re: Мод склейки сообщений - Merge post

SDTux было бы весьма полезно на время тестирования потсавить $pun_debug=1, чтобы было видно строку, в которой ошибка запроса. Потому что хоть и изменяем один запрос, другие изменения затрагивают еще кучу запросов косвенно!
Щас попробую поставить на чистый punbb

#10 2006-03-14 05:17:45

hcs
Гость

Re: Мод склейки сообщений - Merge post

Тьфу!!! Сорри smile
Как всегда, маленькое досадное недоразумение! Забыл в ридми указать еще одно изменение в запросе. Поскольку там добавляется статистическая функция, то нужно добавлять GROUP BY, а про него я забыл написать! Еще раз извините!
Делать так:
Ищем в строке 46

WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid

Добавляем сразу после этого

.' GROUP BY t.id'

Теперь должно работать 100пудово

#11 2006-03-14 07:48:38

SDTux
Гость

Re: Мод склейки сообщений - Merge post

"Вот теперь тебя люблю я, вот теперь тебя хвалю я" (с)
smile работает

#12 2006-03-14 08:17:55

hcs
Гость

Re: Мод склейки сообщений - Merge post

Если будут проблемы с локалями (к примеру будет писать не Добавлено дата-такаято  а кракозябры ), то нужно попробовать
в lang/ваш язык/common.php

вместо
setlocale(LC_TIME,$locale);
попробовать
setlocale(LC_TIME, 'ru_RU.CP1251');
У меня заработало только при таких изменениях, но это на федоре. На других системах если будут кракозябры  возможно придется подбирать индивидуально, если стандартные знаечения не будут подходить.

#13 2006-03-14 09:01:38

uT)Dev1L
Гость

Re: Мод склейки сообщений - Merge post

hcs: спасибо мужик, но есть пара предложений:
1- Надо чтобы после склейки Post Count(Число сообщений) не увеличивался
2- Не большая модификация к надписи "Добавленно 14.03.2006 12:59:43", сделать ее так "Dev1L добавил это сообщение 14.03.2006 в 12:59:43"
Но важнее всего 1 пункт, заранее благодарен smile

#14 2006-03-14 09:18:29

hcs
Гость

Re: Мод склейки сообщений - Merge post

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)

#15 2006-03-14 11:04:12

Demo
Гость

Re: Мод склейки сообщений - Merge post

классный мод!
всё работает чики-чики.

#16 2006-03-14 11:34:14

Demo
Гость

Re: Мод склейки сообщений - Merge post

Потестил в опросе - тоже работает без проблем.

Нужна ещё одна важная деталь:
когда темы помечаются как прочитанные и в них добавляется новое сообщение как добавление - то тема не светится как непрочитанная. Т.е. пост запостили а никто об этом не знает - тема по прежнему как прочтённая sad

#17 2006-03-14 11:38:36

hcs
Гость

Re: Мод склейки сообщений - Merge post

Ну как думаете, сделать чтобы счетчик постов не увеличивался в финальном варианте?

#18 2006-03-14 12:05:00

SDTux
Гость

Re: Мод склейки сообщений - Merge post

Думаю, что счетчик должен соответствовать реальному числу отдельных постов, т.е. при использовании мерджа, увеличивать счетчик не надо.

#19 2006-03-14 12:56:15

Demo
Гость

Re: Мод склейки сообщений - Merge post

ну конечно счётчик не должен увеличиваться. это же специально против накруток делается.

#20 2006-03-14 13:20:06

hcs
Гость

Re: Мод склейки сообщений - Merge post

Короче позволил себе довести до ума этот мод. Продолжаем менять вместе со мной, если уже поставили этот мод. Потом выложу на панрес полный мод с инсталлом, если щас не будет ошибок.
Значит что добавлено:
В формах ответа теперь стоит галка "склеить если последний пост мой", это на тот случай если посты не нужно склеивать ( поверьте, бывает такая необходимость, из своего опыта), по дефолту галка установлена.
И настройка времени действия склейки в админке (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)

#21 2006-03-14 13:27:07

Demo
Гость

Re: Мод склейки сообщений - Merge post

а никак нельзя сделать чтобы при добавлении добавления темка начинала светиться как непрочитанная?

#22 2006-03-14 13:31:12

hcs
Гость

Re: Мод склейки сообщений - Merge post

Честно говоря этот механизм мне непонятен, так что пока придется с этим смириться. К тому же этим страдает форум вцелом, я так полагаю, а не только мой мод?

#23 2006-03-14 14:29:46

Demo
Гость

Re: Мод склейки сообщений - Merge post

hcs пишет:

этим страдает форум вцелом, я так полагаю, а не только мой мод?

просто нужно как-то сделать чтобы пост становился как новый пост после добавления в него добавленного поста и тогда тема будет светиться как непрочитанная.
я выставил на больший промежуток времени. где-то на 1 час. за это время пост прочтут. а потом этот чел добавляет новый пост (добавленный) а тема не светится...

#24 2006-03-14 15:36:58

hcs
Гость

Re: Мод склейки сообщений - Merge post

А вон чо, понял. Нужно подумать.

#25 2006-03-14 17:52:42

hcs
Гость

Re: Мод склейки сообщений - Merge post

Значит так. В процессе поиска решения проблемы обнаружил в таблице topics ранее не попадавшее мне на глаза поле last_post_id, что в корне перевернуло моё представление о том как можно получить нужные данные. Меня и раньше не устраивал факт, что пришлось ввести дополнительный запрос, а сейчас стало уже очевидно, что я допустил серъёзный промах, да ещё и статистическую функцию задействовал. В принципе это не критично, к тому же даже при таком подходе мод работает, но мне, как добросовестному разработчику wink наличие более изящного и менее ресурсоёмкого решения не даёт покоя. Вобщем всем кто уже этот мод поставил предлагаю сделать дополнительные изменения, тем более что в релизе будет именно так, и апгрейд потом будет затруднителен, только установка по новой.
Поехали:

#
#---------[ 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)

Подвал доски

Под управлением FluxBB. Хостинг Hostens