You are here

function user_block in Drupal 4

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

Implementation of hook_block().

File

modules/user.module, line 525
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');
    $blocks[1]['info'] = t('Navigation');
    $blocks[2]['info'] = t('Who\'s new');
    $blocks[3]['info'] = t('Who\'s online');
    return $blocks;
  }
  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 == 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)))) {
                $form['#action'] = url($_GET['q'], drupal_get_destination());
                $form['#id'] = 'user-login-form';
                $form['name'] = array(
                  '#type' => 'textfield',
                  '#title' => t('Username'),
                  '#maxlength' => 60,
                  '#size' => 15,
                  '#required' => TRUE,
                );
                $form['pass'] = array(
                  '#type' => 'password',
                  '#title' => t('Password'),
                  '#maxlength' => 60,
                  '#size' => 15,
                  '#required' => TRUE,
                );
                $form['submit'] = array(
                  '#type' => 'submit',
                  '#value' => t('Log in'),
                );
                if (variable_get('user_register', 1)) {
                  $items[] = l(t('Create new account'), 'user/register', array(
                    'title' => t('Create a new user account.'),
                  ));
                }
                $items[] = l(t('Request new password'), 'user/password', array(
                  'title' => t('Request new password via e-mail.'),
                ));
                $form['links'] = array(
                  '#value' => theme('item_list', $items),
                );
                $block['subject'] = t('User login');
                $block['content'] = drupal_get_form('user_login_block', $form, 'user_login');
              }
              return $block;
            case 1:
              if ($menu = theme('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, 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 with activity in the past defined period.
                $time_period = variable_get('user_block_seconds_online', 900);

                // Perform database queries to gather online user lists.
                $guests = db_fetch_object(db_query('SELECT COUNT(sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
                $users = db_query('SELECT uid, name, access FROM {users} WHERE access >= %d AND uid != 0 ORDER BY access DESC', time() - $time_period);
                $total_users = db_num_rows($users);

                // Format the output with proper grammar.
                if ($total_users == 1 && $guests->count == 1) {
                  $output = t('There is currently %members and %visitors online.', array(
                    '%members' => format_plural($total_users, '1 user', '%count users'),
                    '%visitors' => format_plural($guests->count, '1 guest', '%count guests'),
                  ));
                }
                else {
                  $output = t('There are currently %members and %visitors online.', array(
                    '%members' => format_plural($total_users, '1 user', '%count users'),
                    '%visitors' => format_plural($guests->count, '1 guest', '%count guests'),
                  ));
                }

                // Display a list of currently online users.
                $max_users = variable_get('user_block_max_list_count', 10);
                if ($total_users && $max_users) {
                  $items = array();
                  while ($max_users-- && ($account = db_fetch_object($users))) {
                    $items[] = $account;
                  }
                  $output .= theme('user_list', $items, t('Online users'));
                }
                $block['subject'] = t('Who\'s online');
                $block['content'] = $output;
              }
              return $block;
          }
        }
      }
    }
  }
}