Add Last User Visit Date to User Profiles

Ответы на вопросы, связанные с модами для phpBB 2.0.x, кроме относящихся к форуму Для авторов (phpBB 2.0.x).
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Add Last User Visit Date to User Profiles

Сообщение VVVas »

Есть вот такой мод

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

##############################################################
# Title: Add Last User Visit Date to User Profiles
# Author: Thoul  thoul-phpbb@earthlink.net  http://www.phpbbsmith.com
# Description: Display the last time the user visited in their profile.
# Version: 1.1.0
Типа показывает дату и время последнего посещения пользователем форума в профиле. Но на самом деле показывает дату и время предпоследнего посещения.

Вот собственно откуда берется дата последнего посещения

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

#-----[ OPEN ]------------------------------------------ 
# 
includes/usercp_viewprofile.php

#
#-----[ FIND ]------------------------------------------ 
#
$posts_per_day = $profiledata['user_posts'] / $memberdays;

#
#-----[ AFTER, ADD ]------------------------------------------ 
#
// Add Last User Visit Date to User Profiles - Begin Code Addition
$last_visit_time = (!empty($profiledata['user_lastvisit'])) ? create_date($board_config['default_dateformat'], $profiledata['user_lastvisit'], $board_config['board_timezone']) : $lang['Never'];
// Add Last User Visit Date to User Profiles - End Code Addition

Сие можно как-нить поправить? Или посоветуйте что-нибудь с аналогичной функциональностью.

Добавлено спустя 6 минут 25 секунд:

Мод Last Visit не предлагать: мне нужно только дата последнего посещения и только в профиле пользователя.

Добавлено спустя 7 минут 38 секунд:

Всем спасибо. Всё оказалось гораздо проще. Посмотрел внимательно базу и стал выдирать user_session_time. Ещё раз всем спасибо.

Если где накосячил и это вызовет у меня глюки - напишите пожалуйста.
я люблю daft punk | новый sugoi.ru
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
Сообщения: 1464
Стаж: 20 лет 3 месяца
Откуда: Novosibirsk,RU

Сообщение [R: R@m$e$ :U] »

VVVas
хм... а почему же дату предпоследнего посещения показывает? он показывает дату последнего посещения, не считая этого =) аналогично строке "Ваше последнее посещение..." на главной...
Руководство пользователя | FAQ | Правила | Как устанавливать MOD'ы
ВОСПОЛЬЗУЙСЯ ПОИСКОМ, ТАМ ЕСТЬ БОЛЬШИНСТВО ОТВЕТОВ
ЕСЛИ НЕ ПОМОГЛО, ИСПОЛЬЗУЙ ШАБЛОН ЗАПРОСА, ПОМОГИ В РЕШЕНИИ ЗАДАЧИ
БЕСПЛАТНО ПОМОГУ ТОЛЬКО НА ФОРУМЕ!!! (ЛС НЕ В СЧЕТ)

Оставь благодарность, подтверди работоспособность совета.

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

[R: R@m$e$ :U] писал(а):аналогично строке "Ваше последнее посещение..." на главной...
Только обрати внимание, что в этой строке показывается предпоследнее посещение, потому что последнее идет сейчас.

Как я понял значение user_lastvisit обновляется при подлогинивании значением user_session_time. А в этот момент user_session_time начинает синхронизироваться с текущим временем и делает это до момента отлогинивания (окончания сессиии).

Или нет? Вообщем логику системы я понял примерно так. А user_lastvisit показывает именно предпоследнее посещение.
я люблю daft punk | новый sugoi.ru
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
Сообщения: 1464
Стаж: 20 лет 3 месяца
Откуда: Novosibirsk,RU

Сообщение [R: R@m$e$ :U] »

VVVas
хм... ну принцип работы ты понял верно =) обновление этого поля происходит при создании сессии... =) она в свою очередь создается при входе(неважно авто это или через форму) =)
хм.... =) пожалуй ты прав... =) надо бы оформить в виде мода... =) сделаешь? =)
Руководство пользователя | FAQ | Правила | Как устанавливать MOD'ы
ВОСПОЛЬЗУЙСЯ ПОИСКОМ, ТАМ ЕСТЬ БОЛЬШИНСТВО ОТВЕТОВ
ЕСЛИ НЕ ПОМОГЛО, ИСПОЛЬЗУЙ ШАБЛОН ЗАПРОСА, ПОМОГИ В РЕШЕНИИ ЗАДАЧИ
БЕСПЛАТНО ПОМОГУ ТОЛЬКО НА ФОРУМЕ!!! (ЛС НЕ В СЧЕТ)

Оставь благодарность, подтверди работоспособность совета.

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

Подожди, сегоня вечером попримучиваю неотображение если у пользователя стоит "Скрывать мое пребывание на форуме", и отображение для админа. А то там этого нет.
я люблю daft punk | новый sugoi.ru
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

что-то вроде этого

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

#
#--- [ OPEN ] ---
#
includes/usercp_viewprofile.php

#
#--- [ FIND ] ----
#
$template->assign_vars(array(
	'USERNAME' => $profiledata['username'],
	'JOINED' => create_date($lang['DATE_FORMAT'], $profiledata['user_regdate'], $board_config['board_timezone']),

#
#--- [ ADD BEFORE ] ---
#
$user_last_visit = 0;
if ( $userdata['user_level'] == ADMIN || $profiledata['user_level'] != ADMIN 
&& ( $userdata['user_level'] == ADMIN || $userdata['username'] == $profiledata['username'] || $profiledata['user_allow_viewonline'] ) ) {
	$user_last_visit = max($profiledata['session_time'], $profiledata['user_lastvisit'], $profiledata['user_session_time']);
	//$user_last_visit = max(array($profiledata['session_time'], $profiledata['user_lastvisit'], $profiledata['user_session_time']));
}

#
#--- [ FIND ] ----
#
$template->assign_vars(array(
	'USERNAME' => $profiledata['username'],
	'JOINED' => create_date($lang['DATE_FORMAT'], $profiledata['user_regdate'], $board_config['board_timezone']),

#
#--- [ AFTER ADD ] ----
#
	'L_LASTVISIT' => $lang['datetime']['Last_visit'],
	'LASTVISIT' => $user_last_visit ? create_date($lang['DATE_FORMAT'], $user_last_visit, $board_config['board_timezone']) : $lang['datetime']['Unknown'],

#
#--- [ OPEN ] ----
#
templates/subSilver/profile_view_body.tpl
 
#
#--- [ FIND ] ---
#
	<tr> 
		<td valign="middle" align="right" nowrap="nowrap"><span class="gen">{L_JOINED}:&nbsp;</span></td>
		<td width="100%"><b><span class="gen">{JOINED}</span></b></td>
	</tr>

#
#--- [ ADD AFTER ] ---
#
	<tr> 
		<td valign="middle" align="right" nowrap="nowrap"><span class="gen">{L_LASTVISIT}:&nbsp;</span></td>
		<td width="100%"><b><span class="gen">{LASTVISIT}</span></b></td>
	</tr>

#
#--- [ OPEN ] ---
#
language/lang_english/lang_main.php 

#
#--- [ FIND ] ---
#
$lang['datetime']['Dec'] = 'Dec';

#
#--- [ ADD AFTER ] ---
#
$lang['datetime']['Last_visit'] = 'Last visit ';
$lang['datetime']['Unknown'] = 'Unknown';
если мне не изменяет память, то в includes/function.php
функция get_userdata должна использовать такой запрос

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

"SELECT u.*
FROM " . USERS_TABLE . " u
WHERE $_user
AND u.user_id <> " . ANONYMOUS;
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

quazi
quazi писал(а):$user_last_visit = max($profiledata['session_time'], $profiledata['user_lastvisit'], $profiledata['user_session_time']);
Можно попросить пояснить вот эту строку?

Вроде известно, что user_session_time всегда меньше, чем user_lastvisit, в крайнем случае в какой-то момент они равны. Зачем выбирать из них наибольшее? А вот что такое session_time я пока не знаю, можете пояснить?

Добавлено спустя 1 минуту 25 секунд:

Вернее даже не заметил в phpbb_users поля session_time. Подскажите что это и откуда получается, пожалуйста?

Добавлено спустя 5 минут 13 секунд:

Посмотрел ваш Users of day - session_time берется из таблицы сессий.
Но все же поясните, пожалуйста, почему нельзя использовать просто user_session_time?
я люблю daft punk | новый sugoi.ru
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

VVVas, спасибо за ваши замечания. уже не первый раз указываете на мои неточности. вот кусок из includes/functions.php моего работавшего форума.
работает но черезчур избыточен

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

function get_userdata($user, $force_str = false)
{
	global $db, $userdata;

	// +Update to 2.0.17
	//if (intval($user) == 0 || $force_str)
	if (!is_numeric($user) || $force_str)
	// -Update to 2.0.17
	{
		$user = phpbb_clean_username($user);
	}
	else
	{
		$user = intval($user);
	}

	//
	// GET LAST VISIT IN PROFILE
	//
	/*
	$sql = "SELECT u.*
		FROM " . USERS_TABLE . " u
		WHERE ";
	$sql .= ( ( is_integer($user) ) ? "u.user_id = $user" : "u.username = '" . $user . "'" );
	$sql .= " AND u.user_id <> " . ANONYMOUS;
	*/

	$_user = ( is_integer($user) ) ? "u.user_id = $user" : "u.username = '" . $user . "'";
	if ( 1 )
	{
		$sql = "SELECT u.*
			FROM " . USERS_TABLE . " u
			WHERE $_user
			AND u.user_id <> " . ANONYMOUS;
	}
	else
	{
		$sql = "SELECT u.*, s.session_time
			FROM " . USERS_TABLE . " u
			LEFT JOIN " . SESSIONS_TABLE . " s ON u.user_id = s.session_user_id
			WHERE $_user
			AND u.user_id <> " . ANONYMOUS . "
			ORDER BY s.session_time DESC 
			LIMIT 0, 1";
	}

	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Tried obtaining data for a non-existent user', '', __LINE__, __FILE__, $sql);
	}
	$row = $db->sql_fetchrow($result);
	if ( !isset($row['session_time']) )
	{
		$row['session_time'] = 0;
	}

	if ($row && $row['user_level'] == ADMIN && $userdata['user_level'] != ADMIN)
	{
		$row['session_time'] = false;
	}

	return ( $row ) ? $row : false;
	//
	// End of GET LAST VISIT IN PROFILE
	//
}
конечно же все это мои эксперименты - проверял варианты когда пользователь пришел, залогинился и ушел, пришел и не разлогинился. с тех времен и осталось

ваш вопрос правильный - а мой ответ на него: убрать $profiledata['session_time']

Добавлено спустя 1 минуту 21 секунду:

ну и как резюме - функция должна быть

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

function get_userdata($user, $force_str = false)
{
   global $db, $userdata;

   if (!is_numeric($user) || $force_str)
   {
      $user = phpbb_clean_username($user);
   }
   else
   {
      $user = intval($user);
   }
   //
   // GET LAST VISIT IN PROFILE
   //
   $_user = ( is_integer($user) ) ? "u.user_id = $user" : "u.username = '" . $user . "'";
   $sql = "SELECT u.*
         FROM " . USERS_TABLE . " u
         WHERE $_user
         AND u.user_id <> " . ANONYMOUS;

   if ( !($result = $db->sql_query($sql)) )
   {
      message_die(GENERAL_ERROR, 'Tried obtaining data for a non-existent user', '', __LINE__, __FILE__, $sql);
   }
   $row = $db->sql_fetchrow($result);
   return ( $row ) ? $row : false;
   //
   // End of GET LAST VISIT IN PROFILE
   //
}
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

quazi
Код посмотрел. Но всё равно не могу понять почему нельзя использовать user_session_time.
То есть почему Вы предпочитаете session_time из таблицы сессий для пользователя, а не user_session_time?
я люблю daft punk | новый sugoi.ru
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

VVVas писал(а):предпочитаете session_time из таблицы сессий для пользователя, а не user_session_time?
я не предпочитаю. просто иногда эти данные расходятся, поэтому я использовал их совместно
я уже не помню - почему. может быть по причине того, что
если юзер отлогинился, то поле phpbb_user.user_session_time обнуляется, но в phpbb_sessions.session_time время сохраняется

я же говорю это были эксперименты. не берите в голову. достаточно простого запроса из таблицы пользователей без LEFT JOIN с таблицей сессий

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

мне необходимо было знать время последнего пребывания юзера. лучшее это взять максимальное значение из phpbb_users.user_lastvisit, phpbb_users.user_session_time и phpbb_sessions.session_time. видимо третье поле оказалось избыточным, но для совместимости я его сохранил
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

quazi писал(а):то поле phpbb_user.user_session_time обнуляется
У меня не обнуляется. Ну да ладно. Как начну учит php тогда поразбираюсь.

Спасибо.
я люблю daft punk | новый sugoi.ru
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

VVVas писал(а):не обнуляется
сам уже не помню. при отлогинивании одно из сессионных полей обнуляется
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

quazi
Спасибо большое. Я сделал так как хотел.
Однако вы сильно прячущийся админ, quazi. Сделали чтоб про админа никто ничего не знал и везде так делаете :wink:

Так же спасибо the_ghost за маленькие подсказки относительно логических И и ИЛИ.

В итоге имею условие

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

// Add Last User Visit Date to User Profiles - Begin Code Addition
if ( $userdata['user_level'] == ADMIN || $userdata['user_level'] == MOD || $userdata['username'] == $profiledata['username'] || $profiledata['user_allow_viewonline'] ) 
{ 
	$last_visit_time = (!empty($profiledata['user_session_time'])) ? create_date($board_config['default_dateformat'], $profiledata['user_session_time'], $board_config['board_timezone']) : $lang['Never'];
}
else
{ 
	$last_visit_time = (!empty($profiledata['user_session_time'])) ? $lang['Hidden'] : $lang['Never']; 
}  
// Add Last User Visit Date to User Profiles - End Code Addition
Правда я тут модерам ещё разрешил подглядывать, ну и lang['Hidden'] ввел.

Всем огромное спасибо ещё раз.
я люблю daft punk | новый sugoi.ru
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 20 лет 1 месяц

Сообщение quazi »

VVVas, да не за что
VVVas писал(а):сильно прячущийся админ
был. не всегда необходимо видеть присутствие админа на форуме
вообще-то эту фичу надо управлять из админки

оффтоп
в последние полгода я не занимаюсь форумом так как мне
1. не нравятся многие вещи в самом движке (хотя в целом форум мне нравится). а переделывать нет ни желания, ни времени
2. с некоторой периодичностью появляющиеся дыры и "дыры"
3. многие особенности требуют большей гибкости и управляемости, которая отсутствует, а делать - см. предложение 2 из п.1
Аватара пользователя
VVVas
Former team member
Сообщения: 4463
Стаж: 20 лет 5 месяцев
Поблагодарили: 1 раз

Сообщение VVVas »

quazi писал(а):был
Не суть. Я в более широком смысле, что ли принцип у вас такой, что админ должен быть не виден, как у меня например, что админ должен быть один.

Ещё раз спасибо.
я люблю daft punk | новый sugoi.ru

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