[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Форум (выделение тем с новыми сообщениями)
DeeKeiD
Как сделать выделение тем с новыми сообщениями для пользователя?



Спустя 12 минут, 33 секунды (6.11.2011 - 01:06) caballero написал(а):
проверь какие новые и выдели


Спустя 3 минуты, 33 секунды (6.11.2011 - 01:09) DeeKeiD написал(а):
А Как узнать какие темы новые для определенного пользователя?

Спустя 1 минута, 32 секунды (6.11.2011 - 01:11) caballero написал(а):
узнать где? тут что телепаты сидят?

Спустя 8 минут, 27 секунд (6.11.2011 - 01:19) DeeKeiD написал(а):
Мне нужна сама логика с примером как это делается,а не телепаты...

Спустя 12 минут, 46 секунд (6.11.2011 - 01:32) neadekvat написал(а):
Загляни к себе в кукисы (этого форума). Он добавляет в них информацию о том, какую тему ты просмотрел и в какой момент времени.
Если в одной из этих тем появляется новое сообщение, то оно отображается как новое.

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

Спустя 18 минут, 26 секунд (6.11.2011 - 01:50) DeeKeiD написал(а):
А где хранить темы которые пользователь уже смотрел но в них нет новых сообщений?

Спустя 3 минуты, 9 секунд (6.11.2011 - 01:54) neadekvat написал(а):
Цитата (DeeKeiD @ 6.11.2011 - 02:50)
А где хранить темы которые пользователь уже смотрел но в них нет новых сообщений?

Еще раз. Новая сессия - кукис topic_reads очищается. Пользователь открывает тему - в кукис записывается id темы и время, когда это произошло.
Посмотри свои кукисы этого форума.

Спустя 4 минуты, 9 секунд (6.11.2011 - 01:58) Nikitian написал(а):
В отдельной табличке 3 поля: пользователь, идентификатор темы, идентификатор последнего сообщения. При выборке объединяете таблички по идентификатору темы право-левым джойном и смотрите: если идентификаторы последнего сообщения разные (лучше его тоже в табличке с темами хранить), то в этой теме произошли какие-то изменения, если одинаковые, то изменений не было.
В куки пихать всё подряд не стоит - всё, что в куках лежит, постоянно гоняется при каждом запросе к серверу. Нетолько при запросе страницы, но и для каждого ресурса - лишние накладные расходы. Как вариант, если надо много хранить на клиенте, то есть это

Спустя 5 минут, 10 секунд (6.11.2011 - 02:03) caballero написал(а):
Цитата
объединяете таблички по идентификатору темы право-левым джойном

исключительно понятная фраза для новичка в программировании


не очень понимаю зачем тут кукисы
юзер пнул тему - запись в табличку - номер темы, время

дальше простые выборки
есть посты в теме с временем больше последного просмотра - значит новые

Спустя 2 минуты, 44 секунды (6.11.2011 - 02:06) neadekvat написал(а):
Цитата (caballero @ 6.11.2011 - 03:03)
не очень понимаю зачем тут кукисы
юзер пнул тему - запись в табличку - номер темы, время

А нахрена?
Зачем весь этот хлам в бд?
IPB и PHPBB точно через кукисы делают.

Спустя 7 минут, 45 секунд (6.11.2011 - 02:13) caballero написал(а):
Цитата
Зачем весь этот хлам в бд?

хлам в кеше браузера ничем не лучше
а базу тоже можно подчищать

Цитата
IPB и PHPBB точно через кукисы делают.

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

вряд ли монстрообразные форумы в которых черт ногу сломит - удачный пример для подражания

Спустя 6 минут, 10 секунд (6.11.2011 - 02:20) DeeKeiD написал(а):
А что если сделать так:

юзеру добавить поле topics и в него заносить ID всех созданных тем, и тем в которых есть новые ответы, и уже исходя из этого всего выделять тему?

только как это всё реализовать я понятия не имею sad.gif

Спустя 4 минуты, 53 секунды (6.11.2011 - 02:24) Nikitian написал(а):
Это получится денормализация какая-то, да и вообще, неправильно массив хранить в поле.

Спустя 2 минуты, 57 секунд (6.11.2011 - 02:27) caballero написал(а):
Цитата
юзеру добавить поле topics


зачем ему это поле?

отдельная табличка:
id темы
id юзера
время последного посещения

таблицы топиков и постов с временем уже должны быть (кстати а что у тебя вообще есть?)

при выборке постов проверяешь по данному юзеру время с вышеуказанной таблицы - все что старше - новое

Спустя 2 минуты, 39 секунд (6.11.2011 - 02:30) DeeKeiD написал(а):
есть:
forum_categories - категории форума
forum_forums - форумы категории
forum_topics - темы
forum_topic_replies - ответы

Цитата
отдельная табличка:
id темы
id юзера
время последного посещения

т.е эта таблица обновляется только после того как пользователь зайдёт в тему?
тогда другой вопрос, если он 1 раз зашел в тему (она отметилась как прочтенная), после было написанно ещё 2-3 сообщения, и при проверке покажет что новых сообщений нет(не будет выделения) или как?

Спустя 4 минуты, 27 секунд (6.11.2011 - 02:34) caballero написал(а):
вот и хорошо

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

юзер у тебя в сессии время time() топик из ссылки которуб пинает юзер когда в нее входит

у тебя есть время последнего посещения бзером темы
дальше простая математика




Спустя 3 минуты, 51 секунда (6.11.2011 - 02:38) caballero написал(а):
Цитата
тогда другой вопрос, если он 1 раз зашел в тему (она отметилась как прочтенная), после было написанно ещё 2-3 сообщения, и при проверке покажет что новых сообщений нет(не будет выделения) или как?

ты говоришь о свеом коде как о некоем неподконтрольном существе
никто ничего не покажет и не выделит
это ты делаешь

у тебя есть данные
ты определяешь нужные - для данной логики - список новых постов

при формировании страницы заглядываешь в этот список и выделяешь - цветом размером воздушными шариками и т.д.


Спустя 3 минуты, 50 секунд (6.11.2011 - 02:42) DeeKeiD написал(а):
Тоесть надо сравнить время последнего ответа в теме (или время создания темы) с временем когда пользователь заходил в тему?

Цитата

тогда другой вопрос, если он 1 раз зашел в тему (она отметилась как прочтенная), после было написанно ещё 2-3 сообщения, и при проверке покажет что новых сообщений нет(не будет выделения) или как?

Почему-то мне в голову пришла такая проверка, отсюда и возник такой вопрос :)
$check_query = mysql_query("SELECT * FROM `forum_topic_view_time` WHERE `user_id` = $userID");
if(mysql_num_rows($check_query) > 0)
{
$topic_icon = '<b>New</b>';
}
else
{
$topic_icon = 'old';
}

Спустя 6 минут, 56 секунд (6.11.2011 - 02:49) caballero написал(а):
Цитата
Тоесть надо сравнить время последнего ответа в теме (или время создания темы) с временем когда пользователь заходил в тему?


по сути надо выбрать в переменную время последнего посещения темы
потом когда циклом вывдишь топики сравниваешь их время и получаешь какой он новый или нет

начни делать страницу тогда и поймешь что где надо написать


Цитата
Почему-то мне в голову пришла такая проверка, отсюда и возник такой вопрос


Не надо перепрыгивать с общих рассуждений к отфонарному (и бесмысленному) куску кода






Спустя 6 минут, 52 секунды (6.11.2011 - 02:56) DeeKeiD написал(а):
Вот, как-то так получилось...
Свернутый текст
		$viewed_topics_check_query		=	mysql_query("SELECT * FROM `forum_user_topic_views` WHERE `user_id` = '". $user['id'] ."' AND `topic_id` = '". $topic_row['id'] ."'") or die(mysql_error());
$viewed_topics_check_row = mysql_fetch_assoc($viewed_topics_check_query);
$topic_last_reply_time_query = mysql_query("SELECT * FROM `forum_topics_replies` WHERE `forum_topics_replies_topic_id` = '". $topic_row['id'] ."'");
$topic_last_reply_time_row = mysql_fetch_assoc($topic_last_reply_time_query);
$topic_creation_time = $topic_row['forum_topics_date'];
$topic_last_reply_time = $topic_last_reply_time_row['forum_topics_replies_date'];
$user_topic_view_time = $viewed_topics_check_row['view_time'];
if($user_topic_view_time < $topic_last_reply_time || $user_topic_view_time < $topic_creation_time)
{
$topic_icon = '<b>NEW</b>';
}
else
{
$topic_icon = 'OLD';
}

Спустя 9 минут, 43 секунды (6.11.2011 - 03:06) caballero написал(а):
не надо кидатся писать код
подумай сначала что ты собираешся написать

во первых время последней выборки это одна переменная значит в запросе должно быть либо max() либо limit потому как нужно одно значение

и почему в if четыре переменных когда там всего две должно быть время последнего посещения и время текущего выводимого поста

два запроса - одна перменная и один массив
чего ты понаворотил там


Спустя 2 минуты, 51 секунда (6.11.2011 - 03:09) DeeKeiD написал(а):
Цитата (caballero @ 6.11.2011 - 00:06)
и почему в if четыре переменных когда там всего две должно быть время последнего посещения и время текущего выводимого поста

Проверка времени создания темы и времени последнего ответа, они же в разных таблицах указанны.

Спустя 33 минуты, 12 секунд (6.11.2011 - 03:42) DeeKeiD написал(а):
С выделением вроде разобрался, остался последний вопрос:
Как сделать следующее:

имеется 5 тем (тема_1,тема_2,тема_3,тема_4,тема_5)
две из них пользователь посмотрел (тема_2, тема_5)

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

тема_1
тема_3
тема_4

тема_2
тема_5

* сортировка тем должна идти по дате(новые в верху) для просмотренных и не просмотренных тем

Код вывода тем:
Свернутый текст

$nums = 20;
$page = isset($_GET['page'])?$_GET['page']:1;
$query = "SELECT COUNT(*) AS `total_topics` FROM `forum_topics` WHERE `forum_topics_forum_id` = '". $forumID ."' AND `forum_topics_sticky` = '0'";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$elements = $row['total_topics'];
$pages = ceil($elements/$nums);
if ($page < 1)
{
$page = 1;
}
elseif ($page > $pages)
{
$page = $pages;
}
$start = ($page-1)*$nums;
// когда у нас в таблице нет записей
if ($start < 0) $start = 0;
$query = "SELECT * FROM `forum_topics` WHERE `forum_topics_forum_id` = '". $forumID ."' AND `forum_topics_sticky` = '0' LIMIT {$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());
while($topic_row = mysql_fetch_assoc($sql))
{
/* Выделение не просмотренных тем */
$viewed_topics_check_query = mysql_query("SELECT * FROM `forum_user_topic_views` WHERE `user_id` = '". $user['id'] ."' AND `topic_id` = '". $topic_row['id'] ."'") or die(mysql_error());
$viewed_topics_check_row = mysql_fetch_assoc($viewed_topics_check_query);
$topic_last_reply_time_query = mysql_query("SELECT * FROM `forum_topics_replies` WHERE `forum_topics_replies_topic_id` = '". $topic_row['id'] ."'");
$topic_last_reply_time_row = mysql_fetch_assoc($topic_last_reply_time_query);
$topic_creation_time = $topic_row['forum_topics_date'];
$topic_last_reply_time = $topic_last_reply_time_row['forum_topics_replies_date'];
$user_topic_view_time = $viewed_topics_check_row['view_time'];
if($user_topic_view_time > $topic_last_reply_time OR $user_topic_view_time > $topic_creation_time)
{
$topic_icon = '<img src="/images/icons/forum/no_new_posts.gif">';
$topic_name = $topic_row['forum_topics_content'];
}
else
{
$topic_icon = '<img src="/images/icons/forum/new_posts.gif">';
$topic_name = '<b>'. $topic_row['forum_topics_content'] .'</b>';
}
echo '<table width="100%" class="block_content" border="0">';
echo '<tr>';
echo '<td width="2%" align="center">'.$topic_icon.'</td>';
echo '<td width="3%" align="center">'. getTopicIcon($topic_row['forum_topics_icon']) .'</td>';
echo '<td width="40%"><a href="/forum/topic/'. $topic_row['id'] .'">'. $topic_name .'<br><i>'. $topic_row['forum_topics_description'] .'</i></a></td>';
echo '<td width="15%" align="center">'. getUserNickname($topic_row['forum_topics_author']) .'</td>';
echo '<td width="10%" align="center">n\a</td>';
echo '<td width="10%" align="center">'. $topic_row['forum_topics_views'] .'</td>';
echo '<td width="20%" align="center">n\a</td>';
echo '</tr>';
echo '</table>';
}

Спустя 8 часов, 6 минут, 7 секунд (6.11.2011 - 11:48) neadekvat написал(а):
Цитата (caballero @ 6.11.2011 - 03:13)
хлам в кеше браузера ничем не лучше

В каком кэше? оО

Цитата (caballero @ 6.11.2011 - 03:13)
вряд ли монстрообразные форумы в которых черт ногу сломит - удачный пример для подражания

А что хороший пример? Придумать свои схемы? Так тут никому не угодить: то "фу, свой велик", то "фу, за монстрами следуешь".

Цитата (caballero @ 6.11.2011 - 04:06)
два запроса - одна перменная и один массив

А зачем тут вообще два запроса? Монструозность тебя смущает, а два простых запроса, который просто кричат: "Объедини нас!" - нет?

Спустя 2 часа, 13 минут, 7 секунд (6.11.2011 - 14:01) caballero написал(а):
Цитата
А зачем тут вообще два запроса? Монструозность тебя смущает, а два простых запроса, который просто кричат: "Объедини нас!" - нет?


я могу и десять объединить а человек в трех соснах путается
пусть сначала напишет как проще чтобы хоть как то работало
а потом уже будет оптимизировать


_____________
Бесполезно просить пощады у цезаря
Фатальная ошибка : Звонок в неопределенную функцию ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.