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);
}
}