public function SearchApiFilterLocation::query in Search API Location 8
Add this filter to the query.
Due to the nature of fapi, the value and the operator have an unintended level of indirection. You will find them in $this->operator and $this->value respectively.
Overrides FilterPluginBase::query
File
- modules/
search_api_location_views/ src/ Plugin/ views/ filter/ SearchApiFilterLocation.php, line 179
Class
- SearchApiFilterLocation
- Defines a filter for filtering on location fields.
Namespace
Drupal\search_api_location_views\Plugin\views\filterCode
public function query() {
$plugin_id = $this->options['plugin'];
if (!$plugin_id) {
return;
}
$plugin_options = $this->options['plugin-' . $plugin_id];
/** @var \Drupal\search_api_location\LocationInput\LocationInputInterface $plugin */
$plugin = $this->locationInputManager
->createInstance($plugin_id, $plugin_options);
if (!$plugin
->hasInput($this->value, $this->options)) {
return;
}
$location = $plugin
->getParsedInput($this->value);
if (!$location) {
$this
->messenger()
->addWarning($this
->t('The location %location could not be resolved and was ignored.', [
'%location' => $this->value['value'],
]));
return;
}
$location = explode(',', $location, 2);
/** @var \Drupal\search_api\Query\Query $query */
$query = $this->query;
$location_options = (array) $query
->getOption('search_api_location', []);
// If the radius isn't numeric omit it. Necessary since "no radius" is "-".
$radius = !is_numeric($this->value['distance']['from']) ? NULL : $this->value['distance']['from'];
if ($plugin_options['radius_type'] == 'textfield') {
$units = array_column(search_api_location_get_units(), 'multiplier', 'id');
$multiplier = $units[$plugin_options['radius_units']];
$radius *= $multiplier;
}
$location_options[] = [
'field' => $this->realField,
'lat' => $location[0],
'lon' => $location[1],
'radius' => $radius,
];
$query
->setOption('search_api_location', $location_options);
}