Редирект на новые сообщения

Вопросы без привязки к версии. Установлена авточистка (2 года).

Редирект на новые сообщения

Сообщение CodeWorld 15.02.2007 19:47

Всем привет,

У меня как то посетители жаловались, что после клика по теме с новыми сообщениями переход часто делается на страницу с уже прочтёнными. Я и сам это замечал, бесило ужасно.

Полазил во viewtopic.php и понял, что критерием свежести сообщения является только превосходство его даты над полем юзера lastvisit :) Тем самым совершенно не учитываются переменные в куках (дата последнего просмотра темы и помечалка "все как прочитанные"). Сообщил об этом пхпбб-ивцам, они поставили моему сообщению статус "Will not fix". Хотелось бы понять в чем здесь сложность? Может есть подводные камни? (помимо мелочей, типа посещения форума с разных браузеров - с разными куками)

Вот как я лечился.

Строка 75
Код: Выделить всё
$sql = "SELECT p.post_id
                                        FROM " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s,  " . USERS_TABLE . " u
                                        WHERE s.session_id = '$session_id'
                                                AND u.user_id = s.session_user_id
                                                AND p.topic_id = $topic_id
                                                AND p.post_time >= u.user_lastvisit
                                        ORDER BY p.post_time ASC
                                        LIMIT 1";


Заменил на:

Код: Выделить всё
if (isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f_all']) ) $my_last_visit=$HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f_all'];

                $sql = "SELECT u.user_lastvisit
                    FROM " . SESSIONS_TABLE . " s,  " . USERS_TABLE . " u
                    WHERE s.session_id = '$session_id'
                    AND u.user_id = s.session_user_id
                    LIMIT 1";

            if ( !($result = $db->sql_query($sql)) )
            {
               message_die(GENERAL_ERROR, 'Could not obtain newer/older topic information', '', __LINE__, __FILE__, $sql);
            } else {
                   $row = $db->sql_fetchrow($result);
                   $lastvisit = $row['user_lastvisit'];
                }

                if ($lastvisit>$my_last_visit) $my_last_visit = $lastvisit;

                $tracking_topics = ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_t']) ) ? unserialize($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_t']) : array();
                $tracking_forums = ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f']) ) ? unserialize($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f']) : array();

                if ( !empty($tracking_topics[$topic_id]) && !empty($tracking_forums[$forum_id]) )
                {
                   $topic_last_read = ( $tracking_topics[$topic_id] > $tracking_forums[$forum_id] ) ? $tracking_topics[$topic_id] : $tracking_forums[$forum_id];
                }
                else if ( !empty($tracking_topics[$topic_id]) || !empty($tracking_forums[$forum_id]) )
                {
                   $topic_last_read = ( !empty($tracking_topics[$topic_id]) ) ? $tracking_topics[$topic_id] : $tracking_forums[$forum_id];
                }

                if ($topic_last_read>$my_last_visit) $my_last_visit=$topic_last_read;


            $sql = "SELECT post_id
               FROM " . POSTS_TABLE . "
               WHERE topic_id = $topic_id AND post_time >= ".intval($my_last_visit)."
               ORDER BY post_time ASC
               LIMIT 1";
CodeWorld
phpBB 1.4.4
 
Сообщения: 74
Зарегистрирован: 04.03.2006 16:19


Сообщение CodeWorld 23.02.2007 16:04

UP. Ну так что я правильные сделал изменения или что?
CodeWorld
phpBB 1.4.4
 
Сообщения: 74
Зарегистрирован: 04.03.2006 16:19

Сообщение Conquerror 24.02.2007 16:34

если я правильно понял в чем проблема, то ищи свеженький мод
Last Forum Topic On Index
на форуме тут...
и сверяй/обновляй
Conquerror
phpBB 1.2.1
 
Сообщения: 25
Зарегистрирован: 01.12.2005 0:59

Сообщение CodeWorld 24.03.2007 10:00

Этот мод тут не при чем
CodeWorld
phpBB 1.4.4
 
Сообщения: 74
Зарегистрирован: 04.03.2006 16:19

Сообщение Xpert 24.03.2007 11:15

Код: Выделить всё
                $sql = "SELECT u.user_lastvisit
                    FROM " . SESSIONS_TABLE . " s,  " . USERS_TABLE . " u
                    WHERE s.session_id = '$session_id'
                    AND u.user_id = s.session_user_id
                    LIMIT 1";

Лишнее имхо, воспользуйтесь массивом $userdata
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5716
Зарегистрирован: 13.03.2004 21:27
Откуда: msk.ru

Сообщение CodeWorld 04.05.2007 11:22

Я пробовал, глюки были. Он кажется инициализируется позже чем мне надо его использовать
CodeWorld
phpBB 1.4.4
 
Сообщения: 74
Зарегистрирован: 04.03.2006 16:19

Сообщение VVVas 04.05.2007 20:05

CodeWorld писал(а):Will not fix

Видимо потому что они вкладывают логику "Сообщения с момента последнего посещения" (как есть в переводе), а не "Непрочитанные сообщения" (как хотите вы). А проблемы вероятно нет, просто им хочется так, а вам не так как им.
вы нарушили правила конференции, объяснений не будет - сами читайте правила
я люблю daft punk | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
Люмпен Пролетариат
 
Сообщения: 4739
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

Сообщение CodeWorld 23.05.2007 10:41

Возможно, но тогда я готов оспорить их понятие последнего посещения!! :D
CodeWorld
phpBB 1.4.4
 
Сообщения: 74
Зарегистрирован: 04.03.2006 16:19


Вернуться в phpBB-пространство

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0