You are here

function search_api_location_page_search_api_query_alter in Search API Location 7.2

Implements hook_search_api_query_alter().

File

search_api_location_page/search_api_location_page.module, line 433

Code

function search_api_location_page_search_api_query_alter(SearchApiQueryInterface $query) {
  if (!preg_match('/^search_api_page:(.*)$/', $query
    ->getOption('search id'), $m)) {
    return;
  }
  $page = search_api_page_load_multiple(FALSE, array(
    'path' => $m[1],
  ));
  $page = reset($page);
  if (!$page) {
    return;
  }
  $location_options = $query
    ->getOption('search_api_location', array());
  if (!empty($_GET['location'])) {
    foreach ($page->options['search_api_location'] as $key => $field) {
      if (!empty($field['enabled'])) {
        $plugin = search_api_location_get_input_plugins($field['plugin']);
        if (!$plugin) {
          return;
        }
        $plugin_options = !empty($field['plugin_settings']) ? $field['plugin_settings'] : array();
        $location = $plugin['input callback']($_GET['location'], $plugin_options);
        if (!$location) {
          drupal_set_message(t('The location %address could not be resolved and was ignored.', array(
            '%address' => $_GET['location'],
          )), 'warning');
          return;
        }
        $location = explode(',', $location, 2);
        $filter = array(
          'field' => $key,
          'lat' => $location[0],
          'lon' => $location[1],
        );
        if (isset($_GET['radius'])) {
          $filter['radius'] = $_GET['radius'];
          if ($field['radius_type'] == 'textfield' && is_numeric($field['radius_unit'])) {
            $filter['radius'] *= $field['radius_unit'];
          }
        }
        $location_options[] = $filter;
        break;
      }
    }
  }
  else {
    foreach (_search_api_location_page_filter_parameters($_GET, FALSE) as $key => $value) {
      $field = substr($key, 0, -9);
      $field_options = $page->options['search_api_location'][$field];
      $plugin = search_api_location_get_input_plugins($field_options['plugin']);
      if (!$plugin) {
        continue;
      }
      $plugin_options = !empty($field_options['plugin_settings']) ? $field_options['plugin_settings'] : array();
      $location = $plugin['input callback']($value, $plugin_options);
      if (!$location) {
        drupal_set_message(t('The location %address could not be resolved and was ignored.', array(
          '%address' => $value,
        )), 'warning');
        continue;
      }
      unset($radius);
      if (!empty($_GET[$field . '-radius'])) {
        $radius = $_GET[$field . '-radius'];
      }
      elseif (!empty($field_options['radius_type'])) {
        if ($field_options['radius_type'] == 'fixed') {
          $radius = $field_options['radius_value'];
        }
      }
      $location = explode(',', $location, 2);
      $filter = array(
        'field' => $field,
        'lat' => $location[0],
        'lon' => $location[1],
      );
      if (isset($radius)) {
        $filter['radius'] = $radius;
        $field = $field_options;
        if ($field['radius_type'] == 'textfield' && is_numeric($field['radius_unit'])) {
          $filter['radius'] *= $field['radius_unit'];
        }
      }
      $location_options[] = $filter;
    }
  }
  if ($location_options) {
    $query
      ->setOption('search_api_location', $location_options);
  }
}