Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Сегодня ходил по этому форуму. Не прочитав всех сообщений одного форума перешел в другой. А статус форума - погас.
И что бы просмотреть, остались ли там еще непрочитанные сообщения, нужно снова зайти в форум.
Мне кажется, статус должен гореть, пока в форуме есть непрочитанные сообщения. И если пользователь не хочет читать какие то непрочитанные сообщения, просто нажмет ссылку "Отметить все сообщения прочитанными" и статус потухнет. И я уже писал, что было бы удобно, если этот статус будет ссылкой. Нажал на нее и форум или топик становятся прочитанными.
Я всё понимаю, но уж как сделано, так и есть. Кроме того я придерживаюсь другой точки зрения относительно пометки форума.
Если кроме пожеланий и мнений мне покажут хотябы примерный алгоритм решения, то я обязательно попробую его реализовать применительно к моду. Об этом я уже говорил не раз и вот хотябы даже здесь - http://punbb.ru/viewtopic.php?pid=5178#p5178
Сегодня спрошу, у человека, который это делал и напишу его алгоритм.
Еще один баг по работе этого мода. Если пользоваться ссылкой "Показать новые сообщения, с момента Вашего последнего визита", то прочитанные форумы не отмечаются прочитанными, те горит что форум не прочитан, заходишь, а там все прочитано.
И вопрос в догонку - когда будет окончательная версия этого мода?
Редактировался mnk (2006-11-24 11:10:51)
Ну когда все баги вроде перечисленных выше пофиксим.
Сорри за задержку, у провайдера упал биллинг, доступ к интернету восстановился только сегодня
Предисловие - поскольку я не являюсь программистом, просьба не пинать сильно за предложенные идеи
В процессе обдумывания организовал 3 алгоритма, один из которых кажется оптимальным, два других за компанию (может я ошибаюсь).
Для оценки количества операций выделено 4 ситуации, в которых происходит доступ к БД:
1) Вход на главную страницу форума
2) Вход в тему
3) Создание темы
4) Добавление поста
Алгоритм 1 - перебор разделов.
Описание: при заходе на главную страницу, в каждом разделе перебираем темы на предмет наличия отметки о непрочтении, если натыкаемся на непрочитанную тему, то ставим на разделе знак непрочтения, в противном случае считаем раздел прочитанным. Для уменьшения количества операций проверяем не все темы в разделе, а темы в интервале времени от сегодняшнего дня до <сегодня>-<срок пометки тем прочитанными>.
Количество операций в выбранных ситуациях:
1) n < x < n*m, где n - количество разделов на форуме, m - количество перебираемых тем в разделах на форуме
2) 0
3) 0
4) 0
Алгоритм 2 - простой счётчик.
Описание: при заходе на главную страницу смотрим специальную переменную, в которой указано, прочитан ли данный раздел, или нет. 0 - прочитан, 1 - нет. При заходе в тему, кроме пометки прочитанной самой темы, производится перебор тем в разделе, если непрочитанных тем больше нет, то устанавливаем переменную в 0, в противном случае не изменяем её значение. Интервал перебора <сегодня>-<срок пометки тем прочитанными>. При добавлении темы в раздел или поста в существующую тему, устанавливаем у всех пользователей форума, кроме автора, значение переменной в 1.
Количество операций в выбранных ситуациях:
1) n, где n - количество разделов на форуме
2) 0 < x < k, где k - количество тем в разделе в интервале от сегодняшнего дня до <сегодня>-<срок пометки тем прочитанными>
3) r-1, где r - количество пользователей на форуме
4) r-1, где r - количество пользователей на форуме
Алгоритм 3 - инкрементный счётчик.
Описание: при заходе на главную страницу смотрим специальную переменную, в которой указано, прочитан ли данный раздел, или нет. Значение переменной = количеству непрочитанных тем в разделе, переменная = 0 - раздел прочитан, >0 - нет. При заходе в тему уменьшаем значение переменной текущего раздела на 1 для данного пользователя. При добавлении темы в раздел или поста в существующую тему, увеличиваем значение счётчика для всех пользователей форума, кроме автора, на 1.
Количество операций в выбранных ситуациях:
1) n, где n - количество разделов на форуме
2) 1
3) r-1, где r - количество пользователей на форуме
4) r-1, где r - количество пользователей на форуме
Попробуем оценить в цифрах количество операций на примере данного форума с настройками пометки (15 дней) по-умолчанию.
Алгоритм 1.
1) 15 < x < 81
2) 0
3) 0
4) 0
Алгоритм 2.
1) 15
2) 0 < x < 28 (28 - максимальное количество тем в одном из разделов)
3) 750 (ужас )
4) 750 (ужас )
Алгоритм 3.
1) 15
2) 1
3) 750 (ужас )
4) 750 (ужас )
Если можно считать информацию о помеченных темах в разделе за 1 заход (чтение строки или столбца?), и получить сумму элементов, то количество обращений к БД оказывается совсем мизерным, хотя и немного возрастёт загрузка процессора
Я тоже не программист, но представив всю картину решил высказать своё мнение.
Методом "простого счётчика", только делать проверку не всех тем, а с момента последнего визита, по времени.
Может ещё добавить "вход на форум"? Зачем нам обновлять весь форум, если человеку нужен только один. То же и с топиком, обновлять только топик при нахождении в нём.
Да и вообще, у нас проблемы ведь как раз не с с пометкой, а наоборот, с погасанием уже прочитанных тем. Поэтому тут выход только один - помечать топик прочитанным сразу же, как только посылается запрос на его открытие.
Методом "простого счётчика", только делать проверку не всех тем, а с момента последнего визита, по времени.
Ничем не лучше того варианта, что есть сейчас....
Да и вообще, у нас проблемы ведь как раз не с с пометкой, а наоборот, с погасанием уже прочитанных тем.
Я не наблюдаю такую проблему!
Я не наблюдаю такую проблему!
+1
Эээ... можно посмотреть как это в других форумах сделано... Например, глупый форум smf, имеющий в составе всего один файл: index.php :-D Или у старших братьев: ipb, phpbb...
И еще: по-моему не стоит ограничивать юзера т.н. сроком пометки тем прочитанными, надо оставить возможность отключить эту фичу
И еще: по-моему не стоит ограничивать юзера т.н. сроком пометки тем прочитанными, надо оставить возможность отключить эту фичу
Если сделать так, то таблица log_topics распухнет от бесполезных данных ( в существующей реализации)
И еще: по-моему не стоит ограничивать юзера т.н. сроком пометки тем прочитанными, надо оставить возможность отключить эту фичу
А смысл? Всё равно после срока пометки, тема автоматом станет прочитанной, т.е. проверять после этого срока - выполнять бессмысленную работу....
Эээ... можно посмотреть как это в других форумах сделано... Например, глупый форум smf, имеющий в составе всего один файл: index.php :-D Или у старших братьев: ipb, phpbb...
Я собирался попросить друга посмотреть на phpbb, но инета не было, завтра он появится на работе, я его попрошу....
Если сделать так, то таблица log_topics распухнет от бесполезных данных ( в существующей реализации)
По-другому будет криво, например, если чувак пошел отливать, а его пробило так, что он 16 дней отливал и не успеет чувак меганьюсы прочитать :-D
А смысл? Всё равно после срока пометки, тема автоматом станет прочитанной, т.е. проверять после этого срока - выполнять бессмысленную работу....
Смысл как раз в том, чтобы тема автоматом не становилась прочитанной
Редактировался Slavik (2006-11-26 18:40:46)
Slavik
у тебя есть идея как это сделать не перегрузив мускул?
По-другому будет криво, например, если чувак пошел отливать, а его пробило так, что он 16 дней отливал и не успеет чувак меганьюсы прочитать :-D
Если чувак отвалился на 16 дней, то ему уже будет как-то пофиг пометка
Алгоритм 1 - перебор разделов.
Описание: при заходе на главную страницу, в каждом разделе перебираем темы на предмет наличия отметки о непрочтении, если...
Мммм. Никакой путаницы в терминах нет? Какие отметки должны ставиться, о "прочтении" или о "непрочтении"?
Метку о "прочтении" поставить легко - зашел в тему и появилась метка в log_topics содержащая конректного юзера и конкретную тему.
Как ставить метку о "непрочтении"? Кто-то написал что-то в тему и всем юзерам в log_topics пишется метка что эта тема для них стала непрочтенной?
Или считаем непрочтенной тему, которой нет в log_topics?
Slavik
у тебя есть идея как это сделать не перегрузив мускул?
О да! Надо поставить Oracle
А еще в $db->prefix.polls в полях есть такие данные: a:2:{i:1;i:1;i:3;i:1;}. Я не знаю что это значит, но можно как-нибудь записывать сюда id прочитавшего. Еще можно если у юзера нет непрочитанных тем, то записать дату этого события и потом проверять сначала последний пост с этой датой, а если он позже, тогда ту волшебную структуру. Да и в любом случае посты оставленные после посещения будут означать непрочтение темы
Мммм. Никакой путаницы в терминах нет? Какие отметки должны ставиться, о "прочтении" или о "непрочтении"?
Метку о "прочтении" поставить легко - зашел в тему и появилась метка в log_topics содержащая конректного юзера и конкретную тему.
Как ставить метку о "непрочтении"? Кто-то написал что-то в тему и всем юзерам в log_topics пишется метка что эта тема для них стала непрочтенной?
Или считаем непрочтенной тему, которой нет в log_topics?
Ок, давай разберёмся. Я перечитал тему, но не увидел полного описания алгоритма пометки сейчас (хотя может для программиста кода плагина достаточно ).
Я так понимаю, у каждой темы добавился дополнительный атрибут log_topics, если он присутствует для данного пользователя, то тема считается непрочитанной, так?
Я не наблюдаю такую проблему!
Тоесть? У меня вот после прочтения (открыл, прочитал, закрыл) маркер так и не потухает. Это разве работает?
Тоесть? У меня вот после прочтения (открыл, прочитал, закрыл) маркер так и не потухает. Это разве работает?
Это обозначает, что мы столкнулись с багом, на моём форуме, несмотря на то, что у большинства форумчан (в том числе и у меня), пометка работает нормально, нашлось несколько человек, у которых пометка не работала. Потому нужна дополнительная информация...
Я так понимаю, у каждой темы добавился дополнительный атрибут log_topics, если он присутствует для данного пользователя, то тема считается непрочитанной, так?
Конечно же нет. Как у темы может появиться атрибут для каждого пользователя, количество которых варьируется? Никак. Впрочем конечно можно взять вариант Slavikа и в таблице posts завести поле, в котором хранить массив ид юзеров и потом хитро им оперировать, выкидывая неактульных, вписывая актуальных, но я этим извращением заниматься не буду.
Как работает мой алгоритм:
Есть таблица log_topics, туда записывается user_id, topic_id, time
Во viewtopic.php, т.е. после посещения темы, таблица обрастает новой записью, из которой понятно какойо юзер, какую тему посмотрел и во сколько. Либо если ранее этот юзер уже посещал эту тему и в таблице есть запись об этом - обновляется время посещения.
В index.php удаляются все записи из log_topics для опрделенного юзера, время которых меньше времени актуальности ( у каждого пользователя свое время, по дефолту 15 дней)
Этот механизм позволяет поддерживать таблицу менее засраной избавляя таблицу от неактуальных данных.
Еще есть таблица log_forums , внее пишется user_id, forum_id, time, еще там есть поле mark_read
которое отвечает за пометку форумов кнопкой "отметить прочтенной".
Аналогично с viewtopic.php, во viewforum.php происходит отметка форума о прочтении, т.е. в форум достаточно заглянуть и привет.
Решение о паказе метки "новая тема" принимается на основе всех этих данных + информация о времени последнего посещения и времени последнего сообщения в теме.
Добавлено Mon Nov 27 09:34:47 2006 :
hcs пишет:Я не наблюдаю такую проблему!
Тоесть? У меня вот после прочтения (открыл, прочитал, закрыл) маркер так и не потухает. Это разве работает?
Опиши свои действия подробнее, начиная от того как ты открыл тему, с какого места, с главной страницы, с форума, с поиска последних непрочитанных, или вообще с внешней ссылки. Потом, что именно горит непрочтенным, тема или форум?
Во всяком случае у нас возникает только одна дилема. Как снять отметку о прочтении форума. С топиками сейчас все нормально работает.
Пометка форума и топика, как нового работает и в базовом варианте, и в этом вопросе вопросов нет.
Как отметить топик прочтеным - вроде тоже проблем нет. Зашел, значит прочитал.
А вот с форумами совсем не однозначно.
Тут вариант hcs, по моему мнению не совсем удачный.
1. Человек не обязан читать форум по порядку, и в таком случае остаются непрочитанные топики, а форум отмечен, как прочитанный.
2. Если человек пользуется ссылкой "Пометить все форумы как прочитанные" возникает та жа проблема.
2. Если человек пользуется ссылкой "Пометить все форумы как прочитанные" возникает та жа проблема.
А тут какая проблема? Если нажимается эта ссылка - все становится прочтенным.
Извиняюсь перепутал ссылка "Показать новые сообщения, с момента Вашего последнего визита"
А нельзя при выводе главной страницы, проверять на прочитанность всех сообщений в форуме и в зависимости от этого ставить флаг на данный форум - прочитано или нет? И так по всем форумам.
Редактировался mnk (2006-11-27 12:40:37)
Теоретически можно. Я уже писал об этом - потратил много времени, результата не достиг. Желающие изменить этот механизм - милости просим.
Извиняюсь перепутал ссылка "Показать новые сообщения, с момента Вашего последнего визита"
Это не ошибка мода, потомучто это еще просто не реализовано.