View source
<?php
namespace Drupal\search_api_location_views\Plugin\views\argument;
use Drupal\Core\Form\FormStateInterface;
use Drupal\search_api\Plugin\views\SearchApiHandlerTrait;
use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
class SearchApiLocationPoint extends ArgumentPluginBase {
use SearchApiHandlerTrait;
use SearchApiLocationArgumentTrait;
public function defineOptions() {
$options = parent::defineOptions();
$options['default_radius'] = [
'default' => FALSE,
'bool' => TRUE,
];
$options['radius'] = [
'default' => 10,
];
return $options;
}
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$form['default_radius'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Provide radius default'),
'#description' => $this
->t('Set a default radius for this contextual filter. Even if set, the radius can be overridden with the corresponding "Radius" contextual filter.'),
'#default_value' => $this->options['default_radius'],
];
$states['visible'][':input[name="options[default_radius]"]']['checked'] = TRUE;
$form['radius'] = [
'#type' => 'textfield',
'#title' => $this
->t('Radius'),
'#description' => $this
->t('The radius (in km) around the argument point to set the distance filter.'),
'#required' => TRUE,
'#default_value' => $this->options['radius'],
'#states' => $states,
];
parent::buildOptionsForm($form, $form_state);
}
public function validateOptionsForm(&$form, FormStateInterface $form_state) {
$radius = $form_state
->getValue('options')['radius'];
if (!is_numeric($radius) || $radius <= 0) {
$form_state
->setError($form['radius'], $this
->t('You have to enter a numeric radius greater than 0.'));
}
parent::validateOptionsForm($form, $form_state);
}
public function query($group_by = FALSE) {
if ($geofilt = $this
->parsePoint($this->argument)) {
if ($this->options['default_radius']) {
$geofilt['radius'] = $this->options['radius'];
}
$query = $this
->getQuery();
$location_options = (array) $query
->getOption('search_api_location');
$this
->addFieldOptions($location_options, $geofilt, $this->realField);
$query
->setOption('search_api_location', $location_options);
}
}
protected function parsePoint($argument) {
$point = [];
if (class_exists(\geoPHP::class)) {
try {
$format = \geoPHP::detectFormat($argument);
if ($format) {
$args = explode(':', $format);
array_unshift($args, $argument);
$location = call_user_func_array([
'geoPHP',
'load',
], $args);
$point['lat'] = $location
->y();
$point['lon'] = $location
->x();
}
} catch (\Exception $e) {
}
}
if (empty($point)) {
if (preg_match("/^([+-]?[0-9]+(?:\\.[0-9]+)?),([+-]?[0-9]+(?:\\.[0-9]+)?)\$/", $argument, $match)) {
$point['lat'] = $match[1];
$point['lon'] = $match[2];
}
}
return empty($point) ? FALSE : $point;
}
}