Список он-лайн зарегестрирвоанных юзеров на сайте

Главные вкладки

Аватар пользователя iNFerNo iNFerNo 25 марта 2011 в 15:45

В гугле нашел один вариант решения (не считая вьюху), но и он не удовлетворяет. Необходимо:

1. Вывод количества зарегистрированных в он-лайне
2. Список зарегистрированных через запятую в строчку друг за другом
3. Вывод новичков за последние N дней.
4. Вывод пика посещений сайта зарегистрированными юзерами в определенный интервал

Пробовал сам экспериментировать с кодом - не вышло.

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

    $output = '';

          $interval = time() - variable_get('user_block_seconds_online', 900);

          $anonymous_count = sess_count($interval);
          $authenticated_users = db_query('
SELECT
      u.uid,
      u.name,
      u.access
    FROM
      {users} u
    WHERE
      u.uid <> 0
    AND
      u.uid <> 1
    AND
      u.access > %d
    AND
      u.status = 1
    ORDER BY u.access DESC'
,
    (time() - 900)
  );

          $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++;
          }

          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";

    $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";

    // Вывод блока
    print $output;
?>

Комментарии

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 25 марта 2011 в 19:42
<?php
if (user_access('access content')) {
    
$new_user_days 7// Количество дней с момента регистрации, которые пользователь считается новичком
    
$max_users 1000// Максимальное количество отображаемых пользователей
    
$profile_birthday 'profile_born'// поле профиля отвечающего за дату рождения
    
$born_visible 'profile_born_visible'// поле профиля отвечающего за дату рождения

    

$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 (!isset(
$items[$account->uid])) { ///<<< доп. условие
              
if ($max_users 0) {
              
$items[$account->uid] = $account/// <<< было $items[], стало $items[$account->uid]
              
$max_users--;
              }
              
$authenticated_count++;
            }
          }

          

// Format the output with proper grammar.
          
if ($anonymous_count == && $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 .= '<div id="my_block_users_online">'."\n";
        
$i 0;
        foreach (
$items as $item) {
            if (
$i != 0) {$output .= ', ';}
            
$output .= theme('username'$item); 
        
$i++;
        }
            
$output .= '.';
        
$output .= '</div>'."\n";
          }

    

// Список новичков
    
$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(000date('m'), date('d') - $new_user_daysdate('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'] == || $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('j');
    
$currentdayline 'a:3:{s:3:"day";s:'.($the_day 1).':"'.$the_day.'";s:5:"month";s:'.($the_month 1).':"'.$the_month.'"';
    
$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_values} pvv ON u.uid = pvv.uid WHERE (pv.fid = "1" AND pv.value LIKE "%%%s%%") AND (pvv.fid = "7" AND pvv.value = "1") ORDER BY u.uid DESC'$currentdayline);
        
$mu $max_users;
        if (
$mu-- && $account db_fetch_object($birthday_users)) {
        
$output .= 'Поздравляем с Днём рождения: ';
        
$output .= ''.theme('username'$account);
        while (
$mu-- && $account db_fetch_object($birthday_users)) {
            
$output .= ', '.theme('username'$account);
        }
        
$output .= '.';
    }
    
$output .= '</div>'."\n"
   
    
// Вывод блока
    
print $output;

?>

Код когда-то взят из одной из коллекций со сниппетами и подправлен под себя. Показывает количество пользователей (зарегистрированных и гостей) на сайте, пик посещаемости, тех, кто родился в этот день. Работающий пример здесь: http://www.liverbird.ru

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 26 марта 2011 в 0:59

Я дал вам очень простой код, снабжённый неплохими комментариями. Попробуйте с ним поэкспериментировать. Если один раз просмотреть его внимательно, становится очевидно, где хранится пик, и что произойдёт, если убрать $anonymous_count.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 26 марта 2011 в 12:33

"us11" wrote:
ingumskydrupal.org не думали над тем, чтобы добавить кеширование ?

Думал, потому что сейчас ресурсы используются совсем нерационально. Проблема в том, что я плохой программист и не очень умелый друпаловод. В итоге склоняюсь к тому, чтобы вообще сделать такой блок через views. Ну и, разумеется, я не показываю его анонимам, чтобы лишний раз не гонять запросы к базе.

Аватар пользователя iNFerNo iNFerNo 26 марта 2011 в 22:28

По экспериментировал... все что можно с гостями по удалял... а счетчик все равно общую сумму выводит... от куда он их берет не понятно....