You are here

remember_me.module in Remember me 5

Same filename and directory in other branches
  1. 5.2 remember_me.module
  2. 6.2 remember_me.module
  3. 7 remember_me.module

Puts a "Remember me" checkbox to login forms.

@todo User object data field will have 'remember_me' key forever after you disable the module.

File

remember_me.module
View source
<?php

/**
 * @file
 * Puts a "Remember me" checkbox to login forms.
 *
 * @todo
 *   User object data field will have 'remember_me' key forever after you
 *   disable the module.
 */

/**
 * Implementation of hook_init().
 */
function remember_me_init() {
  global $user;

  // If we have user logged in, then we have session started.
  if ($user->uid) {

    // Get the cookie life time.
    $cookie_lifetime = ini_get('session.cookie_lifetime');
    if ($user->remember_me) {

      // If we have no cookie life time set already then set it.
      if (0 == $cookie_lifetime) {
        _remember_me_set_lifetime(2000000);
      }
    }
    else {

      // If we have cookie life time set already then unset it.
      if (0 != $cookie_lifetime) {
        _remember_me_set_lifetime(0);
      }
    }
  }
}

/**
 * remember_me_init() callback helper function.
 */
function _remember_me_set_lifetime($cookie_lifetime) {

  // We have session started.
  // We need to commit it, change php variable, and start session again.
  session_write_close();
  ini_set('session.cookie_lifetime', $cookie_lifetime);

  // Use remember_me_sess_read() to avoid reloading of user object, because
  // it might be once more reloaded in some other hook_init().
  session_set_save_handler("sess_open", "sess_close", "remember_me_sess_read", "sess_write", "sess_destroy_sid", "sess_gc");
  session_start();
}

/**
 * Session handler 'read' callback.
 */
function remember_me_sess_read() {
  global $user;
  static $run = FALSE;
  if (!$run) {
    $run = TRUE;
    return !empty($user->session) ? $user->session : '';
  }
  $args = func_get_args();
  return call_user_func_array('sess_read', $args);
}

/**
 * Implementation of hook_user().
 */
function remember_me_user($type, &$edit, &$user, $category = NULL) {
  if (NULL === $category && 'login' == $type) {
    $remember_me = isset($edit['remember_me']) ? $edit['remember_me'] : NULL;
    if (isset($remember_me)) {
      if (!$remember_me) {
        ini_set('session.cookie_lifetime', '0');
      }
      else {

        // 2000000 is ~23 days. This value is in basic Drupal settings.
        ini_set('session.cookie_lifetime', 2000000);
      }
      if ($user->uid) {
        $user = user_save($user, array(
          'remember_me' => (bool) $remember_me,
        ), NULL);
      }
    }
  }
}

/**
 * Implementation of hook_form_alter().
 */
function remember_me_form_alter($form_id, &$form) {
  $user_login_forms = array(
    'user_login',
    'user_login_block',
  );
  if (in_array($form_id, $user_login_forms)) {

    // Try to insert 'Remember me' checkbox between 'Username', 'Password' and
    // 'Log in' form elements.
    $form1['remember_me'] = array(
      '#title' => t('Remember me'),
      '#type' => 'checkbox',
    );
    _remember_me_array_insert_after_key('pass', $form, $form1);
  }
}

/**
 * Insert elements into array after the element with $searck_key key and
 * maintain index association.
 *
 * @param $search_key
 *   Key of array element to insert elements after.
 * @param $array
 *   Given array.
 * @param $elements_to_insert
 *   Array of elements to be inserted.
 */
function _remember_me_array_insert_after_key($search_key, &$array, $elements_to_insert) {

  // Split array into two arrays: prior $search_key element including
  // $search_key element and after $search_key element.
  $array1 = array();
  $array2 = array();
  $curr_array =& $array1;
  foreach ($array as $key => $value) {
    $curr_array[$key] = $value;
    if ($search_key == $key) {
      $curr_array =& $array2;
    }
  }

  // Add $elements_to_insert to the end of the first array.
  $array1 = $array1 + $elements_to_insert;
  $array = $array1 + $array2;
}

Functions

Namesort descending Description
remember_me_form_alter Implementation of hook_form_alter().
remember_me_init Implementation of hook_init().
remember_me_sess_read Session handler 'read' callback.
remember_me_user Implementation of hook_user().
_remember_me_array_insert_after_key Insert elements into array after the element with $searck_key key and maintain index association.
_remember_me_set_lifetime remember_me_init() callback helper function.