Перейти к контенту
  • 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']."!";
	}

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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

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

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

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