You are here

role_login_page.admin.inc in Multiple role login pages 7

author: nisith

File

role_login_page.admin.inc
View source
<?php

/**
 * @file
 *
 * author: nisith
 */

/**
 * Add login page form.
 */
function _role_login_page_settings($form, &$form_state) {
  $roles_arr = db_select('role', 'r')
    ->fields('r', array(
    'rid',
    'name',
  ))
    ->condition('r.name', 'anonymous user', '<>')
    ->execute()
    ->fetchAll();
  $roles = array();
  foreach ($roles_arr as $role_data) {
    $roles[$role_data->rid] = $role_data->name;
  }
  $form['login_page_menu'] = array(
    '#type' => 'fieldset',
    '#title' => t('Add login page'),
    '#collapsible' => FALSE,
  );
  $form['login_page_menu']['loginmenu_url'] = array(
    '#type' => 'textfield',
    '#title' => 'Login page url',
    '#required' => TRUE,
    '#description' => t('URL should exclude the basepath, i.e, "http://example.com". Add the path that should be used after base path, i.e, "user or admin/newconfig"'),
  );
  $form['login_page_menu']['username_label'] = array(
    '#type' => 'textfield',
    '#title' => 'Username label',
  );
  $form['login_page_menu']['password_label'] = array(
    '#type' => 'textfield',
    '#title' => 'Password label',
  );
  $form['login_page_menu']['submit_text'] = array(
    '#type' => 'textfield',
    '#title' => 'Submit button text',
  );
  $form['login_page_menu']['page_title'] = array(
    '#type' => 'textfield',
    '#title' => 'Page title',
  );
  $form['login_page_menu']['redirect_path'] = array(
    '#type' => 'textfield',
    '#title' => 'Redirect path',
    '#description' => t('Path should exclude the basepath, i.e, "http://example.com". Add the path that should be used after base path, i.e, "user or admin/newconfig"'),
  );
  $form['login_page_menu']['roles'] = array(
    '#type' => 'select',
    '#title' => 'Select the user roles allowed to login through this page : ',
    '#options' => $roles,
    '#multiple' => TRUE,
    '#required' => TRUE,
  );
  $form['login_page_menu']['role_mismatch_error_text'] = array(
    '#type' => 'textarea',
    '#title' => 'Role mismatch error text',
  );
  $form['login_page_menu']['invalid_credentials_error_text'] = array(
    '#type' => 'textarea',
    '#title' => 'Invalid credentials error text',
  );
  $form['login_page_menu']['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Create login page',
  );
  return $form;
}

/*
 * Rebuild the menu after adding the login page.
 */
function _role_login_page_settings_cache_clear($url, $type) {
  global $base_url;
  $custom_page = $base_url . '/' . $url;
  if ($type == 'add') {
    drupal_set_message(t('The page <b>@url</b> has been created and is active. This page can now be accessed only as an anonymous user.', array(
      '@url' => $custom_page,
    )));
  }
  elseif ($type == 'update') {
    drupal_set_message(t('The page <b>@url</b> has been updated. This page can now be accessed only as an anonymous user.', array(
      '@url' => $custom_page,
    )));
  }
  elseif ($type == 'delete') {
    drupal_set_message(t('The page <b>@url</b> has been deleted.', array(
      '@url' => $custom_page,
    )));
  }

  // Set a variable to let menu_execute_active_handler() know that menu rebuild is required
  variable_set('menu_rebuild_needed', TRUE);
  drupal_goto('admin/config/login/role_login_settings/list');
}

/*
 * Validation of add login page form.
 */
function _role_login_page_settings_validate($form, &$form_state) {
  global $base_url;
  $url = trim($form_state['values']['loginmenu_url']);
  $complete_url = $base_url . '/' . $url;
  $complete_url = filter_var($complete_url, FILTER_SANITIZE_URL);
  $replacements = array(
    '!',
    '*',
    "(",
    ")",
    ";",
    "@",
    "+",
    "\$",
    ",",
    "[",
    "]",
  );
  $complete_url = str_replace($replacements, '', $complete_url);
  if (!filter_var($complete_url, FILTER_VALIDATE_URL)) {
    form_set_error('loginmenu_url', t("@comurl is not a valid URL", array(
      '@comurl' => $complete_url,
    )));
  }
  $menu_exists = db_query_range("SELECT 1 FROM {menu_links} WHERE link_path = :link_path", 0, 1, array(
    ':link_path' => $url,
  ))
    ->fetchField();
  if ($menu_exists) {
    form_set_error('loginmenu_url', t('The menu URL already exists'));
  }
}

/*
 * Submit add login page form.
 */
function _role_login_page_settings_submit($form, &$form_state) {
  $url = trim($form_state['values']['loginmenu_url']);
  $replacements = array(
    '!',
    '*',
    "(",
    ")",
    ";",
    ":",
    "@",
    "+",
    "\$",
    ",",
    "[",
    "]",
    " ",
  );
  $url = str_replace($replacements, '-', $url);
  $username_label = trim($form_state['values']['username_label']);
  $password_label = trim($form_state['values']['password_label']);
  $submit_text = trim($form_state['values']['submit_text']);
  $page_title = trim($form_state['values']['page_title']);
  $redirect_path = trim($form_state['values']['redirect_path']);
  $role_mismatch_error_text = trim($form_state['values']['role_mismatch_error_text']);
  $invalid_credentials_error_text = trim($form_state['values']['invalid_credentials_error_text']);
  $roles = $form_state['values']['roles'];
  $roles = implode(',', $roles);
  $add_login_url = db_insert('role_login_page_settings')
    ->fields(array(
    "url" => $url,
    "username_label" => $username_label,
    "password_label" => $password_label,
    "submit_text" => $submit_text,
    "page_title" => $page_title,
    "redirect_path" => $redirect_path,
    "role_mismatch_error_text" => $role_mismatch_error_text,
    "invalid_credentials_error_text" => $invalid_credentials_error_text,
    "roles" => $roles,
  ))
    ->execute();
  if ($add_login_url) {
    _role_login_page_settings_cache_clear($url, 'add');
  }
}

/*
 * Login page edit form.
 */
function _role_login_page_settings_edit($form, $form_state, $rl_id) {
  $login_menu_data = db_select('role_login_page_settings', 'rlps')
    ->fields('rlps')
    ->condition('rl_id', $rl_id)
    ->execute()
    ->fetchObject();
  $roles_arr = db_select('role', 'r')
    ->fields('r', array(
    'rid',
    'name',
  ))
    ->condition('r.name', 'anonymous user', '<>')
    ->execute()
    ->fetchAll();
  $roles = array();
  foreach ($roles_arr as $role_data) {
    $roles[$role_data->rid] = $role_data->name;
  }
  if ($login_menu_data) {
    $form['login_page_menu'] = array(
      '#type' => 'fieldset',
      '#title' => t('Edit login page'),
      '#collapsible' => FALSE,
    );
    $form['login_page_menu']['loginmenu_url'] = array(
      '#type' => 'textfield',
      '#title' => 'Login page url',
      '#required' => TRUE,
      '#default_value' => $login_menu_data->url,
      '#description' => t('URL should exclude the basepath, i.e, "http://example.com". Add the path that should be used after base path, i.e, "user or admin/newconfig"'),
    );
    $form['login_page_menu']['username_label'] = array(
      '#type' => 'textfield',
      '#title' => 'Username label',
      '#default_value' => $login_menu_data->username_label,
    );
    $form['login_page_menu']['password_label'] = array(
      '#type' => 'textfield',
      '#title' => 'Password label',
      '#default_value' => $login_menu_data->password_label,
    );
    $form['login_page_menu']['submit_text'] = array(
      '#type' => 'textfield',
      '#title' => 'Submit button text',
      '#default_value' => $login_menu_data->submit_text,
    );
    $form['login_page_menu']['page_title'] = array(
      '#type' => 'textfield',
      '#title' => 'Page title',
      '#default_value' => $login_menu_data->page_title,
    );
    $form['login_page_menu']['redirect_path'] = array(
      '#type' => 'textfield',
      '#title' => 'Redirect path',
      '#default_value' => $login_menu_data->redirect_path,
      '#description' => t('Path should exclude the basepath, i.e, "http://example.com". Add the path that should be used after base path, i.e, "user or admin/newconfig"'),
    );
    $form['login_page_menu']['roles'] = array(
      '#type' => 'select',
      '#title' => 'Select the user roles allowed to login through this page : ',
      '#options' => $roles,
      '#multiple' => TRUE,
      '#required' => TRUE,
      '#default_value' => explode(',', $login_menu_data->roles),
    );
    $form['login_page_menu']['role_mismatch_error_text'] = array(
      '#type' => 'textarea',
      '#title' => 'Role mismatch error text',
      '#default_value' => $login_menu_data->role_mismatch_error_text,
    );
    $form['login_page_menu']['invalid_credentials_error_text'] = array(
      '#type' => 'textarea',
      '#title' => 'Invalid credentials error text',
      '#default_value' => $login_menu_data->invalid_credentials_error_text,
    );
    $form['rl_id'] = array(
      '#type' => 'hidden',
      '#default_value' => $login_menu_data->rl_id,
      '#access' => FALSE,
    );
    $form['login_page_menu']['submit'] = array(
      '#type' => 'submit',
      '#value' => 'Update login page',
    );
    return $form;
  }
  else {
    drupal_set_message(t('Invalid login page ID'), 'warning');
    drupal_goto('admin/config/login/role_login_settings/list');
  }
}

/*
 * Validation of login page edit form.
 */
function _role_login_page_settings_edit_validate($form, &$form_state) {
  global $base_url;
  $rl_id = $form_state['values']['rl_id'];
  $url = trim($form_state['values']['loginmenu_url']);
  $complete_url = $base_url . '/' . $url;
  $complete_url = filter_var($complete_url, FILTER_SANITIZE_URL);
  $replacements = array(
    '!',
    '*',
    "(",
    ")",
    ";",
    "@",
    "+",
    "\$",
    ",",
    "[",
    "]",
  );
  $complete_url = str_replace($replacements, '', $complete_url);
  if (!filter_var($complete_url, FILTER_VALIDATE_URL)) {
    form_set_error('loginmenu_url', t("@comurl is not a valid URL", array(
      '@comurl' => $complete_url,
    )));
  }
  $menu_exists = db_query_range("SELECT 1 FROM {menu_links} WHERE link_path = :link_path", 0, 1, array(
    ':link_path' => $url,
  ))
    ->fetchField();
  $login_page_exists = db_query_range("SELECT 1 FROM {role_login_page_settings} WHERE url = :link_path and rl_id <> :rl_id", 0, 1, array(
    ':link_path' => $url,
    ':rl_id' => $rl_id,
  ))
    ->fetchField();
  $current_data_match = db_query_range("SELECT 1 FROM {role_login_page_settings} WHERE url = :link_path and rl_id = :rl_id", 0, 1, array(
    ':link_path' => $url,
    ':rl_id' => $rl_id,
  ))
    ->fetchField();
  if (!$current_data_match) {
    if ($menu_exists && !$login_page_exists) {
      form_set_error('loginmenu_url', t('The menu URL already exists'));
    }
  }
}

/*
 * Submit edit login page.
 */
function _role_login_page_settings_edit_submit($form, &$form_state) {
  $rl_id = $form_state['values']['rl_id'];
  $url = trim($form_state['values']['loginmenu_url']);
  $replacements = array(
    '!',
    '*',
    "(",
    ")",
    ";",
    ":",
    "@",
    "+",
    "\$",
    ",",
    "[",
    "]",
    " ",
  );
  $url = str_replace($replacements, '-', $url);
  $username_label = trim($form_state['values']['username_label']);
  $password_label = trim($form_state['values']['password_label']);
  $submit_text = trim($form_state['values']['submit_text']);
  $page_title = trim($form_state['values']['page_title']);
  $redirect_path = trim($form_state['values']['redirect_path']);
  $role_mismatch_error_text = trim($form_state['values']['role_mismatch_error_text']);
  $invalid_credentials_error_text = trim($form_state['values']['invalid_credentials_error_text']);
  $roles = $form_state['values']['roles'];
  $roles = implode(',', $roles);
  db_update('role_login_page_settings')
    ->fields(array(
    "url" => $url,
    "username_label" => $username_label,
    "password_label" => $password_label,
    "submit_text" => $submit_text,
    "page_title" => $page_title,
    "redirect_path" => $redirect_path,
    "role_mismatch_error_text" => $role_mismatch_error_text,
    "invalid_credentials_error_text" => $invalid_credentials_error_text,
    "roles" => $roles,
  ))
    ->condition('rl_id', $rl_id)
    ->execute();
  _role_login_page_settings_cache_clear($url, 'update');
}

/*
 * Delete custom login page.
 */
function _role_login_page_settings_delete($form, $form_state, $rlid) {
  $form = array();
  $form['rl_id'] = array(
    '#type' => 'value',
    '#value' => $rlid,
    '#access' => FALSE,
  );
  return confirm_form($form, t('Are you sure you want to delete the login page?'), 'admin/config/login/role_login_settings/list', t('This action cannot be undone.'), t('Delete'), t('Cancel'));
}

/*
 * Submit login delete page.
 */
function _role_login_page_settings_delete_submit($form, $form_state) {
  $rl_id = $form_state['values']['rl_id'];
  $url = db_query_range("SELECT url FROM {role_login_page_settings} WHERE rl_id = :rl_id", 0, 1, array(
    ':rl_id' => $rl_id,
  ))
    ->fetchField();
  $deleted = db_delete('role_login_page_settings')
    ->condition('rl_id', $rl_id)
    ->execute();
  if ($deleted) {
    _role_login_page_settings_cache_clear($url, 'delete');
  }
}