151

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Конечно, в таблице "users" появляется колонка "read_topics".

Поделиться

152

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Кусочек из инструкции, мод брал именно с PunBB.ru:

#
#---------[ 11. OPEN ]------------------------------------------------------
#

viewforum.php

...

#
#---------[ 20. FIND  (line  ~ 114 ]---------------------------------------------------
#

$sql = 'SELECT id, poster, subject, posted, last_post, last_post_id, last_poster, num_views, num_replies, closed, sticky, moved_to FROM '.$db->prefix.'topics WHERE forum_id='.$id.' ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];


#
#---------[ 21. REPLACE WITH ]---------------------------------------------------
#

$sql = 'SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, lt.log_time, lf.mark_read FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'log_topics AS lt ON lt.user_id='.$pun_user['id'].' AND lt.topic_id=t.id LEFT JOIN '.$db->prefix.'log_forums AS lf ON lf.forum_id=t.forum_id AND lf.user_id='.$pun_user['id'].'  WHERE '.$db->prefix.'t.forum_id='.$id.' ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];

#
#---------[ 22. FIND  (line  ~ 123 ]---------------------------------------------------
#

$sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.forum_id='.$id.' GROUP BY t.id ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];


#
#---------[ 23. REPLACE WITH ]---------------------------------------------------
#

$sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, lt.log_time, lf.mark_read FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].'  LEFT JOIN '.$db->prefix.'log_topics AS lt ON lt.user_id='.$pun_user['id'].' AND lt.topic_id=t.id   LEFT JOIN '.$db->prefix.'log_forums AS lf ON lf.forum_id=t.forum_id AND lf.user_id='.$pun_user['id'].' WHERE t.forum_id='.$id.' GROUP BY t.id ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];


#

А вот кусочек измененного мной viewforum.php:

// Fetch list of topics to display on this page
if ($pun_user['is_guest'] || $pun_config['o_show_dot'] == '0')
{
    // Without "the dot"

$sql = 'SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, question, lt.log_time, lf.mark_read FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'log_topics AS lt ON lt.user_id='.$pun_user['id'].' AND lt.topic_id=t.id LEFT JOIN '.$db->prefix.'log_forums AS lf ON lf.forum_id=t.forum_id AND lf.user_id='.$pun_user['id'].'  WHERE '.$db->prefix.'t.forum_id='.$id.' ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];}
else
{
    // With "the dot"
    switch ($db_type)
    {
        case 'mysql':
        case 'mysqli':
            $sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, t.attach_first, t.question, lt.log_time, lf.mark_read FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].'  LEFT JOIN '.$db->prefix.'log_topics AS lt ON lt.user_id='.$pun_user['id'].' AND lt.topic_id=t.id   LEFT JOIN '.$db->prefix.'log_forums AS lf ON lf.forum_id=t.forum_id AND lf.user_id='.$pun_user['id'].' WHERE t.forum_id='.$id.' GROUP BY t.id ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];            break;

        case 'sqlite':
            $sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, t.attach_first, t.question FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.id IN(SELECT id FROM '.$db->prefix.'topics WHERE forum_id='.$id.' ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'].') GROUP BY t.id ORDER BY t.sticky DESC, t.last_post DESC';
            break;

        default:
            $sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, t.attach_first, t.question FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.forum_id='.$id.' GROUP BY t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, , t.question, p.poster_id ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];
            break;

    }
}

$result = $db->query($sql) or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());

Конкретно в этом куске заменены 2 запроса, прошерстил их, оставил нужные поля от голосовалки, приаттачивания файлов и т.д. Выявился такой глюк - когда тыкаю по какому-нибудь разделу форума (viewforum.php) вываливается такой месседж:

File: /usr/local/www/vhosts/arsamania.ru/httpdocs/forum/viewforum.php
Line: 157

PunBB reported: Unable to fetch topic list

Database reported: Unknown column 'foo_t.forum_id' in 'where clause' (Errno: 1054)

Проблема точно в приведенном куске файла, т.к. если этот кусок кода оставить в первоначальном виде, то все функционирует нормально, но тогда как я понимаю, сам мод Real Mark Topic as Read не будет работать так, как должен. Честно говоря, не соображу, что за поле t.forum_id, его я не нашел в БД, может просто не знаю где искать? Искал в таблице topics. А что такое where clause вообще не понимаю. С другой стороны, поле t.forum_id было и в первоначальной версии файла, так что дело должно быть не в нем...

На всякий случай - install_mod.php выполнился без ошибок, его таблицы на месте.

PunBB.Ru ☭

Сайт nobody

Поделиться

153

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

приведи строку 157

Сайт hcs

Поделиться

154

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

$result = $db->query($sql) or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());

PunBB.Ru ☭

Сайт nobody

Поделиться

155

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

по-ходу дела надо включить PUN_SHOW_QUERIES и бросить сюда ошибочный запрос, будет проще понять проблему. ок?

Сайт hcs

Поделиться

156 (29.08.2007 07:31 отредактировано nobody)

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Failed query: SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, question, lt.log_time, lf.mark_read FROM foo_topics AS t LEFT JOIN foo_log_topics AS lt ON lt.user_id=1 AND lt.topic_id=t.id LEFT JOIN foo_log_forums AS lf ON lf.forum_id=t.forum_id AND lf.user_id=1 WHERE foo_t.forum_id=5 ORDER BY sticky DESC, last_post DESC LIMIT 0, 30

Добавлено спустя     9 минут   34 секунды:
Вообще, пока такой трабл, тестирую пока с неизмененным кусочком этого кода, и вроде работает, но пока возможно, просто не все глюки проявились...
И еще, когда изменял viewforum.php по инструкции, сначала возник вопрос, какие запросы менять - в инструкции заменяются 2 запроса, в этом куске кода их всего 4, все рядом и все примерно похожи. Я заменил первый и второй (если считать сверху вниз), может в этом ошибка? В инструкции, конечно, стоят номера строк, но у меня они малость не совпадают, все таки уже много модов ставил на свой форум... Может что-то перепутал...

PunBB.Ru ☭

Сайт nobody

Поделиться

157

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

У тебя в самом первом запросе, в этой части:

 WHERE '.$db->prefix.'t.forum_id='.$id.'

лишняя запись

'.$db->prefix.'

Убери это.

Сайт hcs

Поделиться

158

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Огромное спасибо, теперь все работает без ошибок!

PunBB.Ru ☭

Сайт nobody

Поделиться

159

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Заметил сейчас, кстати, что эта ошибочка перекочевала ко мне прямо из readme.txt к моду. Скачивал отсюда уже давно, версия RMT судя по тому же readme.txt - 1.0.0 RC - но лучше проверьте, вдруг не исправлено...

PunBB.Ru ☭

Сайт nobody

Поделиться

160

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Давно исправлено, спасибо.

Сайт hcs

Поделиться

161 (05.11.2007 11:09 отредактировано Andy)

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

А почему мод не затрагивает search.php? Когда жмёшь показать новые сообщения, то прочитав их, обновляешь страницу, но индикаторы не меняются на "прочитана".

Поделиться

162

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Похоже найден источник моей проблемы.

PostScriptum: посмотрите на даты сообщений. big_smile

Поделиться

163

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Всё, теперь и у меня "mark topic as read". 8)

Поделиться

164

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

ошибка, о которой писал nobody много месяцев назад, по-прежнему находится в ридми из архива в первом посте. исправьте пожалуйста.

Поделиться

165

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

hcs
ковырял мод в составе сборки 1.2.15. Есть пара предложений:
1) Убрать поле log_forum из таблицы log_forums, по-прежнему считаю форум всего лишь контейнер. Форум должен быть прочтен когда в нем прочтены все темы. Для прочтения форума можно использовать mark_read
2) Изменить запрос в search.php, чтобы искал не новые с последнего визита, а непрочитанные темы.

Если нужно, могу выложить свои изменения в удобном тебе виде

Сайт Slavik

Поделиться

166

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

1) в log_forums  нет поля log_forum
2) согласен

сделай ветку в свн, посмотрим как это работает

Сайт hcs

Поделиться

167

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

hcs
1) log_time

завтра постараюсь, если вспомню как smile

Сайт Slavik

Поделиться

168

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Slavik
1) я по прежнему считаю мою версию имеющую право на жизнь не менее, чем твоя, поэтому предлагаю реализовать совместное существование, добавив соответсвующий выбор в профиле пользователя.

Сайт hcs

Поделиться

169

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Slavik пишет:

1) Убрать поле log_forum из таблицы log_forums, по-прежнему считаю форум всего лишь контейнер. Форум должен быть прочтен когда в нем прочтены все темы. Для прочтения форума можно использовать mark_read

hcs пишет:

1) я по прежнему считаю мою версию имеющую право на жизнь не менее, чем твоя, поэтому предлагаю реализовать совместное существование, добавив соответсвующий выбор в профиле пользователя.

Реализацию где-то можно взять/скачать?

Сайт Px

Поделиться

170

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Наверное нет. Кстати говоря, по прошествии более года эксплуатации, я прихожу к выводу, что вариант реализованный в ядре 1.3 более подходящий для использования, по нескольким причинам:
1. нет запросов к бд
2. данные хранятся на стороне клиента в куках

Сайт hcs

Поделиться

171

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

а по поведению самому - в 1.3 - больше на твой мод похоже или на стандартный?

Сайт niikto

Поделиться

172

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

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

Сайт hcs

Поделиться

173 (19.01.2009 21:30 отредактировано iDrum)

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Я как бы перенёс прицнип работы показа новых сообщений в темах (показывается справа от топика "new") c 1.3 на ветку 1.2.х. Как уже и сказал уважаемый hcs, работает этот принцип через куки,в них пишется ещё одна печенька вида
t226=1232428787;t312=1232428469;t232=1232428441;t305=1232427982; t280=1232427908; f3=1232427908;
то есть t(id топика || id форума)=timestamp. А потом просто палим эту печеньку и разницу во времени. Врпинципе всё работает как нада, но только у меня пока сомнения: печеньки - они ж не резиновые,и если юзер любопытный они быстро забьюца (там под эту печеньку выделяется 4048 байт(вообще под куки с одно домена можно взять только 4096 байт), остальные печеньки используюца для нужнд форума(айди+хэш пароля и другое) ). Пока я сделал только для отображения новых месаг в темах, для форумов не делал ибо у меня на форуме это не нужно. Нада кому нить сиё? Есть хороший плюс - не дрочим лишний раз бд, всё на печенюшках.

Сайт iDrum

Поделиться

174 (20.01.2009 07:48 отредактировано jeder)

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

Мод от hcs из первого сообщения отлично работает и прост в установке.
Зачем лесопед, да ещё и такой печенютый? smile

Сайт jeder

Поделиться

175

Re: Real Mark Topic as Read -=+ пометка тем как прочтенные +=-

jeder, ну если владелец форума желает лишний раз ерепенить бд так ради бога, я же не заставляю smile

Сайт iDrum

Поделиться