Центр пользователя  |  Ваши сообщения  |  FAQ
Форум поддержки phpBB » phpBB » Обсуждение phpBB

КАК РЕАЛИЗОВАН ПРИНЦИП НЕПРОЧИТАННЫХ СООБЩЕНИЙ?

Общение на любые темы о форуме и движении phpBB

Сообщение 29 май 2012, 11:42

Всем привет. Кто знает как в форуме работает система непрочитанных сообщений? Когда заходишь и тебе выделаются все новые сообщения с твоего последнего визита. Интересует как построена таблица БД, как присваивается статус непрочитанных для каждого пользователя и т.д.
Votono
Новичок
 
Сообщений: 5
Зарегистрирован:
29 май 2012, 11:40
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение 29 май 2012, 11:54

Votono
как построена таблица вы можете посмотреть в sql файле, который находится в папке install/schemas
crash
Поддержка
 
Сообщений: 11348
Зарегистрирован:
27 янв 2009, 03:22
Благодарил (а): 1 раз.
Поблагодарили: 568 раз.

Сообщение 29 май 2012, 12:02

Ну да, это я уже нашёл. Вот тут тоже есть: http://www.phpbbguru.net/database/table ... ums-track/ Но вот как туда запись осуществляется я пока не понимаю.
Votono
Новичок
 
Сообщений: 5
Зарегистрирован:
29 май 2012, 11:40
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение 29 май 2012, 12:03

Votono
что значит как запись осуществляется? С помощью sql запросов.
crash
Поддержка
 
Сообщений: 11348
Зарегистрирован:
27 янв 2009, 03:22
Благодарил (а): 1 раз.
Поблагодарили: 568 раз.

Сообщение 29 май 2012, 12:12

Код: выделить все
/**
* Get list of unread topics
*
* @param int $user_id         User ID (or false for current user)
* @param string $sql_extra      Extra WHERE SQL statement
* @param string $sql_sort      ORDER BY SQL sorting statement
* @param string $sql_limit      Limits the size of unread topics list, 0 for unlimited query
* @param string $sql_limit_offset  Sets the offset of the first row to search, 0 to search from the start
*
* @return array[int][int]      Topic ids as keys, mark_time of topic as value
*/
function get_unread_topics($user_id = false, $sql_extra = '', $sql_sort = '', $sql_limit = 1001, $sql_limit_offset = 0)
{
   global $config, $db, $user;

   $user_id = ($user_id === false) ? (int) $user->data['user_id'] : (int) $user_id;

   // Data array we're going to return
   $unread_topics = array();

   if (empty($sql_sort))
   {
      $sql_sort = 'ORDER BY t.topic_last_post_time DESC';
   }

   if ($config['load_db_lastread'] && $user->data['is_registered'])
   {
      // Get list of the unread topics
      $last_mark = (int) $user->data['user_lastmark'];

      $sql_array = array(
         'SELECT'      => 't.topic_id, t.topic_last_post_time, tt.mark_time as topic_mark_time, ft.mark_time as forum_mark_time',

         'FROM'         => array(TOPICS_TABLE => 't'),

         'LEFT_JOIN'      => array(
            array(
               'FROM'   => array(TOPICS_TRACK_TABLE => 'tt'),
               'ON'   => "tt.user_id = $user_id AND t.topic_id = tt.topic_id",
            ),
            array(
               'FROM'   => array(FORUMS_TRACK_TABLE => 'ft'),
               'ON'   => "ft.user_id = $user_id AND t.forum_id = ft.forum_id",
            ),
         ),

         'WHERE'         => "
             t.topic_last_post_time > $last_mark AND
            (
            (tt.mark_time IS NOT NULL AND t.topic_last_post_time > tt.mark_time) OR
            (tt.mark_time IS NULL AND ft.mark_time IS NOT NULL AND t.topic_last_post_time > ft.mark_time) OR
            (tt.mark_time IS NULL AND ft.mark_time IS NULL)
            )
            $sql_extra
            $sql_sort",
      );

      $sql = $db->sql_build_query('SELECT', $sql_array);
      $result = $db->sql_query_limit($sql, $sql_limit, $sql_limit_offset);

      while ($row = $db->sql_fetchrow($result))
      {
         $topic_id = (int) $row['topic_id'];
         $unread_topics[$topic_id] = ($row['topic_mark_time']) ? (int) $row['topic_mark_time'] : (($row['forum_mark_time']) ? (int) $row['forum_mark_time'] : $last_mark);
      }
      $db->sql_freeresult($result);
   }
   else if ($config['load_anon_lastread'] || $user->data['is_registered'])
   {
      global $tracking_topics;

      if (empty($tracking_topics))
      {
         $tracking_topics = request_var($config['cookie_name'] . '_track', '', false, true);
         $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
      }

      if (!$user->data['is_registered'])
      {
         $user_lastmark = (isset($tracking_topics['l'])) ? base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate'] : 0;
      }
      else
      {
         $user_lastmark = (int) $user->data['user_lastmark'];
      }

      $sql = 'SELECT t.topic_id, t.forum_id, t.topic_last_post_time
         FROM ' . TOPICS_TABLE . ' t
         WHERE t.topic_last_post_time > ' . $user_lastmark . "
         $sql_extra
         $sql_sort";
      $result = $db->sql_query_limit($sql, $sql_limit, $sql_limit_offset);

      while ($row = $db->sql_fetchrow($result))
      {
         $forum_id = (int) $row['forum_id'];
         $topic_id = (int) $row['topic_id'];
         $topic_id36 = base_convert($topic_id, 10, 36);

         if (isset($tracking_topics['t'][$topic_id36]))
         {
            $last_read = base_convert($tracking_topics['t'][$topic_id36], 36, 10) + $config['board_startdate'];

            if ($row['topic_last_post_time'] > $last_read)
            {
               $unread_topics[$topic_id] = $last_read;
            }
         }
         else if (isset($tracking_topics['f'][$forum_id]))
         {
            $mark_time = base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate'];

            if ($row['topic_last_post_time'] > $mark_time)
            {
               $unread_topics[$topic_id] = $mark_time;
            }
         }
         else
         {
            $unread_topics[$topic_id] = $user_lastmark;
         }
      }
      $db->sql_freeresult($result);
   }

   return $unread_topics;
}
crash
Поддержка
 
Сообщений: 11348
Зарегистрирован:
27 янв 2009, 03:22
Благодарил (а): 1 раз.
Поблагодарили: 568 раз.

Сообщение 29 май 2012, 12:13

Постараюсь объяснить подробней. Вот я пользователь, я зашёл на форум, все сообщения я видел, и я вышел. Затем зашёл через сутки. За эти сутки разные пользователи написали в общем 10 сообщений...

В базе есть таблица Phpbb forums track, в которой содержится три поля: user_id, forum_id, mark_time. Вот каким образом туда вносятся записи? То есть как получается, когда какой-то пользователь пишет сообщение, то в эту таблицу добавляется по одной записи для каждого пользователя? А если пользователей 1000? То 1000 записей одновременно оставляется в таблицу? И как они от туда удаляются? Опять же вопрос, там forum_id, а как форум определяет конкретные сообщения? В общем почти ничего не понятно.

Можете прям объяснить от начала и до конца принцип работы этой системы?
Votono
Новичок
 
Сообщений: 5
Зарегистрирован:
29 май 2012, 11:40
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение 29 май 2012, 12:17

Votono писал(а):То есть как получается, когда какой-то пользователь пишет сообщение, то в эту таблицу добавляется по одной записи для каждого пользователя?

как бы это. Прочтите еще раз
Votono писал(а):В базе есть таблица Phpbb forums track, в которой содержится три поля: user_id, forum_id, mark_time

если слово mark_time перевести, то это значит время маркировки грубо говоря. То есть когда пользователь пометил все сообщения прочитанными. А не когда пользователи написали сообщения, поэтому пусть хоть миллион пользователей пишут, туда ничего не должно добавиться.
Votono писал(а):Опять же вопрос, там forum_id, а как форум определяет конкретные сообщения?

а что у конкретного сообщения нет id форума?
crash
Поддержка
 
Сообщений: 11348
Зарегистрирован:
27 янв 2009, 03:22
Благодарил (а): 1 раз.
Поблагодарили: 568 раз.

Сообщение 29 май 2012, 12:25

Вот я и понимаю, что ничего не понимаю. Объясните пожалуйста принцип от начала, как всё происходит, прям по пунктам. Очень прошу.
Votono
Новичок
 
Сообщений: 5
Зарегистрирован:
29 май 2012, 11:40
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Сообщение 30 май 2012, 11:06

Ну так что?
Votono
Новичок
 
Сообщений: 5
Зарегистрирован:
29 май 2012, 11:40
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.


Вернуться в Обсуждение phpBB

 


  • Похожие темы
    Ответов
    Просмотров
    Последнее сообщение

Кто сейчас на форуме

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

Форум поддержки phpBB
2008 - 2017 © BB3x.ru - русская поддержка форума phpBB3
Создано на основе phpBB® Forum Software © phpBB Group
авторов модов
разработчиков скинов
русификаторов
и всех поклонников phpBB3