Вы здесь

Блок. Кто online

Версия системы: 
Друпал 5

Вот первопричина 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;
?>

Комментарии

Изображение пользователя Анонимно

Супер!

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

Изображение пользователя AQUADES

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

Изображение пользователя Анонимно

Вот код для шестёрки:

<?php
    $new_user_days
= 7; // Количество дней с момента регистрации, которые пользователь считается новичком
   
$max_users = 1000; // Максимальное количество отображаемых пользователей
   
$profile_birthday = 'profile_born'; // поле профиля отвечающего за дату рождения
 
   
$output = '';
 
         
// Count users active within the defined period.
         
$interval = time() - variable_get('user_block_seconds_online', 900);
 
         
// Perform database queries to gather online user lists.  We use s.timestamp
          // rather than u.access because it is much faster.
         
$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 = 0;
         
$max_users = variable_get('user_block_max_list_count', 10);
         
$items = array();
          while (
$account = db_fetch_object($authenticated_users)) {
            if (
$max_users > 0) {
             
$items[] = $account;
             
$max_users--;
            }
           
$authenticated_count++;
          }
 
         
// Format the output with proper grammar.
         
if ($anonymous_count == 1 && $authenticated_count == 1) {
           
$output = t('There is currently %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('There are currently %members and %visitors online.', array('%members' => format_plural($authenticated_count, '1 user', '@count users'), '%visitors' => format_plural($anonymous_count, '1 guest', '@count guests')));
          }
 
         
// Display a list of currently online users.
         
$max_users = variable_get('user_block_max_list_count', 10);
          if (
$authenticated_count && $max_users) {
           
$output .= theme('user_list', $items, t('Online users'));
          }
 
   
// Список новичков
   
$output .= '<div id="my_block_users_new">'."\n";
   
$new_user_result = db_query('SELECT u.uid, u.name, u.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_result($new_user_result) > 1) {
       
if (mysqli_num_rows($new_user_result) > 1) {
           
$output .= 'Приветствуем новых пользователей: <br/>';
        } 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('n');
   
$the_day = date('d');
   
$currentdayline = 'a:3:{s:3:"day";s:'.($the_day > 9 ? 2 : 1).':"'.$the_day.'";s:5:"month";s:'.($the_month > 9 ? 2 : 1).':"'.$the_month.'"';
   
$ifbirthday_users = db_query_range('SELECT DISTINCT pv.uid FROM {profile_values} pv INNER JOIN {profile_fields} pf ON pv.fid = pf.fid WHERE pf.name = "'.$profile_birthday.'" AND pv.value LIKE "%s%%"', $currentdayline,0,1);
   
$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_result($ifbirthday_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;
?>

Изображение пользователя Ne01eX

Версия для шестерки, вываливается ошибка в строке 48:

[quote]
warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, resource given in /var/www/lug.ru/includes/common.inc(1645) : eval()'d code on line 48.
[/quote]

В результате в блоке выводится строка приветствия новых пользователей в единственном числе. =(

Изображение пользователя Ne01eX

исправил подключение друпала к базе через mysqli все заработало. Сниппет зачетный, спасибо всем.

Изображение пользователя Dark

Благодарю за отличный сниппет!

Изображение пользователя UHSF

Нормальная тема)))