Перейти к контенту
  • 0

[FatCat]Список пользователей в форуме


FatCat

Вопрос

В списке форумов на главной и в категориях появляется список пользователей по каждому форуму.

 

Посмотреть в действии можно: http://vesvalo.net/index.php?act=SC&c=3 или http://vesvalo.net/index.php?act=idx

 

С ленг-файлами не морочился, кому нужно может доделать.

 

 

skin_boards.php

Найти дважды:

		  <th align="left" width="59%" class='titlemedium'>{$ibforums->lang['cat_name']}</th>

и заменить на:

		  <th align="left" width="31%" class='titlemedium'>{$ibforums->lang['cat_name']}</th>
	  <th align="left" width="28%" class='titlemedium'>Посетителей</th>

 

Найти:

		  <td class='darkrow2' colspan="5"> </td>

и заменить на:

		  <td class='darkrow2' colspan="6"> </td>

 

В функции ForumRow($info) найти:

		  <td class="row2" align="center">{$info['topics']}</td>

и добавить выше:

		  <td class="row2" align="center">{$info['visitors_here']}</td>

 

В функции forum_redirect_row($info) найти:

		  <td class="row2" align="center">-</td>
	  <td class="row2" align="center">-</td>

и добавить выше или ниже :D

		  <td class="row2" align="center">-</td>

 

 

Boards.php

Найти:

		$DB->query("SELECT f.*, c.id as cat_id, c.position as cat_position, c.state as cat_state, c.name as cat_name, c.description as cat_desc,
			   c.image, c.url, m.member_name as mod_name, m.member_id as mod_id, m.is_group, m.group_id, m.group_name, m.mid
			   FROM ibf_categories c, ibf_forums f
				 LEFT JOIN ibf_moderators m ON (f.id=m.forum_id)
			   WHERE c.id=f.category
			   ORDER BY c.position, f.position");
	while ( $r = $DB->fetch_row() )
	{

и добавить выше:

// + FatCat: список читающих форум
	// Пошли ковырять сессии в поисках сидящих по форумам:
	$visitors_in_forums = Array();
	$cut_off = ($ibforums->vars['au_cutoff'] != "") ? $ibforums->vars['au_cutoff'] * 60 : 900;
	$cut_off = time() - $cut_off;
	$DB->query("SELECT member_id, member_name, login_type, in_forum FROM ibf_sessions WHERE in_forum > 0 AND running_time > ".$cut_off);
	while ( $r = $DB->fetch_row() )
	{
		if($r['member_name'] == "")$r['member_name'] = " ";
		$visitors_in_forums[ $r['in_forum'] ] .= "!".$r['member_id']."!".$r['member_name']."!".$r['login_type']."!";
	}
// - FatCat: список читающих форум

а ниже добавить:

// + FatCat: список читающих форум
		$visitors_here = $visitors_in_forums[ $r['id'] ];
		if($visitors_here == "") // Никого нет в форуме
		{
			$r['visitors_here'] = "-";
		}
		else
		{
			$visitors_here = substr($visitors_here,1,-1);
			$visitors_here = explode("!!",$visitors_here);
			$r['visitors_here'] = count($visitors_here)." чел. (";
			$guests_c = 0;
			$members_c = 0;
			$hmembers_c = 0;
			$members = "";
			foreach($visitors_here as $visitor)
			{
				$visitor = explode("!",$visitor);
				if( intval($visitor[0])>0 ) // member
				{
					$members_c++;
					if( intval($visitor[2])>0 ) // Скрытный мембер
					{
						$hmembers_c++;
						if ( $ibforums->member['mgroup'] == $ibforums->vars['admin_group'] )
							$members .= "<a href='".$ibforums->base_url."showuser=".$visitor[0]."'>".$visitor[1]."*</a>, ";
					}
					else // Обычный мембер
					{

						$members .= "<a href='".$ibforums->base_url."showuser=".$visitor[0]."'>".$visitor[1]."</a>, ";
					}
				}
				else
				{
					if($visitor[1] == " ") // Гость
					{
						$guests_c++;
					}
					else // бот
					{
						$members .= $visitor[1].", ";
					}
				}
			}
			if($members != "")$members = substr($members,0,-2).".";
			$r['visitors_here'] .= $guests_c." гостей и ".$hmembers_c." скрытых пользователей)";
			$r['visitors_here'] .= "<br>".$members_c." пользователей: ".$members;
		}
// - FatCat: список читающих форум

Изменено пользователем FatCat
Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

FatCat

Отличное улучшение :D

 

А как кстати привязать список к определённому времени, скажем чтоб показывало за последнии 15 минут? ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
как кстати привязать список к определённому времени, скажем чтоб показывало за последнии 15 минут? :D

Он уже привязан к времени - времени истечения сессии; задается в админке. По умолчанию как раз и есть 15 минут.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
как кстати привязать список к определённому времени, скажем чтоб показывало за последнии 15 минут? :D

Он уже привязан к времени - времени истечения сессии; задается в админке. По умолчанию как раз и есть 15 минут.

Странно...

В одном разделе пишеться так:

171 посетителей (153 гостей и 0 скрытых пользователей)

18 пользователей:

Хотя на всём форуме находиться:

42 гостей, 33 пользователей и 4 скрытых пользователей

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Спасибо, нашел недоделку.

В Boards.php нужно сделать отсев просроченных но еще не удаленных сессий.

Не просто:

	   $DB->query("SELECT member_id, member_name, login_type, in_forum FROM ibf_sessions WHERE in_forum > 0");

а:

		$cut_off = ($ibforums->vars['au_cutoff'] != "") ? $ibforums->vars['au_cutoff'] * 60 : 900;
	$cut_off = time() - $cut_off;
	$DB->query("SELECT member_id, member_name, login_type, in_forum FROM ibf_sessions WHERE in_forum > 0 AND running_time > ".$cut_off);

 

Сейчас поправлю код в первом сообщении.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
В Boards.php нужно сделать отсев просроченных но еще не удаленных сессий.

Поправил. Работает то что надо. Правда я немного у себя по другому реализовал :D

 

Ещё один вопросик. В подфорумах это не срабатывает.

Закинуть эту же информацию и в файл Forums.php?

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Принципиально та же идея. Сначала собираем массив посетителей в форуме из таблицы сессий, затем при формировании строки форума забираем из массива посетителей.

Но если подфорумов в каждом форуме немного, проще будет сделать запрос к таблице сессий в каждом подфоруме: нагрузки на sql это почти не увеличит, запросы там легковесные, а вот код будет на порядок проще.

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Принципиально та же идея. Сначала собираем массив посетителей в форуме из таблицы сессий, затем при формировании строки форума забираем из массива посетителей.

Но если подфорумов в каждом форуме немного, проще будет сделать запрос к таблице сессий в каждом подфоруме: нагрузки на sql это почти не увеличит, запросы там легковесные, а вот код будет на порядок проще.

Не могли бы вы набросать такой код? :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0

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

$DB->query("SELECT member_id, member_name FROM ibf_sessions WHERE in_forum = ".$r['id']." AND running_time > ".$cut_off);

Вложенные запросы обрабатывать в цикле, забирая имя $row['member_name'] и айдишник $row['member_id'] для каждого посетителя обрабатываемого подфорума.

Изменено пользователем FatCat
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Понадобится основной запрос вывести в переменную, чтобы можно было в цикле делать вложенные запросы вида:
$DB->query("SELECT member_id, member_name FROM ibf_sessions WHERE in_forum = ".$r['id']." AND running_time > ".$cut_off);

Вложенные запросы обрабатывать в цикле, забирая имя $row['member_name'] и айдишник $row['member_id'] для каждого посетителя обрабатываемого подфорума.

 

Поставил это вместо

$DB->query("SELECT member_id, member_name, login_type, in_forum FROM ibf_sessions WHERE in_forum > 0 AND running_time > ".$cut_off);

Вот что на форуме выдаёт:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/imtw.ru/sources/Drivers/mySQL.php on line 171
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Дык основной запрос вынести в переменную.

Вместо

		$DB->query("SELECT f.*, m.member_name as mod_name, m.member_id as mod_id, m.is_group, m.group_id, m.group_name, m.mid
				FROM ibf_forums f
				 LEFT JOIN ibf_moderators m ON (f.id=m.forum_id)
				WHERE parent_id='$fid'
				ORDER BY position");

	if ( ! $DB->get_num_rows() )
	{
		return "";
	}

	while ( $r = $DB->fetch_row() )

использовать что-то типа:

$query = $DB->query("SELECT f.*, m.member_name as mod_name, m.member_id as mod_id, m.is_group, m.group_id, m.group_name, m.mid

FROM ibf_forums f

LEFT JOIN ibf_moderators m ON (f.id=m.forum_id)

WHERE parent_id='$fid'

ORDER BY position");

 

if ( ! $DB->get_num_rows($query) )

{

return "";

}

 

while ( $r = $DB->fetch_row($query) )

Ссылка на комментарий
Поделиться на других сайтах

  • 0

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

Вместо:

		$DB->query("SELECT member_id, member_name, login_type, in_forum FROM ibf_sessions WHERE in_forum > 0 AND running_time > ".$cut_off);
	while ( $r = $DB->fetch_row() )
	{
		if($r['member_name'] == "")$r['member_name'] = " ";
		$visitors_in_forums[ $r['in_forum'] ] .= "!".$r['member_id']."!".$r['member_name']."!".$r['login_type']."!";
	}

использовать:

		$DB->query("SELECT s.member_id, s.member_name, s.login_type, s.in_forum, f.parent_id
				FROM ibf_sessions s
				LEFT JOIN ibf_forums f ON ( f.id = s.in_forum ) 
				WHERE in_forum >0
				AND running_time > ".$cut_off);
	while ( $r = $DB->fetch_row() )
	{
		if($r['parent_id']>0)$r['in_forum'] = $r['parent_id'];
		if($r['member_name'] == "")$r['member_name'] = " ";
		$visitors_in_forums[ $r['in_forum'] ] .= "!".$r['member_id']."!".$r['member_name']."!".$r['login_type']."!";
	}

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.