Дорабатываем стену: онлайн-статус пользователя и устройство, с которого он вошел

Вот захотелось нам отображать, онлайн сейчас человек или нет. Особо сложного здесь ничего не будет (хотя мне сейчас пришла мысль сделать это с использованием какой-нибудь noSQL базы данных, и вам для расширения кругозора, и вообще так, пожалуй, лучше для конкретно этой задачи было бы, но наверное уже в следующем уроке). Здесь я использую наработки из прошлых статей, поэтому чтобы не тратить время и место на странице, просто опишу, чего добавилось нового.

Если вы читали предыдущую мою писанину, то помните, что у пользователей есть стены, а особо развитые представители позвоночных хордовых млекопитающих постят друг другу на стену, что они к тому же еще и гоминиды. Предположим, что одному это быстро надоело, и он решил не словом, а делом показать, кто тут выше всех по эволюционной лестнице поднялся, и купил себе iPont... упс, оговорочка, iPhone, - и хочет теперь, чтобы этот факт скромно отображался на его странице.

Что ж, задача поставлена - погнали!

Первое: я добавил простейшую авторизацию (ну там разберетесь сами, файл login.php) - она нам нужна, чтобы помечать данные пользователя: когда он вошел и через какое устройство.
Велосипед я изобретать не стал, использовал бесплатную библиотеку MobileDetect, там есть и примеры, и ссылка на скачивание. И пользоваться ей очень просто: создаете объект этого класса и используете функции isMobile(), isTablet(), isAndroidOs(), isIOs() и прочие. Даже планшет PlayStation можно определить.

Второе: добавил в БД в таблицу users поля last_activity и last_login_device.

ALTER TABLE `users`
ADD COLUMN `last_activity` INT UNSIGNED NULL AFTER `name`,
ADD COLUMN `last_login_device` TINYINT UNSIGNED NULL AFTER `last_activity`;

Решил помечать так - телефон Android = 1, iPhone = 2, Windows = 3, остальные мобилы = 4, 0 или null = компьютер.
К слову, дамп базы можно скачать вместе с кодом здесь.

Если пользователь ввел авторизационные данные верно, то определяем устройство и вносим его вместе timestamp-ом в базу данных следующим образом.

require_once 'classes/Mobile_Detect.php';
$detect = new Mobile_Detect;
// определяем тип устройства и операционку: пусть телефон Android = 1, iPhone = 2, Windows = 3, остальные = 4, 0 или пусто = компьютер
$deviceType = 0;
if ( $detect->isMobile() ) {
  if ( $detect->isIOs() ) {
    $deviceType = 2;
  }
  elseif ( $detect->isAndroidOs() ) {
    $deviceType = 1;
  }
  elseif ( $detect->isWindowsOs() ) {
    $deviceType = 3;
  }
  else {
    $deviceType = 4;
  }
}
 
$cnt->query("UPDATE `users` SET `last_activity` = ". time() .", `last_login_device` = {$deviceType} WHERE `id` = {$row['id']}");
 
header('Location: index.php');
exit;

Ну и редирект на главную страницу.

Дело за малым - отобразить все это на стене пользователя. Открываем index.php - вверху я немного изменил код, чтобы учесть авторизацию. JavaScript код и CSS-ы остались прежними, а чуть ниже я добавил следующее:

<h2>Сейчас вы на стене пользователя <?=$userdata->name?></h2>
<p><?php
 
 if ( $userdata->last_login_device == 1 ) {
    ?><small>(Андроид)</small> <?php
 }
 elseif ( $userdata->last_login_device == 2 ) {
    ?><small>(Яблоко)</small> <?php
 }
 elseif ( $userdata->last_login_device == 3 ) {
    ?><small>(Уинда)</small> <?php
 }
 elseif ( $userdata->last_login_device == 4 ) {
    ?><small>(Нокия 3310)</small> <?php
 }
 
 /**
 * Далее смотрим: если последняя активность была более 10 минут (600 секунд) назад, то оффлайн
 * 
 * На самом деле эту активность стоило бы чаще обновлять в базе, например, когда человек отвечает на сообщение или заходит на свою стену (а не как у меня - только при логине), просто я слишком ленивый %)
 */
 if ( $userdata->last_activity >= time() - 600 ) {
    echo 'Сейчас на сайте';
 }
 else {
    echo 'Последний раз заходил '.date('d.m.Y в H:i', $userdata->last_activity);
 }
 
?></p>

Вот в общем-то и все. Код скачать можно здесь. Кстати на 217 строке удалите include, он уже подключается раньше, я только потом заметил.

Демо здесь. Логин vasya или petya, пароль hello.

Если есть вопросы, задавайте :)

 Жду с нетерпением
ваших комментариев!
 

Подписаться на RSS

Вы можете нажать "подписаться", чтобы следить за моими новостями!
Так вы всегда будете в курсе появления новостей на сайте =)
О том, что такое RSS можно прочитать здесь.

Подписаться

Подписаться на Twitter

Я специально зарегистрировался в Твиттере, чтобы вы могли следить за обновлениями на сайте =)

Подписаться

Envato marketplace А эти люди занимаются прокатом карнавальных костюмов и масок в Минске. К слову, я им делал сайт.