[BETA] ещё один вариант whoisonline, viewonline

Здесь авторы могут постить бета-версии своих модификаций для phpBB 3.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 9 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

[BETA] ещё один вариант whoisonline, viewonline

Сообщение c61 »

viewonline - расширение viewonline.php возможностью узнать кто какую тему смотрит
whoisonline - расширение viewtopic.php возможностью узнать кто находится в просматриваемой теме

Эти моды - компиляция известных модов и сообщений на phpbbguru. Мне показалось, что проще всего их применять в "одном флаконе" и таком простом виде, как изложено ниже.

whoisonline:

1) В forum/includes/function.php добавить AFTER

Код: Выделить всё

	// a little discrete magic to cache this for 30 seconds
	$time = (time() - (intval($config['load_online_time']) * 60));
-------------------------------------------------------------------------------

Код: Выделить всё

	// c61 whoisonline
	if ( ($item_id != 0) && ($item == 'forum') )
	{
		$current_user_id = $user->data['user_id'];
		$sql = 'SELECT s.session_forum_id, s.session_page
			FROM ' . SESSIONS_TABLE . ' s
			WHERE s.session_time >= ' . ($time - ((int) ($time % 30))) .
			' AND s.session_user_id = ' . $current_user_id .
			' AND s.session_user_id <> ' . ANONYMOUS;
		$result = $db->sql_query($sql);
		$forum_id = 0;
		while ($row = $db->sql_fetchrow($result))
		{
			if ($row['session_forum_id'] == 0)
			{
				preg_match('#^([a-z0-9/_-]+)#i', $row['session_page'], $on_page);
				if (!sizeof($on_page))
				{
					$on_page[1] = '';
				}
				switch ($on_page[1])
				{
					case 'viewtopic':
						preg_match('|p=([0-9]+)|', $row['session_page'], $on_page_post);
						if (!empty($on_page_post[1]))
						{
							$sql2 = 'SELECT forum_id FROM ' . POSTS_TABLE ." WHERE post_id = {$on_page_post[1]}";
							$forum_result = $db->sql_query($sql2);
							$forum_result_row = $db->sql_fetchrow($forum_result);
							if ($forum_result_row)
							{
								$forum_id = $forum_result_row['forum_id'];
							}
							$db->sql_freeresult($forum_result);
						}
						break;
				}
			}
		}
		$db->sql_freeresult($result);
		if ($forum_id != 0)
		{
			$sql_rep_change_session_forum_id  = 'session_forum_id  = ' . $forum_id;

			$sql2 = 'UPDATE ' . SESSIONS_TABLE .
				' SET ' . $sql_rep_change_session_forum_id .
				' WHERE session_time >= ' . ($time - ((int) ($time % 30))) .
				' AND session_user_id = ' . $current_user_id .
				' AND session_user_id <> ' . ANONYMOUS;
			$db->sql_query($sql2);
		}
	}
	//
-------------------------------------------------------------------------------

2) В forum/includes/function.php REPLACE

Код: Выделить всё

	$sql = 'SELECT s.session_user_id, s.session_ip, s.session_viewonline
		FROM ' . SESSIONS_TABLE . ' s
		WHERE s.session_time >= ' . ($time - ((int) ($time % 30))) .
			$reading_sql .
		' AND s.session_user_id <> ' . ANONYMOUS;
-------------------------------------------------------------------------------

Код: Выделить всё

	// c61 whoisonline
	$sql = 'SELECT s.session_user_id, s.session_ip, s.session_page, s.session_viewonline
		FROM ' . SESSIONS_TABLE . ' s
		WHERE s.session_time >= ' . ($time - ((int) ($time % 30))) .
			$reading_sql .
		' AND s.session_user_id <> ' . ANONYMOUS;
	//
-------------------------------------------------------------------------------

3) В forum/includes/function.php добавить AFTER

Код: Выделить всё

		// Skip multiple sessions for one user
		if (!isset($online_users['online_users'][$row['session_user_id']]))
		{
			$online_users['online_users'][$row['session_user_id']] = (int) $row['session_user_id'];
-------------------------------------------------------------------------------

Код: Выделить всё

			// c61 whoisonline
			$online_users['online_users_page'][$row['session_user_id']] = 0;
			$online_users['online_users_mode'][$row['session_user_id']] = 0;
			preg_match('#^([a-z0-9/_-]+)#i', $row['session_page'], $on_page);
			if (!sizeof($on_page))
			{
				$on_page[1] = '';
			}
			$do_page_sql = 0;
			switch ($on_page[1])
			{
				case 'posting':
					preg_match('#mode=([a-z]+)#', $row['session_page'], $on_page);
					$posting_mode = (!empty($on_page[1])) ? $on_page[1] : '';
					switch ($posting_mode)
					{
						case 'reply':
						case 'quote':
						case 'edit':
							$do_page_sql = 2;
							break;
					}
					break;
				case 'viewtopic':
					$do_page_sql = 1;
					break;
			}
			if ($do_page_sql)
			{
				preg_match('|t=([0-9]+)|', $row['session_page'], $on_page);
				if (!empty($on_page[1]))
				{
					$sql2 = 'SELECT topic_id FROM ' . TOPICS_TABLE ." WHERE topic_id = {$on_page[1]}";
					$topic_result = $db->sql_query($sql2);
					$topic_result_row = $db->sql_fetchrow($topic_result);
					if ($topic_result_row)
					{
						$online_users['online_users_page'][$row['session_user_id']] = $topic_result_row['topic_id'];
						$online_users['online_users_mode'][$row['session_user_id']] = $do_page_sql - 1;
					}
					$db->sql_freeresult($topic_result);
				}
				else
				{
					preg_match('|p=([0-9]+)|', $row['session_page'], $on_page_post);
					if (!empty($on_page_post[1]))
					{
						$sql2 = 'SELECT topic_id FROM ' . POSTS_TABLE ." WHERE post_id = {$on_page_post[1]}";
						$topic_result = $db->sql_query($sql2);
						$topic_result_row = $db->sql_fetchrow($topic_result);
						if ($topic_result_row)
						{
							$online_users['online_users_page'][$row['session_user_id']] = $topic_result_row['topic_id'];
							$online_users['online_users_mode'][$row['session_user_id']] = $do_page_sql - 1;
						}
						$db->sql_freeresult($topic_result);
					}
				}
			}
			//
-------------------------------------------------------------------------------

4) В forum/includes/function.php добавить AFTER

Код: Выделить всё

		$sql = 'SELECT username, username_clean, user_id, user_type, user_allow_viewonline, user_colour
				FROM ' . USERS_TABLE . '
				WHERE ' . $db->sql_in_set('user_id', $online_users['online_users']) . '
				ORDER BY username_clean ASC';
		$result = $db->sql_query($sql);
-------------------------------------------------------------------------------

Код: Выделить всё

		// c61 whoisonline
		$current_user_id = $user->data['user_id'];
		$current_topic_id = isset($online_users['online_users_page'][$current_user_id]) ? $online_users['online_users_page'][$current_user_id] : 0;
		//
-------------------------------------------------------------------------------

5) В forum/includes/function.php добавить AFTER

Код: Выделить всё

					$user_online_link = get_username_string(($row['user_type'] <> USER_IGNORE) ? 'full' : 'no_profile', $row['user_id'], $row['username'], $row['user_colour']);
					$online_userlist .= ($online_userlist != '') ? ', ' . $user_online_link : $user_online_link;
-------------------------------------------------------------------------------

Код: Выделить всё

					// c61 whoisonline
					if ( ($current_topic_id != 0) && ($current_topic_id == $online_users['online_users_page'][$row['user_id']]) )
					{
						$online_userlist .= ($online_users['online_users_mode'][$row['user_id']] == 0) ? $user->lang['BROWSING_FORUM_IN_TOPIC'] : $user->lang['BROWSING_FORUM_IN_TOPIC_POSTING'];
					}
					//
-------------------------------------------------------------------------------

6) В forum/includes/language/en/common.php добавить AFTER

Код: Выделить всё

	'BROWSING_FORUM_GUESTS'	=> 'Users browsing this forum: %1$s and %2$d guests',
-------------------------------------------------------------------------------

Код: Выделить всё

	// c61 whoisonline
	'BROWSING_FORUM_IN_TOPIC'		=> ' (at this topic)',
	'BROWSING_FORUM_IN_TOPIC_POSTING'	=> ' (posting at this topic)',
	//
-------------------------------------------------------------------------------

7) В forum/includes/language/ru/common.php добавить AFTER

Код: Выделить всё

	'BROWSING_FORUM_GUESTS'		=> 'Сейчас этот форум просматривают: %1$s и гости: %2$d',
-------------------------------------------------------------------------------

Код: Выделить всё

	// c61 whoisonline
	'BROWSING_FORUM_IN_TOPIC'		=> ' (в этой теме)',
	'BROWSING_FORUM_IN_TOPIC_POSTING'	=> ' (отвечает в этой теме)',
	//
-------------------------------------------------------------------------------

Мод делался для phpbb 3.0.7, на 3.0.12 работает.

viewonline:

1) В ./forum/viewonline.php добавить AFTER

Код: Выделить всё

		case 'index':
			$location = $user->lang['INDEX'];
			$location_url = append_sid("{$phpbb_root_path}index.$phpEx");
		break;
-------------------------------------------------------------------------------

Код: Выделить всё

			// c61 viewonline mod
		case 'simplechat/index':
            		$location = $user->lang['CHAT'];
            		$location_url = append_sid("{$phpbb_root_path}simplechat/index.$phpEx");
        	break;
			//
-------------------------------------------------------------------------------

2) В ./forum/viewonline.php добавить AFTER

Код: Выделить всё

		case 'viewtopic':
			$forum_id = $row['session_forum_id'];
-------------------------------------------------------------------------------

Код: Выделить всё

			// c61 viewonline mod
			switch ($on_page[1])
			{
				case 'viewtopic':
					if ($forum_id == 0)
					{
						preg_match('|t=([0-9]+)|', $row['session_page'], $on_page_topic);
						preg_match('|p=([0-9]+)|', $row['session_page'], $on_page_post);
						if (!empty($on_page_post[1]))
						{
							$sql = 'SELECT t.forum_id FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE ." p WHERE t.topic_id = p.topic_id AND p.post_id = {$on_page_post[1]}";
						}
						if (!empty($on_page_topic[1]))
						{
							$sql = 'SELECT forum_id FROM ' . TOPICS_TABLE . " WHERE topic_id = {$on_page_topic[1]}";
						}
						$topic_result = $db->sql_query($sql);
						$topic_data = $db->sql_fetchrow($topic_result);
						if ($topic_data) $forum_id = $topic_data['forum_id'];
						$db->sql_freeresult($topic_result);
					}
				break;
			}
			//
-------------------------------------------------------------------------------

3) В ./forum/viewonline.php AFTER

Код: Выделить всё

						switch ($posting_mode)
						{
							case 'reply':
							case 'quote':
-------------------------------------------------------------------------------
удалить (закомментировать) строку:

Код: Выделить всё

								$location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
-------------------------------------------------------------------------------
вставить строки:

Код: Выделить всё

								// c61 viewonline mod
							case 'edit':
								preg_match('|t=([0-9]+)|', $row['session_page'], $on_page);
								preg_match('|p=([0-9]+)|', $row['session_page'], $on_page_post);
								if (!empty($on_page_post[1]))
								{
									$sql = 'SELECT topic_title FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE ." p WHERE t.topic_id = p.topic_id AND p.post_id = {$on_page_post[1]}";
								}
								if (!empty($on_page[1]))
								{
									$sql = 'SELECT topic_title FROM ' . TOPICS_TABLE . " WHERE topic_id = {$on_page[1]}";
								}
								$topic_result = $db->sql_query($sql);
								$topic_data = $db->sql_fetchrow($topic_result);
								$location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name'], $topic_data['topic_title']);
								$db->sql_freeresult($topic_result);
								$location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . ((!empty($on_page[1])) ? '&t=' . $on_page[1] : '&p=' . $on_page_post[1]));
								$db->sql_freeresult($topic_result);
								$location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . ((!empty($on_page[1])) ? '&t=' . $on_page[1] : '&p=' . $on_page_post[1]));
								//
							break;
-------------------------------------------------------------------------------

4) В ./forum/viewonline.php AFTER

Код: Выделить всё

					break;

					case 'viewtopic':
-------------------------------------------------------------------------------
удалить (закомментировать) строку:

Код: Выделить всё

						$location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
-------------------------------------------------------------------------------
вставить строки:

Код: Выделить всё

						// c61 viewonline mod
						preg_match('|t=([0-9]+)|', $row['session_page'], $on_page);
						preg_match('|p=([0-9]+)|', $row['session_page'], $on_page_post);
						if (!empty($on_page_post[1]))
						{
							$sql = 'SELECT topic_title FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE ." p WHERE t.topic_id = p.topic_id AND p.post_id = {$on_page_post[1]}";
						}
						if (!empty($on_page[1]))
						{
							$sql = 'SELECT topic_title FROM ' . TOPICS_TABLE . " WHERE topic_id = {$on_page[1]}";
						}
						$topic_result = $db->sql_query($sql);
						$topic_data = $db->sql_fetchrow($topic_result);
						$location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_data['topic_title']);
						$db->sql_freeresult($topic_result);
						$location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . ((!empty($on_page[1])) ? '&t=' . $on_page[1] : '&p=' . $on_page_post[1]));
						//
-------------------------------------------------------------------------------

5) В ./forum/language/en/common.php REPLACE

Код: Выделить всё

	'READING_TOPIC'				=> 'Reading topic in %s',
-------------------------------------------------------------------------------

Код: Выделить всё

	// c61 viewtopic mod
	'READING_TOPIC'				=> 'Reading topic <%2$s> in <%1$s>',
	//
-------------------------------------------------------------------------------

6) В ./forum/language/ru/common.php REPLACE

Код: Выделить всё

	'READING_TOPIC'				=> 'Просмотр темы в форуме <%s>',
-------------------------------------------------------------------------------

Код: Выделить всё

	// c61 viewtopic mod
	'READING_TOPIC'				=> 'Просмотр темы <%2$s> в форуме <%1$s>',
	//
-------------------------------------------------------------------------------

Мод делался для phpbb 3.0.7, на 3.0.12 работает.

Вернуться в «Бета-версии модов для phpBB 3.0.x»