You are here

login_destination.module in Login Destination 6

File

login_destination.module
View source
<?php

// Destination constants
define('LOGIN_DEST_STATIC', 'static');
define('LOGIN_DEST_SNIPPET', 'snippet');

// Condition constants
define('LOGIN_COND_ALWAYS', 'always');
define('LOGIN_COND_PAGES', 'pages');
define('LOGIN_COND_SNIPPET', 'snippet');

// Permissions
define('LOGIN_DEST_PERM_ADMIN', 'administer login destination');

/**
* Implementation of hook_perm().
*/
function login_destination_perm() {
  return array(
    LOGIN_DEST_PERM_ADMIN,
  );
}

/**
 * Implementation of hook_menu().
 */
function login_destination_menu() {
  $items['admin/user/login_destination'] = array(
    'title' => 'Login Destination',
    'description' => 'Control where users are directed to once they login.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'login_destination_admin_settings',
    ),
    'access arguments' => array(
      LOGIN_DEST_PERM_ADMIN,
    ),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}
function login_destination_admin_settings() {
  $form = array();
  $form['destination'] = array(
    '#type' => 'fieldset',
    '#title' => t('URL destination settings'),
    '#description' => t('This is to specify where exactly user should be redirected upon login.'),
  );
  $form['destination']['ld_destination'] = array(
    '#type' => 'checkbox',
    '#default_value' => variable_get('ld_destination', TRUE),
    '#title' => t('Preserve destination'),
    '#description' => t("If checked, 'destination=' parameter specified in the URL will be used to perform redirection. Otherwise, redirection will be always performed according to the settings below."),
  );
  $form['destination']['ld_url_type'] = array(
    '#type' => 'radios',
    '#default_value' => variable_get('ld_url_type', LOGIN_DEST_STATIC),
    '#options' => array(
      LOGIN_DEST_STATIC => t('Static URL'),
      LOGIN_DEST_SNIPPET => t('PHP snippet (experts only)'),
    ),
  );
  $form['destination']['ld_url_destination'] = array(
    '#type' => 'textarea',
    '#default_value' => variable_get('ld_url_destination', 'user'),
    '#title' => t('URL'),
    '#rows' => 4,
    '#description' => t('<b>Static URL mode:</b> Enter a static path. Example paths are %ex1 or %ex2.', array(
      '%ex1' => 'node/add',
      '%ex2' => 'workspace',
    )) . '<br/>' . t("<b>PHP snippet mode:</b> Enter PHP code to evaluate path (<b>NO %php tags!</b>). It should return either a string value or an <b>array('path' => path/alias to redirect, 'query' => parameters, ... [other parameters are equal to the url() function specification]</b>).", array(
      '%php' => '<?php ?>',
    )),
  );
  $form['condition'] = array(
    '#type' => 'fieldset',
    '#title' => t('Redirection condition settings'),
    '#description' => t('Set the condition to determine whether redirection should happen or not.'),
  );
  $form['condition']['ld_condition_type'] = array(
    '#type' => 'radios',
    '#default_value' => variable_get('ld_condition_type', 'always'),
    '#options' => array(
      LOGIN_COND_ALWAYS => t('Always'),
      LOGIN_COND_PAGES => t('List of paths'),
      LOGIN_COND_SNIPPET => t('PHP snippet (experts only)'),
    ),
  );
  $form['condition']['ld_condition_snippet'] = array(
    '#type' => 'textarea',
    '#default_value' => variable_get('ld_condition_snippet', ''),
    '#title' => t('Redirect condition'),
    '#rows' => 4,
    '#description' => t('<b>Always:</b> Redirection happens always. Redirect condition field is ignored.') . '<br/>' . t('<b>List of paths mode:</b> Enter a list of paths, one path per one line. Redirection will happen only when logging from specified pages. Example paths are <b>%ex1</b> or <b>%ex2</b>.', array(
      '%ex1' => 'contact',
      '%ex2' => 'user/login',
    )) . '<br/>' . t('<b>PHP snippet mode:</b> Enter PHP code to find should redirection happen or not (<b>NO %php tags!</b>). It should return boolean value.', array(
      '%php' => '<?php ?>',
    )),
  );
  return system_settings_form($form);
}

/**
 * Implementation of hook_user.
 */
function login_destination_user($op, &$edit, &$account, $category = NULL) {
  switch ($op) {
    case 'login':
      global $language;
      $destination = variable_get('ld_url_destination', 'user');
      if (variable_get('ld_url_type', LOGIN_DEST_STATIC) == LOGIN_DEST_SNIPPET) {
        ob_start();
        $url = eval($destination);
        ob_end_clean();
      }
      else {
        $url = $destination;
      }
      if (is_array($url) && !empty($url['path'])) {
        $path = $url['path'];
        unset($url['path']);
        $base = base_path();
        if (!empty($language->prefix)) {
          $base .= $language->prefix . '/';
        }
        $url = str_replace($base, '', url($path, $url));
      }
  }
  if (login_destination_apply_redirect()) {
    $_REQUEST['destination'] = $url;
  }
}

/**
 * A helper function to determine whether redirection should happen.
 *
 * @return bool TRUE - apply redirect, FALSE - not to apply redirect.
 */
function login_destination_apply_redirect() {
  if ($_GET['destination'] != $_GET['q'] && variable_get('ld_destination', TRUE)) {
    return FALSE;
  }
  $mode = variable_get('ld_condition_type', LOGIN_COND_ALWAYS);
  if (LOGIN_COND_ALWAYS == $mode) {
    return TRUE;
  }
  else {
    $cond = variable_get('ld_condition_snippet', '');
    if (LOGIN_COND_PAGES == $mode) {
      $paths = split("[\n\r]", $cond);
      return in_array($_GET['q'], $paths);
    }
    elseif (LOGIN_COND_SNIPPET == $mode) {
      $destination = variable_get('ld_url_destination', 'user');
      return drupal_eval('<?php ' . $cond . ' ?>');
    }
  }
}

Functions

Namesort descending Description
login_destination_admin_settings
login_destination_apply_redirect A helper function to determine whether redirection should happen.
login_destination_menu Implementation of hook_menu().
login_destination_perm Implementation of hook_perm().
login_destination_user Implementation of hook_user.

Constants