View source  
  <?php
function apachesolr_sort_menu() {
  $items['admin/settings/apachesolr/sort'] = array(
    'title' => 'Sorting',
    'description' => 'Sorting settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'apachesolr_sort_page_form',
    ),
    'access arguments' => array(
      'administer site configuration',
    ),
    'file' => 'apachesolr_sort.admin.inc',
    'weight' => -10,
    'type' => MENU_LOCAL_TASK,
  );
  return $items;
}
function apachesolr_sort_apachesolr_query_prepare($query) {
  $sorts = $query
    ->getAvailableSorts();
  foreach ($sorts as $sort_key => $sort) {
    if (!variable_get('apachesolr_sort_sort_' . $sort_key, TRUE)) {
      $query
        ->removeAvailableSort($sort_key);
    }
  }
  $sorts = $query
    ->getAvailableSorts();
  foreach ($sorts as $sort_key => $sort) {
    $weight = variable_get('apachesolr_sort_sort_weight_' . $sort_key, 0);
    $sorts[$sort_key]['weight'] = $weight;
  }
  uasort($sorts, "apachesolr_sort_weight_sort");
  $query
    ->setAvailableSorts($sorts);
}
function apachesolr_sort_weight_sort($a, $b) {
  return strcmp($a['weight'], $b['weight']);
}
function apachesolr_sort_block($op = 'list', $delta = 0, $edit = array()) {
  
  switch ($op) {
    case 'list':
      return apachesolr_sort_block_info();
    case 'view':
      return apachesolr_sort_block_view($delta);
  }
}
function apachesolr_sort_block_info() {
  $blocks['apachesolr_sort'] = array(
    'info' => t('Apache Solr Select Sort'),
    'cache' => DRUPAL_CACHE_PER_PAGE,
  );
  return $blocks;
}
function apachesolr_sort_block_view($delta) {
  if ('apachesolr_sort' == $delta) {
    $environments = apachesolr_load_all_environments();
    foreach ($environments as $env_id => $environment) {
      if (apachesolr_has_searched($env_id) && !apachesolr_suppress_blocks($env_id)) {
        $response = NULL;
        
        if ($query = apachesolr_current_query($env_id)) {
          $response = apachesolr_static_response_cache($query
            ->getSearcher());
        }
        if (!$response || $response->response->numFound < 2) {
          return;
        }
        
        $new_query = clone $query;
        $sorts = $query
          ->getAvailableSorts();
        $solrsort = $query
          ->getSolrsort();
        
        return array(
          'subject' => t('Sort by'),
          'content' => drupal_get_form('apachesolr_sort_sort_form_', $new_query, $sorts, $solrsort),
        );
      }
    }
  }
}
function apachesolr_sort_sort_form_(&$form_state, SolrBaseQuery $query, array $sorts, array $solrsort) {
  $form = array();
  $form['apachesolr_sort_query'] = array(
    '#type' => 'value',
    '#value' => $query,
  );
  $toggle = array(
    'asc' => 'desc',
    'desc' => 'asc',
  );
  
  $sort_options = array();
  foreach ($sorts as $name => $data) {
    $sort_options[$name] = check_plain($data['title']);
  }
  $form['apachesolr_sort_name'] = array(
    '#type' => 'select',
    '#title' => t('Field'),
    '#options' => $sort_options,
    '#default_value' => $solrsort['#name'],
  );
  $form['apachesolr_sort_direction'] = array(
    '#type' => 'select',
    '#title' => t('Direction'),
    '#options' => array(
      'asc' => t('Ascending'),
      'desc' => t('Descending'),
    ),
    '#default_value' => $solrsort['#direction'],
  );
  $form['actions'] = array(
    '#type' => 'actions',
    '#weight' => 20,
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Sort results'),
  );
  $form['#submit'][] = 'apachesolr_sort_sort_form_submit';
  return $form;
}
function apachesolr_sort_sort_form_submit($form, &$form_state) {
  $query = $form_state['values']['apachesolr_sort_query'];
  $name = $form_state['values']['apachesolr_sort_name'];
  $direction = $form_state['values']['apachesolr_sort_direction'];
  
  $query
    ->setSolrsort($name, $direction);
  $params = array_merge($_GET, $query
    ->getSolrsortUrlQuery());
  $params = drupal_get_query_parameters($params, array(
    'q',
    'page',
  ));
  
  if ('score' == $name) {
    $params = array();
  }
  
  $form_state['redirect'] = array(
    current_path(),
    array(
      'query' => $params,
    ),
  );
}