You are here

login_destination.admin.inc in Login Destination 7

Admin page callback file for the Login Destination module.

File

login_destination.admin.inc
View source
<?php

/**
 * @file
 * Admin page callback file for the Login Destination module.
 */

/**
 * Form for editing an entire login destination at once.
 *
 * Shows list of all login destination.
 */
function login_destination_overview_form($form, &$form_state) {

  // Get all login destination rules from the database.
  $result = db_select('login_destination', 'l')
    ->fields('l', array(
    'id',
    'triggers',
    'roles',
    'pages_type',
    'pages',
    'destination',
    'weight',
    'enabled',
  ))
    ->orderBy('weight')
    ->execute()
    ->fetchAll();
  $form['#tree'] = TRUE;

  // Loop through the categories and add them to the table.
  foreach ($result as $data) {
    $triggers = array_map('check_plain', unserialize($data->triggers));
    if (empty($triggers)) {
      $triggers = array();
    }
    $roles = array_map('check_plain', unserialize($data->roles));
    if (empty($roles)) {
      $roles = array();
    }
    $form[$data->id]['destination']['#markup'] = theme('login_destination_destination', array(
      'destination' => $data->destination,
    ));
    $form[$data->id]['triggers']['#markup'] = theme('login_destination_triggers', array(
      'items' => $triggers,
    ));
    $form[$data->id]['pages']['#markup'] = theme('login_destination_pages', array(
      'pages' => $data->pages,
      'pages_type' => $data->pages_type,
    ));
    $form[$data->id]['roles']['#markup'] = theme('login_destination_roles', array(
      'items' => $roles,
    ));
    $form[$data->id]['weight'] = array(
      '#type' => 'weight',
      '#title' => t('Weight'),
      '#delta' => 50,
      '#default_value' => $data->weight,
      '#title_display' => 'invisible',
    );
    $form[$data->id]['enabled'] = array(
      '#type' => 'checkbox',
      '#title' => t('Enabled'),
      '#default_value' => $data->enabled,
      '#title_display' => 'invisible',
    );

    // Build a list of operations.
    $operations = array();
    $operations['edit'] = array(
      '#type' => 'link',
      '#title' => t('edit'),
      '#href' => 'admin/config/people/login-destination/edit/' . $data->id,
    );
    $operations['delete'] = array(
      '#type' => 'link',
      '#title' => t('delete'),
      '#href' => 'admin/config/people/login-destination/delete/' . $data->id,
    );
    $form[$data->id]['operations'] = $operations;
  }
  if (element_children($form)) {
    $form['actions'] = array(
      '#type' => 'actions',
    );
    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save configuration'),
    );
  }
  else {
    $form['#empty_text'] = t('There is no Login Destination Rule.');
  }
  return $form;
}

/**
 * Returns HTML for a login destination list.
 *
 * @param array $variables
 *   An associative array containing:
 *   - form: A render element representing the form.
 *
 * @ingroup themeable
 *
 * @return string
 */
function theme_login_destination_overview_form($variables) {
  $form = $variables['form'];
  drupal_add_tabledrag('login-destination-overview', 'order', 'sibling', 'login-destination-weight');
  $header = array(
    t('Destination'),
    t('Triggers'),
    t('Pages'),
    t('Roles'),
    array(
      'data' => t('Enabled'),
      'class' => array(
        'checkbox',
      ),
    ),
    t('Weight'),
    array(
      'data' => t('Operations'),
      'colspan' => '2',
    ),
  );
  $rows = array();
  foreach (element_children($form) as $ldid) {
    if (!isset($form[$ldid]['enabled'])) {
      continue;
    }
    $element =& $form[$ldid];
    $operations = array();
    foreach (element_children($element['operations']) as $op) {
      $operations[] = array(
        'data' => drupal_render($element['operations'][$op]),
        'class' => array(
          'login-destination-operations',
        ),
      );
    }
    while (count($operations) < 2) {
      $operations[] = '';
    }
    $row = array();
    $row[] = drupal_render($element['destination']);
    $row[] = drupal_render($element['triggers']);
    $row[] = drupal_render($element['pages']);
    $row[] = drupal_render($element['roles']);
    $row[] = array(
      'data' => drupal_render($element['enabled']),
      'class' => array(
        'checkbox',
        'login-destination-enabled',
      ),
    );
    $form[$ldid]['weight']['#attributes']['class'] = array(
      'login-destination-weight',
    );
    $row[] = drupal_render($element['weight']);
    $row = array_merge($row, $operations);
    $row = array_merge(array(
      'data' => $row,
    ), array());
    $row['class'][] = 'draggable';
    $rows[] = $row;
  }
  $output = '';
  if (empty($rows)) {
    $rows[] = array(
      array(
        'data' => $form['#empty_text'],
        'colspan' => '7',
      ),
    );
  }
  $table_arguments = array(
    'header' => $header,
    'rows' => $rows,
    'attributes' => array(
      'id' => 'login-destination-overview',
    ),
  );
  $output .= theme('table', $table_arguments);
  $output .= drupal_render_children($form);
  return $output;
}

/**
 * Submit handler for the login destination overview form.
 *
 * This function update the login destination rule attribute
 * like rules are enabled/disabled or its weight.
 *
 * @see login_destination_overview_form()
 */
function login_destination_overview_form_submit($form, &$form_state) {
  $element =& $form_state['values'];
  foreach (element_children($element) as $ldid) {
    if (isset($form[$ldid]['enabled'])) {
      $login_destination_rules[$ldid] = $element[$ldid];
      $login_destination_rules[$ldid]['ldid'] = $ldid;
    }
  }
  foreach ($login_destination_rules as $ldid => $login_destination_rule) {
    _login_destination_update_rules($login_destination_rule);
  }
  drupal_set_message(t('Your configuration has been saved.'), 'status');
}

/**
 * Save all our changed items to the database.
 *
 * @param array $login_destination_rule
 *   An associative array representing a login destination item:
 *   - enabled: (required) can contain 0 or 1, if rule is enabled then
 *   it should be 1 else 0.
 *   - weight: (required) can contain any integer value.
 *
 * @return bool
 *   The ldid of the saved login destination rule, or FALSE
 *   if the login destination rule could not be saved.
 */
function _login_destination_update_rules($login_destination_rule) {
  if (!(isset($login_destination_rule['enabled']) && isset($login_destination_rule['weight']) && isset($login_destination_rule['ldid']))) {
    return FALSE;
  }
  if ($login_destination_rule['enabled'] != 0 && $login_destination_rule['enabled'] != 1) {
    return FALSE;
  }
  $login_destination_rule['weight'] = (int) $login_destination_rule['weight'];
  if (!is_int($login_destination_rule['weight'])) {
    return FALSE;
  }
  db_update('login_destination')
    ->fields(array(
    'enabled' => $login_destination_rule['enabled'],
    'weight' => $login_destination_rule['weight'],
  ))
    ->condition('id', $login_destination_rule['ldid'])
    ->execute();
  return $login_destination_rule['ldid'];
}

/**
 * Render a destination of login destination rule.
 */
function theme_login_destination_destination($variables) {
  $output = nl2br(check_plain($variables['destination']));
  if (empty($output)) {
    $output = '<i>' . t('Empty') . '</i>';
  }
  return $output;
}

/**
 * Render a trigger of login destination rule.
 */
function theme_login_destination_triggers($variables) {
  $items = array_map('check_plain', $variables['items']);
  if (empty($items)) {
    return '<i>' . t('All triggers') . '</i>';
  }
  $output = '';
  foreach ($items as &$item) {
    switch ($item) {
      case 'login':
        $item = t('Login');
        break;
      case 'logout':
        $item = t('Logout');
        break;
    }
    $output .= $item . "<br/>";
  }
  return $output;
}

/**
 * Render a page type of login destination rule.
 */
function theme_login_destination_pages($variables) {
  $type = $variables['pages_type'];
  if ($type == LOGIN_DESTINATION_REDIRECT_PHP) {
    return nl2br(check_plain($variables['pages']));
  }
  $pages = trim($variables['pages']);
  if (empty($pages)) {
    if ($type == LOGIN_DESTINATION_REDIRECT_NOTLISTED) {
      return '<i>' . t('All pages') . '</i>';
    }
    else {
      return '<i>' . t('No pages') . '</i>';
    }
  }
  $pages = explode("\n", preg_replace('/\\r/', '', check_plain($variables['pages'])));
  $output = '';
  foreach ($pages as &$page) {
    if ($type == LOGIN_DESTINATION_REDIRECT_NOTLISTED) {
      $output .= "~ ";
    }
    $output .= $page . "<br/>";
  }
  return $output;
}

/**
 * Render a roles of login destination rule.
 */
function theme_login_destination_roles($variables) {
  $items = array_values(array_intersect_key(_login_destination_role_options(), $variables['items']));
  if (empty($items)) {
    return '<i>' . t('All roles') . '</i>';
  }
  return theme('item_list', array(
    'items' => $items,
  ));
}

/**
 * Category edit page.
 */
function login_destination_edit_form($form, &$form_state, array $rule = array()) {

  // Default values.
  $rule += array(
    'triggers' => array(),
    'roles' => array(),
    'pages_type' => LOGIN_DESTINATION_REDIRECT_NOTLISTED,
    'pages' => '',
    'destination_type' => LOGIN_DESTINATION_STATIC,
    'destination' => '<front>',
    'id' => NULL,
    'weight' => 0,
  );
  $access = user_access('use PHP for settings');
  $type = $rule['destination_type'];
  if ($type == LOGIN_DESTINATION_SNIPPET && !$access) {
    $form['destination_type'] = array(
      '#type' => 'value',
      '#value' => LOGIN_DESTINATION_SNIPPET,
    );
    $form['destination'] = array(
      '#type' => 'value',
      '#value' => $rule['destination'],
    );
  }
  else {
    $options = array(
      LOGIN_DESTINATION_STATIC => t('Internal page or external URL'),
    );
    $description = t("Specify page by using its path. Example path is %blog for the blog page. %front is the front page. %current is the current page. Precede with http:// for an external URL. Leave empty to redirect to a default page.", array(
      '%blog' => 'blog',
      '%front' => '<front>',
      '%current' => '<current>',
    ));
    if ($access && module_exists('php')) {
      $options += array(
        LOGIN_DESTINATION_SNIPPET => t('Page returned by this PHP code (experts only)'),
      );
      $description .= ' ' . t('If the PHP option is chosen, enter PHP code between %php. It should return either a string value or an array of params that the %function function will understand, for example. %example. For more information, see the online API entry for <a href="@url">url function</a>. Note that executing incorrect PHP code can break your Drupal site.', array(
        '%php' => '<?php ?>',
        '%function' => 'url($path = \'\', array $options = array())',
        '%example' => '<?php return array(\'blog\', array(\'fragment\' => \'overlay=admin/config\', ), ); ?>',
        '@url' => 'http://api.drupal.org/api/drupal/includes--common.inc/function/url/7',
      ));
    }
    $form['destination_type'] = array(
      '#type' => 'radios',
      '#title' => t('Redirect to page'),
      '#default_value' => $type,
      '#options' => $options,
    );
    $form['destination'] = array(
      '#type' => 'textarea',
      '#default_value' => $rule['destination'],
      '#description' => $description,
    );

    // Add token help if module is enabled.
    if (module_exists('token')) {
      $form['token_help'] = array(
        '#theme' => 'token_tree',
        '#token_types' => array(),
        '#dialog' => TRUE,
      );
    }
  }
  $triggers = array_map('check_plain', $rule['triggers']);
  if (empty($triggers)) {
    $triggers = array();
  }
  $form['triggers'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Redirect upon triggers'),
    '#options' => array(
      'login' => t('Login, registration, one-time login link'),
      'logout' => t('Logout'),
    ),
    '#default_value' => $triggers,
    '#description' => t('Redirect only upon selected trigger(s). If you select no triggers, all of them will be used.'),
  );
  $type = $rule['pages_type'];
  if ($type == LOGIN_DESTINATION_REDIRECT_PHP && !$access) {
    $form['pages_type'] = array(
      '#type' => 'value',
      '#value' => LOGIN_DESTINATION_REDIRECT_PHP,
    );
    $form['pages'] = array(
      '#type' => 'value',
      '#value' => $rule['destination'],
    );
  }
  else {
    $options = array(
      LOGIN_DESTINATION_REDIRECT_NOTLISTED => t('All pages except those listed'),
      LOGIN_DESTINATION_REDIRECT_LISTED => t('Only the listed pages'),
    );
    $description = t("Specify pages by using their paths. Enter one path per line. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page. %login is the login form. %register is the registration form. %reset is the one-time login (e-mail validation).", array(
      '%blog' => 'blog',
      '%blog-wildcard' => 'blog/*',
      '%front' => '<front>',
      '%login' => 'user',
      '%register' => 'user/register',
      '%reset' => 'user/*/edit',
    ));
    if ($access && module_exists('php')) {
      $options += array(
        LOGIN_DESTINATION_REDIRECT_PHP => t('Pages on which this PHP code returns <code>TRUE</code> (experts only)'),
      );
      $description .= ' ' . t('If the PHP option is chosen, enter PHP code between %php. Note that executing incorrect PHP code can break your Drupal site.', array(
        '%php' => '<?php ?>',
      ));
    }
    $form['pages_type'] = array(
      '#type' => 'radios',
      '#title' => t('Redirect from specific pages'),
      '#default_value' => $type,
      '#options' => $options,
    );
    $form['pages'] = array(
      '#type' => 'textarea',
      '#default_value' => $rule['pages'],
      '#description' => $description,
    );
  }
  $default_role_options = array_map('check_plain', $rule['roles']);
  if (empty($default_role_options)) {
    $default_role_options = array();
  }
  $form['roles'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Redirect users with roles'),
    '#options' => _login_destination_role_options(),
    '#default_value' => $default_role_options,
    '#description' => t('Redirect only the selected role(s). If you select no roles, all users will be redirected.'),
  );
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  if ($rule['id']) {
    $form['id'] = array(
      '#type' => 'hidden',
      '#value' => $rule['id'],
    );
  }
  return $form;
}

/**
 * Validate the contact category edit page form submission.
 */
function login_destination_edit_form_validate($form, &$form_state) {
  $destination = $form_state['values']['destination'];
  $destination_type = $form_state['values']['destination_type'];

  // Check user has enter any path.
  $available_urls = array(
    '<current>',
    '<front>',
  );
  if (empty($destination) || $destination_type != 0 || in_array($destination, $available_urls)) {
    return;
  }
  $destination = preg_replace("/\\?.+/", "", $destination);
  if (url_is_external($destination)) {
    return;
  }

  // Replace tokens.
  if (module_exists('token')) {
    $destination = token_replace($destination);
  }

  // Get source path if an alias entered.
  $source_path = drupal_lookup_path('source', $destination);
  if (!empty($source_path)) {
    $destination = $source_path;
  }
  if (!drupal_valid_path($destination)) {
    form_set_error('destination', t('Incorrect path, please enter a valid path.'));
  }
}

/**
 * Process the contact category edit page form submission.
 */
function login_destination_edit_form_submit($form, &$form_state) {
  $form_state['values']['triggers'] = serialize(array_filter($form_state['values']['triggers']));
  $form_state['values']['roles'] = serialize(array_filter($form_state['values']['roles']));
  if (empty($form_state['values']['id'])) {
    drupal_write_record('login_destination', $form_state['values']);
  }
  else {
    drupal_write_record('login_destination', $form_state['values'], array(
      'id',
    ));
  }
  drupal_set_message(t('Login destination to %destination has been saved.', array(
    '%destination' => $form_state['values']['destination'],
  )));
  $form_state['redirect'] = 'admin/config/people/login-destination';
}

/**
 * Form builder for deleting a login destination.
 */
function login_destination_delete_form($form, &$form_state, array $rule) {
  $form['login_destination'] = array(
    '#type' => 'value',
    '#value' => $rule,
  );
  return confirm_form($form, t('Are you sure you want to delete the login destination %destination ?', array(
    '%destination' => $rule['destination'],
  )), 'admin/config/people/login-destination', t('This action cannot be undone.'), t('Delete'), t('Cancel'));
}

/**
 * Submit handler for the confirm delete login destination form.
 */
function login_destination_delete_form_submit($form, &$form_state) {
  $rule = $form['login_destination']['#value'];
  db_delete('login_destination')
    ->condition('id', $rule['id'])
    ->execute();
  drupal_set_message(t('The login destination %destination has been deleted.', array(
    '%destination' => $rule['destination'],
  )));
  $form_state['redirect'] = 'admin/config/people/login-destination';
}

/**
 * Settings page.
 */
function login_destination_settings() {
  $form = array();
  $form['settings']['login_destination_preserve_destination'] = array(
    '#type' => 'checkbox',
    '#default_value' => variable_get('login_destination_preserve_destination', FALSE),
    '#title' => t('Preserve the destination parameter'),
    '#description' => t("The 'destination' GET parameter will have priority over the settings of this module. With this setting enabled, redirect from the user login block will not work."),
  );
  $form['settings']['login_destination_immediate_redirect'] = array(
    '#type' => 'checkbox',
    '#default_value' => variable_get('login_destination_immediate_redirect', FALSE),
    '#title' => t('Redirect immediately after using one-time login link'),
    '#description' => t("User will be redirected before given the possibility to change their password."),
  );
  return system_settings_form($form);
}

Functions

Namesort descending Description
login_destination_delete_form Form builder for deleting a login destination.
login_destination_delete_form_submit Submit handler for the confirm delete login destination form.
login_destination_edit_form Category edit page.
login_destination_edit_form_submit Process the contact category edit page form submission.
login_destination_edit_form_validate Validate the contact category edit page form submission.
login_destination_overview_form Form for editing an entire login destination at once.
login_destination_overview_form_submit Submit handler for the login destination overview form.
login_destination_settings Settings page.
theme_login_destination_destination Render a destination of login destination rule.
theme_login_destination_overview_form Returns HTML for a login destination list.
theme_login_destination_pages Render a page type of login destination rule.
theme_login_destination_roles Render a roles of login destination rule.
theme_login_destination_triggers Render a trigger of login destination rule.
_login_destination_update_rules Save all our changed items to the database.