You are here

function user_block in Drupal 6

Same name and namespace in other branches
  1. 4 modules/user.module \user_block()
  2. 5 modules/user/user.module \user_block()

Implementation of hook_block().

File

modules/user/user.module, line 723
Enables the user registration and login system.

Code

function user_block($op = 'list', $delta = 0, $edit = array()) {
  global $user;
  if ($op == 'list') {
    $blocks[0]['info'] = t('User login');

    // Not worth caching.
    $blocks[0]['cache'] = BLOCK_NO_CACHE;
    $blocks[1]['info'] = t('Navigation');

    // Menu blocks can't be cached because each menu item can have
    // a custom access callback. menu.inc manages its own caching.
    $blocks[1]['cache'] = BLOCK_NO_CACHE;
    $blocks[2]['info'] = t('Who\'s new');

    // Too dynamic to cache.
    $blocks[3]['info'] = t('Who\'s online');
    $blocks[3]['cache'] = BLOCK_NO_CACHE;
    return $blocks;
  }
  else {
    if ($op == 'configure' && $delta == 2) {
      $form['user_block_whois_new_count'] = array(
        '#type' => 'select',
        '#title' => t('Number of users to display'),
        '#default_value' => variable_get('user_block_whois_new_count', 5),
        '#options' => drupal_map_assoc(array(
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
        )),
      );
      return $form;
    }
    else {
      if ($op == 'configure' && $delta == 3) {
        $period = drupal_map_assoc(array(
          30,
          60,
          120,
          180,
          300,
          600,
          900,
          1800,
          2700,
          3600,
          5400,
          7200,
          10800,
          21600,
          43200,
          86400,
        ), 'format_interval');
        $form['user_block_seconds_online'] = array(
          '#type' => 'select',
          '#title' => t('User activity'),
          '#default_value' => variable_get('user_block_seconds_online', 900),
          '#options' => $period,
          '#description' => t('A user is considered online for this long after they have last viewed a page.'),
        );
        $form['user_block_max_list_count'] = array(
          '#type' => 'select',
          '#title' => t('User list length'),
          '#default_value' => variable_get('user_block_max_list_count', 10),
          '#options' => drupal_map_assoc(array(
            0,
            5,
            10,
            15,
            20,
            25,
            30,
            40,
            50,
            75,
            100,
          )),
          '#description' => t('Maximum number of currently online users to display.'),
        );
        return $form;
      }
      else {
        if ($op == 'save' && $delta == 2) {
          variable_set('user_block_whois_new_count', $edit['user_block_whois_new_count']);
        }
        else {
          if ($op == 'save' && $delta == 3) {
            variable_set('user_block_seconds_online', $edit['user_block_seconds_online']);
            variable_set('user_block_max_list_count', $edit['user_block_max_list_count']);
          }
          else {
            if ($op == 'view') {
              $block = array();
              switch ($delta) {
                case 0:

                  // For usability's sake, avoid showing two login forms on one page.
                  if (!$user->uid && !(arg(0) == 'user' && !is_numeric(arg(1)))) {
                    $block['subject'] = t('User login');
                    $block['content'] = drupal_get_form('user_login_block');
                  }
                  return $block;
                case 1:
                  if ($menu = menu_tree()) {
                    $block['subject'] = $user->uid ? check_plain($user->name) : t('Navigation');
                    $block['content'] = $menu;
                  }
                  return $block;
                case 2:
                  if (user_access('access content')) {

                    // Retrieve a list of new users who have subsequently accessed the site successfully.
                    $result = db_query_range('SELECT uid, name FROM {users} WHERE status != 0 AND access != 0 ORDER BY created DESC', 0, variable_get('user_block_whois_new_count', 5));
                    while ($account = db_fetch_object($result)) {
                      $items[] = $account;
                    }
                    $output = theme('user_list', $items);
                    $block['subject'] = t('Who\'s new');
                    $block['content'] = $output;
                  }
                  return $block;
                case 3:
                  if (user_access('access content')) {

                    // 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_count = db_result(db_query('SELECT COUNT(DISTINCT s.uid) FROM {sessions} s WHERE s.timestamp >= %d AND s.uid > 0', $interval));

                    // 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) {
                      $authenticated_users = db_query_range('SELECT u.uid, u.name, MAX(s.timestamp) AS timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= %d AND s.uid > 0 GROUP BY u.uid, u.name ORDER BY s.timestamp DESC', $interval, 0, $max_users);
                      while ($account = db_fetch_object($authenticated_users)) {
                        $items[] = $account;
                      }
                      $output .= theme('user_list', $items, t('Online users'));
                    }
                    $block['subject'] = t('Who\'s online');
                    $block['content'] = $output;
                  }
                  return $block;
              }
            }
          }
        }
      }
    }
  }
}