page_header.php, вопрос по текстовой переменной

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

page_header.php, вопрос по текстовой переменной

Сообщение Thanx »

Вот кусок кода из моего page_header.php, который наполняет переменную $online_userlist:

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

	while( $row = $db->sql_fetchrow($result) )
	{
		// User is logged in and therefor not a guest
		if ( $row['session_logged_in'] )
		{
			// Skip multiple sessions for one user
			if ( $row['user_id'] != $prev_user_id )
			{
				$style_color = '';
				if ( $row['user_level'] == ADMIN )
				{
					$row['username'] = '<b>' . $row['username'] . '</b>';
					$style_color = 'style="color:#FF0000"';
				}
				else if ( $row['user_level'] == MOD )
				{
					$row['username'] = '<b>' . $row['username'] . '</b>';
					$style_color = 'style="color:#0000FF"';
				}

				if ( $row['user_allow_viewonline'] )
				{
					$user_online_link = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'>' . $row['username'] . '</a>';
					$logged_visible_online++;
				}
				else
				{
					$user_online_link = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'><i>' . $row['username'] . '</i></a>';
					$logged_hidden_online++;
				}

				if ( $row['user_allow_viewonline'] || $userdata['user_level'] == ADMIN )
				{
					$online_userlist .= ( $online_userlist != '' ) ? ', ' . $user_online_link : $user_online_link;
				}
			}

			$prev_user_id = $row['user_id'];
		}
		else
		{
			// Skip multiple sessions for one user
			if ( $row['session_ip'] != $prev_session_ip )
			{
                             $guests_online++;

				if (($row['is_robot'] != '0') && ($row['is_robot'] != $prev_is_robot))
				{
				
				$row['is_robot'] = '<span style="color:#c2c2c2">' . $row['is_robot'] . '</span>';
				$online_userlist = $row['is_robot'] . (($online_userlist!='') ? ', ' : '') . $online_userlist;  

					}	
			
			}
			
		}
        $prev_is_robot = $row['is_robot'];
       $prev_session_ip = $row['session_ip'];
	}
Я бы хотел обратить внимение на вот этот кусочек кода (строку):

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

				$online_userlist = $row['is_robot'] . (($online_userlist!='') ? ', ' : '') . $online_userlist;  
что интересно, при следующей перестановке

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

				$online_userlist = $online_userlist . (($row['is_robot']!='') ? ', ' : '') . $row['is_robot'];  

почему то список роботов не переходит в конец списка "Кто онлайн?", а так и остаются в начале списка, лишь с предваряющей, абсолютно не к месту, запятой.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16948
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1701 раз

Сообщение rxu »

А разве тут есть отдельный список роботов, который должен находиться в начале или в конце? Тут роботы среди прочих, имхо.
Если нужно, делайте отдельный список роботов и помещайте его куда удобно.
Изображение
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

Сообщение Thanx »

Согласен, что роботы здесь среди прочих, но меня интересует вопрос, почему обычная текстовая переменная при перестановке составных частей реально на экране не переставляется, и $row['is_robot'], по одному, выводятся в начале строки "Кто онлайн". Я немного не понимаю, где расставляются приоритеты по выводу. Для меня $online_userlist как бы обычная текстовая переменная, но вижу, что это не так.

Добавлено спустя 2 минуты 11 секунд:

Отдельный список роботов сделать можно, не проблема, но тут вопрос не в этом. Я немного не понимаю поведение текстовой переменной $online_userlist при выводе на экран.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16948
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1701 раз

Сообщение rxu »

SQL запрос в студию.
Изображение
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

Сообщение Thanx »

А он тут как тут:

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

if (defined('SHOW_ONLINE'))
{

	$user_forum_sql = ( !empty($forum_id) ) ? "AND s.session_page = " . intval($forum_id) : '';
	$sql = "SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_ip, s.is_robot
		FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s
		WHERE u.user_id = s.session_user_id
			AND s.session_time >= ".( time() - 300 ) . "
			$user_forum_sql
		ORDER BY u.username ASC, s.session_ip ASC";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not obtain user/online information', '', __LINE__, __FILE__, $sql);
	}

	$userlist_ary = array();
	$userlist_visible = array();

	$prev_user_id = 0;
	$prev_user_ip = $prev_session_ip = '';

	$prev_is_robot = '';

	while( $row = $db->sql_fetchrow($result) )
	{
		// User is logged in and therefor not a guest
		if ( $row['session_logged_in'] )
		{
			// Skip multiple sessions for one user
			if ( $row['user_id'] != $prev_user_id )
			{
				$style_color = '';
				if ( $row['user_level'] == ADMIN )
Добавлено спустя 3 минуты 30 секунд:

Эх, вот бы этот sql запрос преобразовать, чтобы все iser_id, которые "-1", были в конце списка!

Добавлено спустя 2 минуты 18 секунд:

И кстати, хорошо бы еще длинный список

"Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, ...."

преобразовать в "Yahoo Slurp (n), "

вообще добавочный код взят из мода Search Bot Indexing MOD v1.3.0 с оффсайта.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16948
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1701 раз

Сообщение rxu »

Вобщем ничего особенного, сортировка поименно и поадресно.
Какая строка списка на индексе в итоге получается в оригинале? Можно цитату?
Изображение
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

Сообщение Thanx »

"Зарегистрированные пользователи: Yahoo Slurp, Googlebot, Mike"
Аватара пользователя
Поручик
Former team member
Сообщения: 3942
Стаж: 19 лет 11 месяцев
Откуда: Оренбург (Южный Урал)
Благодарил (а): 3 раза

Сообщение Поручик »

А эти, Yahoo Slurp, Googlebot, наверное и ссылку в профиле указывают?
Профессионал - тот же дилетант, только знающий, где ошибётся.
Генератор db_update.php для phpBB2 с некоторыми удобствами. Многие моды я беру или ищу здесь, здесь, тут
Все консультации только на форуме, приваты и стук в аську по таким вопросам игнорируются!
FAQ-phpBB3 | Ошибки новичков, или как не поссориться с модератором | Правила конференции

наш форум http://forum.aeroion.ru/cat1.html
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

Сообщение Thanx »

нет конечно
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16948
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1701 раз

Сообщение rxu »

Видимо, происходит так.
Из базы выбираются записи по ID в порядке имен по возрастанию и адресов по возрастанию.
В базе товарищи Yahoo Slurp, Googlebot имеют одно и то же имя - Anonymous, поэтому в результатах запроса становятся раньше товарища Mike. А между собой они уже разбираются по адресу - видимо, у Yahoo значение IP адреса "меньше", чем у Googlebot, вот он и первый. Ну а в список попадают, естественно, названия роботов из другого поля, а не Anonymous.
В итоге получаем то, что имеем :D
Изображение
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

Сообщение Thanx »

rxu, все понял. Нужно писать свой кусок кода. 8)
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 19 лет 4 месяца
Благодарил (а): 15 раз

Сообщение Thanx »

Итак, если кому нужно, я вчера написал кусочек кода (пришлось разбить один sql скрипт на два), но теперь роботы идут в конце списка:

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

Заменить в page_header.php

код:

---
if (defined('SHOW_ONLINE'))
{

	$user_forum_sql = ( !empty($forum_id) ) ? "AND s.session_page = " . intval($forum_id) : '';
	$sql = "SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_ip, s.is_robot
		FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s
		WHERE u.user_id = s.session_user_id
			AND s.session_time >= ".( time() - 300 ) . "
			$user_forum_sql
		ORDER BY u.username ASC, s.session_ip ASC";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not obtain user/online information', '', __LINE__, __FILE__, $sql);
	}

	$userlist_ary = array();
	$userlist_visible = array();

	$prev_user_id = 0;
	$prev_user_ip = $prev_session_ip = '';

	$prev_is_robot = '';

	while( $row = $db->sql_fetchrow($result) )
	{
		// User is logged in and therefor not a guest
		if ( $row['session_logged_in'] )
		{
			// Skip multiple sessions for one user
			if ( $row['user_id'] != $prev_user_id )
			{
				$style_color = '';
				if ( $row['user_level'] == ADMIN )
				{
					$row['username'] = '<b>' . $row['username'] . '</b>';
					$style_color = 'style="color:#FF0000"';
				}
				else if ( $row['user_level'] == MOD )
				{
					$row['username'] = '<b>' . $row['username'] . '</b>';
					$style_color = 'style="color:#0000FF"';
				}

				if ( $row['user_allow_viewonline'] )
				{
					$user_online_link = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'>' . $row['username'] . '</a>';
					$logged_visible_online++;
				}
				else
				{
					$user_online_link = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'><i>' . $row['username'] . '</i></a>';
					$logged_hidden_online++;
				}

				if ( $row['user_allow_viewonline'] || $userdata['user_level'] == ADMIN )
				{
					$online_userlist .= ( $online_userlist != '' ) ? ', ' . $user_online_link : $user_online_link;
				}
			}

			$prev_user_id = $row['user_id'];
		}
		else
		{
			// Skip multiple sessions for one user
			if ( $row['session_ip'] != $prev_session_ip )
			{
                             $guests_online++;

				if (($row['is_robot'] != '0') && ($row['is_robot'] != $prev_is_robot))
				{
				
				$row['is_robot'] = '<span style="color:#c2c2c2">' . $row['is_robot'] . '</span>';
				$online_userlist = $row['is_robot'] . (($online_userlist!='') ? ', ' : '') . $online_userlist;  

					}	
			
			}
			
		}
        $prev_is_robot = $row['is_robot'];
       $prev_session_ip = $row['session_ip'];
	}
---


на следующий код:

---

if (defined('SHOW_ONLINE'))
{

	$user_forum_sql = ( !empty($forum_id) ) ? "AND s.session_page = " . intval($forum_id) : '';
	$sql = "SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level
		FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s
		WHERE u.user_id = s.session_user_id
			and u.user_id <> -1
			and s.session_time >= ".( time() - 300 ) . "
			$user_forum_sql
		ORDER BY u.username ASC";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not obtain user/online information', '', __LINE__, __FILE__, $sql);
	}

	$userlist_ary = array();
	$userlist_visible = array();

	$prev_user_id = 0;
	$prev_user_ip = $prev_session_ip = '';

	while( $row = $db->sql_fetchrow($result) )
	{
		// Skip multiple sessions for one user
		if ( $row['user_id'] != $prev_user_id )
		{
			$style_color = '';
			if ( $row['user_level'] == ADMIN )
			{
				$row['username'] = '<b>' . $row['username'] . '</b>';
				$style_color = 'style="color:#FF0000"';
			}
			else if ( $row['user_level'] == MOD )
			{
				$row['username'] = '<b>' . $row['username'] . '</b>';
				$style_color = 'style="color:#0000FF"';
			}
			if ( $row['user_allow_viewonline'] )
			{
				$user_online_link = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'>' . $row['username'] . '</a>';
				$logged_visible_online++;
			}
			else
			{
				$user_online_link = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'><i>' . $row['username'] . '</i></a>';
				$logged_hidden_online++;
			}
			if ( $row['user_allow_viewonline'] || $userdata['user_level'] == ADMIN )
			{
				$online_userlist .= ( $online_userlist != '' ) ? ', ' . $user_online_link : $user_online_link;
			}
		$prev_user_id = $row['user_id'];
		}
	}

	$db->sql_freeresult($result);

	$sql = "SELECT s.is_robot, s.session_ip
		FROM ".SESSIONS_TABLE." s
		WHERE s.session_user_id = -1
			and s.session_time >= ".( time() - 300 ) . "
			$user_forum_sql
		ORDER BY s.is_robot ASC, s.session_ip ASC";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not obtain guest/online information', '', __LINE__, __FILE__, $sql);
	}

	$prev_session_ip = '';
	$prev_is_robot = '';
	$rcount=0;

	while( $row = $db->sql_fetchrow($result) )
	{
		// Skip multiple sessions for one user
		if ( $row['session_ip'] != $prev_session_ip )
		{
                  $guests_online++;

			if ($row['is_robot'] != '0')
			{
				if ($row['is_robot'] != $prev_is_robot)
				{
			
					$row['is_robot'] = '<span style="color:#c2c2c2">' . $row['is_robot'] . '</span>';
					$online_userlist .= (($online_userlist!='') ? ', ' : '') . $row['is_robot'];
					$prev_is_robot = $row['is_robot'];
				}	
				else
				{
					$rcount++;	
				}
			}
		}

		$prev_session_ip = $row['session_ip'];
	}
---
Добавлено спустя 2 минуты 24 секунды:

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

..., Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, Yahoo Slurp, ....

а так Yahoo Slurp (57) :)

Вернуться в «Поддержка phpBB 2.0.x»