Add Last User Visit Date to User Profiles

Поддержка старых модов или модов, созданных авторами не из нашего сообщества, а также любые вопросы, связанные с модами для phpBB 2.0.x, кроме относящихся к форуму Для авторов (phpBB 2.0.x).
Правила форума
Если на ваш вопрос есть ответы по ниже следующим ссылкам, ваш пост удаляется без объяснения причин!!!
А вы рискуете получить предупреждение или бан (в зависимости от настроения модератора).


Местная Конституция | Шаблон запроса | Документация (phpBB3) | FAQ-2 (phpbb2) | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Add Last User Visit Date to User Profiles

Сообщение VVVas 11.10.2005 2:08

Есть вот такой мод
Код: Выделить всё
##############################################################
# 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 | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK


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

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

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

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
 
Сообщения: 1503
Зарегистрирован: 16.01.2005 13:04
Откуда: Novosibirsk,RU

Сообщение VVVas 11.10.2005 7:24

[R: R@m$e$ :U] писал(а):аналогично строке "Ваше последнее посещение..." на главной...

Только обрати внимание, что в этой строке показывается предпоследнее посещение, потому что последнее идет сейчас.

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

Или нет? Вообщем логику системы я понял примерно так. А user_lastvisit показывает именно предпоследнее посещение.
вы нарушили правила конференции, объяснений не будет - сами читайте правила
я люблю daft punk | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

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

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

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

ВСЕ ПРАВА НА МОДЫ ОТДАНЫ m157y
Аватара пользователя
[R: R@m$e$ :U]
phpBB Maniac
 
Сообщения: 1503
Зарегистрирован: 16.01.2005 13:04
Откуда: Novosibirsk,RU

Сообщение VVVas 11.10.2005 9:46

Подожди, сегоня вечером попримучиваю неотображение если у пользователя стоит "Скрывать мое пребывание на форуме", и отображение для админа. А то там этого нет.
вы нарушили правила конференции, объяснений не будет - сами читайте правила
я люблю daft punk | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

Сообщение quazi 11.10.2005 11:23

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

Код: Выделить всё
#
#--- [ 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;
quazi
phpBB 2.0.8
 
Сообщения: 310
Зарегистрирован: 15.03.2005 18:49

Сообщение VVVas 11.10.2005 19:30

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 | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

Сообщение quazi 11.10.2005 19:49

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
   //
}
quazi
phpBB 2.0.8
 
Сообщения: 310
Зарегистрирован: 15.03.2005 18:49

Сообщение VVVas 11.10.2005 19:52

quazi
Код посмотрел. Но всё равно не могу понять почему нельзя использовать user_session_time.
То есть почему Вы предпочитаете session_time из таблицы сессий для пользователя, а не user_session_time?
вы нарушили правила конференции, объяснений не будет - сами читайте правила
я люблю daft punk | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

Сообщение quazi 11.10.2005 20:06

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. видимо третье поле оказалось избыточным, но для совместимости я его сохранил
quazi
phpBB 2.0.8
 
Сообщения: 310
Зарегистрирован: 15.03.2005 18:49

Сообщение VVVas 11.10.2005 20:06

quazi писал(а):то поле phpbb_user.user_session_time обнуляется

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

Спасибо.
вы нарушили правила конференции, объяснений не будет - сами читайте правила
я люблю daft punk | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

Сообщение quazi 11.10.2005 20:12

VVVas писал(а):не обнуляется

сам уже не помню. при отлогинивании одно из сессионных полей обнуляется
quazi
phpBB 2.0.8
 
Сообщения: 310
Зарегистрирован: 15.03.2005 18:49

Сообщение VVVas 12.10.2005 1:27

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 | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

Сообщение quazi 12.10.2005 1:44

VVVas, да не за что
VVVas писал(а):сильно прячущийся админ

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

оффтоп
в последние полгода я не занимаюсь форумом так как мне
1. не нравятся многие вещи в самом движке (хотя в целом форум мне нравится). а переделывать нет ни желания, ни времени
2. с некоторой периодичностью появляющиеся дыры и "дыры"
3. многие особенности требуют большей гибкости и управляемости, которая отсутствует, а делать - см. предложение 2 из п.1
quazi
phpBB 2.0.8
 
Сообщения: 310
Зарегистрирован: 15.03.2005 18:49

Сообщение VVVas 12.10.2005 1:59

quazi писал(а):был

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

Ещё раз спасибо.
вы нарушили правила конференции, объяснений не будет - сами читайте правила
я люблю daft punk | Активные темы
Аватара пользователя
VVVas
Люмпен Пролетариат
 
Сообщения: 4553
Зарегистрирован: 12.11.2004 0:20
Откуда: RU-MSK

След.


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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1