Блок. Кто online


Автор документа

Имя
Сергей

Сайт
http://sergey.vilgelm.googlepages.com/

Вот первопричина http://www.drupal.ru/node/10510. Отображает у кого сегодня день рождения, поле профиля отвечающее за день рождения храниться в переменной $profile_birthday.

Для отслеживания максимального нашествия используется drupal переменная user_online_max, т.е. она инициализируется при первом выводе блока и только с этого момента начнет отслеживать. Также добавил возможность ограничения показа новых пользователей, по дате регистрации (например не больше недели)

1 пользователь и 0 гостей.
Separator.
Приветствуем новых пользователей: maxim_beifert, Мари.
Рекорд одновременного пребывания 4, это было 30.12.2007 в 01:00.

<?php
    $new_user_days
= 7; // Количество дней с момента регистрации, которые пользователь считается новичком
   
$max_users = 1000; // Максимальное количество отображаемых пользователей
   
$profile_birthday = 'profile_birthday'; // поле профиля отвечающего за дату рождения

   
$output = '';
   
   
// Количество online пользователей и гостей, список пользователей
   
$interval = time() - 900; // 900 - время в секундах для определения онлайн времени
   
$anonymous_count = sess_count($interval);
   
$authenticated_users = db_query('SELECT DISTINCT u.uid, u.name, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 ORDER BY s.timestamp DESC', $interval);
   
$authenticated_count = db_num_rows($authenticated_users);
    if (
$anonymous_count == 1 && $authenticated_count == 1)
       
$output .= t('%members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', '@count users'), '%visitors' => format_plural($anonymous_count, '1 guest', '@count guests')));
    else
       
$output .= t('%members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', '@count users'), '%visitors' => format_plural($anonymous_count, '1 guest', '@count guests')));
   
$output .=  '<div id="my_block_users_online">'."\n";
    if (
$authenticated_count && $max_users) {
       
$items = array();
       
$mu = $max_users;
        if (
$mu-- && $account = db_fetch_object($authenticated_users)) {
           
$output .= theme('username', $account);
            while (
$mu-- && $account = db_fetch_object($authenticated_users)) {
               
$output .= ', '.theme('username', $account);
            }
           
$output .= '.';
        }
    }
   
$output .= '</div>'."\n";

   
// Список новичков
   
$output .= '<div id="my_block_users_new">'."\n";
   
$new_user_result = db_query('
                                SELECT
                                    u.uid,
                                    u.name,
                                    created
                                FROM
                                    {users} u
                                WHERE
                                    u.status != 0
                                    AND    u.access != 0
                                    AND    u.uid != 1
                                    AND u.created >= '
.mktime(0, 0, 0, date('m'), date('d') - $new_user_days, date('Y')).'
                                ORDER BY
                                    u.created DESC
                                '
);
   
$mu = $max_users;
    if (
$mu-- && $account = db_fetch_object($new_user_result)) {
        if (
db_num_rows($new_user_result) > 1) {
           
$output .= 'Приветствуем новых пользователей: ';
        } else {
           
$output .= 'Приветствуем нового пользователя: ';
        }
       
$output .= theme('username', $account);
        while (
$mu-- && $account = db_fetch_object($new_user_result)) {
           
$output .= ', '.theme('username', $account);
        }
       
$output .= '.';
    }
    if (
$new_user->uid && $new_user) {
    }
   
$output .= '</div>'."\n";

   
// Максимальное нашествие online пользователей
   
$output .= '<div id="my_block_users_maximum">'."\n";
   
$umax = variable_get('user_online_max', array('count' => 0, 'date' => '0'));
    if (
$umax['count'] == 0 || $umax['count'] <= ($authenticated_count + $anonymous_count)) {
       
$umax['count'] = $authenticated_count + $anonymous_count;
       
$umax['date'] = time();
       
variable_set('user_online_max', $umax);
    }
   
$output .= 'Рекорд одновременного пребывания <strong>'.$umax['count'].'</strong>, это было <span class="date">'.format_date($umax['date'], 'custom', 'd.m.Y в H:i', NULL).'</span>.';
   
$output .= '</div>'."\n";


   
// Список пользователей празднующих сегодня день рождения
   
$output .= '<div id="my_block_users_birthday">'."\n";
   
$the_month = date('m');
   
$the_day = date('d');
   
$currentdayline = 'a:3:{s:5:"month";s:'.($the_month > 9 ? 2 : 1).':"'.$the_month.'";s:3:"day";s:'.($the_day > 9 ? 2 : 1).':"'.$the_day.'"';
   
$birthday_users = db_query('SELECT DISTINCT u.uid, u.name FROM {users} u INNER JOIN {profile_values} pv ON u.uid = pv.uid INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%" ORDER BY u.uid DESC', $currentdayline);
   
$birthday_count = db_num_rows($birthday_users);
    if (
$birthday_count) {
       
$output .= 'Сегодня отмечают день рождение: ';
       
$mu = $max_users;
        if (
$mu-- && $account = db_fetch_object($birthday_users)) {
           
$output .= theme('username', $account);
            while (
$mu-- && $account = db_fetch_object($birthday_users)) {
               
$output .= ', '.theme('username', $account);
            }
           
$output .= '.';
        }
    }
   
$output .= '</div>'."\n";
   
   
// Вывод блока
   
print $output;
?>

Comments

Супер!

Вот это действительно работа, заслуживающая похвалы!

Спасибо. Очень полезный сниппет, но есть одно "НО". У меня не работает тот самый отрезок, отвечающий за определение именинников. Подозреваю, что проблема в запросе к базе, т.к. "День рождения" (profile_user_born) у меня созданное дополнительное поле в профиле и по этому запросу не видно.
Собственно вот $profile_birthday = 'profile_user_born'; // поле профиля отвечающего за дату рождения
Как мне подскажите быть? Спасибо.

Post new comment

The content of this field is kept private and will not be shown publicly.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.