123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- <?php
- /**
- * @file
- * Admin page callback file for the Login Destination module.
- */
- /**
- * List destination rules.
- */
- function login_destination_overview() {
- $header = array(
- t('Destination'),
- t('Triggers'),
- t('Pages'),
- t('Roles'),
- array('data' => t('Operations'), 'colspan' => 2),
- );
- $rows = array();
- // Get all login destination rules from the database.
- $result = db_select('login_destination', 'l')
- ->fields('l', array('id', 'triggers', 'roles', 'pages_type', 'pages', 'destination'))
- ->orderBy('weight')
- ->execute()
- ->fetchAll();
- // 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();
- $rows[] = array(
- theme('login_destination_destination', array('destination' => $data->destination)),
- theme('login_destination_triggers', array('items' => $triggers)),
- theme('login_destination_pages', array('pages' => $data->pages, 'pages_type' => $data->pages_type)),
- theme('login_destination_roles', array('items' => $roles)),
- l(t('Edit'), 'admin/config/people/login-destination/edit/' . $data->id),
- l(t('Delete'), 'admin/config/people/login-destination/delete/' . $data->id),
- );
- }
- if (!$rows) {
- $rows[] = array(array(
- 'data' => t('No rules available.'),
- 'colspan' => 6,
- ));
- }
- $build['login-destination_table'] = array(
- '#theme' => 'table',
- '#header' => $header,
- '#rows' => $rows,
- );
- return $build;
- }
- function theme_login_destination_destination($variables) {
- $output = nl2br(check_plain($variables['destination']));
- if (empty($output)) {
- $output = '<i>' . t('Empty') . '</i>';
- }
- return $output;
- }
- 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 = 'Login';
- break;
- case 'logout':
- $item = 'Logout';
- break;
- }
- $output .= $item . "<br/>";
- }
- return $output;
- }
- 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;
- }
- 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 (module_exists('php') && $access) {
- $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, e.g. %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' => 'Redirect to page',
- '#default_value' => $type,
- '#options' => $options,
- );
- $form['destination'] = array(
- '#type' => 'textarea',
- '#default_value' => $rule['destination'],
- '#description' => $description,
- );
- }
- $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' => 'Login, registration, one-time login link', 'logout' => 'Logout'),
- '#default_value' => $triggers,
- '#description' => '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 (module_exists('php') && $access) {
- $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' => 'Redirect only the selected role(s). If you select no roles, all users will be redirected.',
- );
- $form['weight'] = array(
- '#type' => 'weight',
- '#title' => t('Weight'),
- '#default_value' => $rule['weight'],
- '#description' => t('When evaluating login destination rules, those with lighter (smaller) weights get evaluated before rules with heavier (larger) weights.'),
- );
- $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) {
- }
- /**
- * 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);
- }
|