You are here

function redirect_list_form in Redirect 7.2

Same name and namespace in other branches
  1. 7 redirect.admin.inc \redirect_list_form()

@file Administrative page callbacks for the redirect module.

1 string reference to 'redirect_list_form'
redirect_menu in ./redirect.module
Implements hook_menu().

File

./redirect.admin.inc, line 8
Administrative page callbacks for the redirect module.

Code

function redirect_list_form($form, &$form_state) {
  $args = func_get_args();
  $form['#operations'] = redirect_get_redirect_operations();
  if (isset($form_state['values']['operation']) && empty($form_state['values']['confirm'])) {
    return redirect_list_form_operations_confirm_form($form, $form_state, $form_state['values']['operation'], array_filter($form_state['values']['rids']));
  }
  $destination = drupal_get_destination();
  $default_status_code = variable_get('redirect_default_status_code', 301);

  // Set up the header.
  $header = array(
    'source' => array(
      'data' => t('From'),
      'field' => 'source',
      'sort' => 'asc',
    ),
    'redirect' => array(
      'data' => t('To'),
      'field' => 'redirect',
    ),
    'status' => array(
      'data' => t('Status'),
      'field' => 'status',
    ),
    'status_code' => array(
      'data' => t('Type'),
      'field' => 'status_code',
    ),
    'language' => array(
      'data' => t('Language'),
      'field' => 'language',
    ),
    'count' => array(
      'data' => t('Count'),
      'field' => 'count',
    ),
    'access' => array(
      'data' => t('Last accessed'),
      'field' => 'access',
    ),
    'operations' => array(
      'data' => t('Operations'),
    ),
  );

  // Do not include the language column if locale is disabled.
  if (!module_exists('locale')) {
    unset($header['language']);
  }

  // Get filter keys and add the filter form.
  $keys = array_slice($args, 2);

  // Offset the $form and $form_state parameters.
  $keys = implode('/', $keys);
  $form['redirect_list_filter_form'] = redirect_list_filter_form($keys);

  // Build the 'Update options' form.
  $form['operations'] = array(
    '#type' => 'fieldset',
    '#title' => t('Update options'),
    '#prefix' => '<div class="container-inline">',
    '#suffix' => '</div>',
    '#attributes' => array(
      'class' => array(
        'redirect-list-operations',
      ),
    ),
  );
  $operations = array();
  foreach ($form['#operations'] as $key => $operation) {
    $operations[$key] = $operation['action'];
  }
  $form['operations']['operation'] = array(
    '#type' => 'select',
    '#options' => $operations,
    '#default_value' => 'delete',
  );
  $form['operations']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Update'),
    '#validate' => array(
      'redirect_list_form_operations_validate',
    ),
    '#submit' => array(
      'redirect_list_form_operations_submit',
    ),
  );

  // Building the SQL query and load the redirects.
  $query = db_select('redirect', 'r')
    ->extend('TableSort')
    ->extend('PagerDefault');
  $query
    ->addField('r', 'rid');
  $query
    ->condition('r.type', 'redirect');
  $query
    ->orderByHeader($header);
  $query
    ->limit(50);
  $query
    ->addTag('redirect_list');
  $query
    ->addTag('redirect_access');
  redirect_build_filter_query($query, array(
    'source',
    'redirect',
  ), $keys);
  $rids = $query
    ->execute()
    ->fetchCol();
  $redirects = redirect_load_multiple($rids);
  $rows = array();
  foreach ($redirects as $rid => $redirect) {
    $row = array();
    $redirect->source_options = array_merge($redirect->source_options, array(
      'alias' => TRUE,
      'language' => redirect_language_load($redirect->language),
    ));
    $source_url = redirect_url($redirect->source, $redirect->source_options);
    $redirect_url = redirect_url($redirect->redirect, array_merge($redirect->redirect_options, array(
      'alias' => TRUE,
    )));
    drupal_alter('redirect_url', $redirect->source, $redirect->source_options);
    drupal_alter('redirect_url', $redirect->redirect, $redirect->redirect_options);

    // Rewrite redirect URLs to absolute file URIs.
    if ($scheme = file_uri_scheme($redirect->redirect)) {
      if (file_stream_wrapper_valid_scheme($scheme)) {
        if ($external_path = file_create_url($redirect->redirect)) {
          $redirect->redirect = $external_path;
        }
      }
    }
    $row['source'] = l($source_url, $redirect->source, $redirect->source_options);
    $row['redirect'] = l($redirect_url, $redirect->redirect, $redirect->redirect_options);
    $row['status'] = $redirect->status ? t('Enabled') : t('Disabled');
    $row['status_code'] = $redirect->status_code ? $redirect->status_code : t('Default (@default)', array(
      '@default' => $default_status_code,
    ));
    $row['language'] = module_invoke('locale', 'language_name', $redirect->language);
    $row['count'] = $redirect->count;
    if ($redirect->access) {
      $row['access'] = array(
        'data' => t('!interval ago', array(
          '!interval' => format_interval(REQUEST_TIME - $redirect->access),
        )),
        'title' => t('Last accessed on @date', array(
          '@date' => format_date($redirect->access),
        )),
      );
    }
    else {
      $row['access'] = t('Never');
    }

    // Mark redirects that override existing paths with a warning in the table.
    if (drupal_valid_path($redirect->source)) {
      $row['#attributes']['class'][] = 'warning';
      $row['#attributes']['title'] = t('This redirect overrides an existing internal path.');
    }
    $operations = array();
    if (redirect_access('update', $redirect)) {
      $operations['edit'] = array(
        'title' => t('Edit'),
        'href' => 'admin/config/search/redirect/edit/' . $rid,
        'query' => $destination,
      );
    }
    if (redirect_access('delete', $redirect)) {
      $operations['delete'] = array(
        'title' => t('Delete'),
        'href' => 'admin/config/search/redirect/delete/' . $rid,
        'query' => $destination,
      );
    }
    $row['operations'] = array(
      'data' => array(
        '#theme' => 'links',
        '#links' => $operations,
        '#attributes' => array(
          'class' => array(
            'links',
            'inline',
            'nowrap',
          ),
        ),
      ),
    );
    $rows[$rid] = $row;
  }
  $form['rids'] = array(
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $rows,
    '#empty' => t('No URL redirects available.'),
    '#attributes' => array(
      'class' => array(
        'redirect-list-tableselect',
      ),
    ),
    '#attached' => array(
      'js' => array(
        drupal_get_path('module', 'redirect') . '/redirect.admin.js',
      ),
    ),
  );
  if (redirect_access('create', 'redirect')) {
    $form['rids']['#empty'] .= ' ' . l(t('Add URL redirect'), 'admin/config/search/redirect/add', array(
      'query' => $destination,
    ));
  }
  $form['pager'] = array(
    '#theme' => 'pager',
  );
  return $form;
}