4 голоса
 
2295 просмотров
3.09.2016 / 10:32  aNNiMON

Как сделать счётчик новых вопросов?

Для гостей будет, как и в других модулях, показываться количество новых за последние 3 дня, а вот как быть с зарегистрированными юзерами? Хранить статус прочтения абсолютно каждого вопроса неэффективно. Что подскажете по этому поводу?
Изм. aNNiMON от 4.09.2016 / 21:11
Ответы
 
3 голоса
 
# 3.09.2016 / 15:42  Oak
Единственный возможный технически вариант -- хранить в отдельной джойн таблице отношения вида
  1. already_read_questions:
  2. [user_id, question_id]
Каждый прочитанный вопрос запихивать в эту таблицу.
Для юзеров завести отдельное поле что-то типа 'questions_later_than', которое будет учитываться при подсчёте новых вопросов.
Если, допустим, прошло три дня с последнего обновления поля 'questions_later_than', то обновлять его и удалять из джойн таблицы все записи для этого юзера с вопросами ранее, чем 'questions_later_than'.

Код на SQLFiddle с комментариями демонстрирующий такое решение: http://sqlfiddle.com/#!9/e009f/1/0
Изм. Oak от 3.09.2016 / 15:48
 
1 голос
 
# 3.09.2016 / 14:04  web_demon
Виктор, всю систему можно копипастнуть с админклуба. Там из-за того что модуль очень маленький, работает все очень простенько. А если соберешься делать непрочтенные комментарии, то копипастить лучше уже из репо с новым двигом (модуль комментариев), там это сделано правильно, никаких глючных +1 и кучи лишних данных.
 
1 голос
 
# 3.09.2016 / 10:59  aNNiMON
kalterfive, на форуме как-то сложно, там таблица с прочтениями:
  1. CREATE TABLE IF NOT EXISTS `cms_forum_rdm` (
  2.   `topic_id` int(11) NOT NULL,
  3.   `user_id` int(11) NOT NULL,
  4.   `time` int(11) NOT NULL
  5. );
И в ней удаляются записи, старше 7 дней.
  1. mysql_query('DELETE FROM  `cms_forum_rdm` WHERE  `time` <  "'.($realtime - (7 * 24 * 3600)).'"');
А новые, видимо берутся без учёта записей в этой таблице. Вот запрос, не разбирал пока
  1. $req = mysql_query("SELECT *, `forum`.`user_id` AS `fuser_id`, `forum`.`time` AS `ftime`,`cms_forum_rdm`.`time` AS `rdm_time` FROM `forum` LEFT JOIN `cms_forum_rdm`
  2.        ON `forum`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $user_id . "'
  3.        WHERE `forum`.`type`='t'" . ($rights >= 7 ? "" : " AND `forum`.`close` != '1'") . "
  4.        AND (`cms_forum_rdm`.`topic_id` IS NULL
  5.        OR `forum`.`time` > `cms_forum_rdm`.`time`) AND `forum`.`time` > '" . $from_date . "'
  6.        ORDER BY `forum`.`time` DESC LIMIT " . $start . ',' . $limit);

И, да, как-то неохота при добавлении вопроса добавлять 4000 записей (на каждого юзера ведь)
Изм. aNNiMON от 3.09.2016 / 11:13
 
0 голосов
 
# 6.09.2016 / 18:33  Пользователь удалён
Все очень просто- сделать класс с нужными методами и подключать его при авторизации
 
0 голосов
 
# 6.09.2016 / 14:23  vlavolk
Может быть при добавлении ответов, добавлять вопрос в новые? Неудобно просматривать как есть в данный момент.
 
0 голосов
 
# 4.09.2016 / 18:59  vlavolk
Считаю, что не нужно. Просто выводить их в порядке добавления и заинтересованые пользователи сами найдут нужный ответ или вопрос на который могут дать ответ.
 
0 голосов
 
# 3.09.2016 / 10:42  kalterfx
Возможно, стоит хранить непрочтённые вопросы:
  ⁃ Появляется новый вопрос ­– +1 к непрочтённым;
  ⁃ После прочтения, соответственно, – удалить из списка непрочтённых.

Как это работает на форуме?
Изм. kalterfx от 3.09.2016 / 10:42
Всего: 7

Реклама

Мы в соцсетях

tw tg yt gt