View source
<?php
namespace Drupal\geofield\Plugin\views\field;
use Drupal\Core\Form\FormStateInterface;
use Drupal\geofield\Plugin\views\GeofieldProximityHandlerTrait;
use Drupal\views\Plugin\views\field\NumericField;
use Drupal\views\ResultRow;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\geofield\Plugin\GeofieldProximitySourceManager;
class GeofieldProximityField extends NumericField {
use GeofieldProximityHandlerTrait;
protected $proximitySourceManager;
protected $sourcePlugin;
protected function defineOptions() {
$options = parent::defineOptions();
$options['units'] = [
'default' => 'GEOFIELD_KILOMETERS',
];
$options['source'] = [
'default' => 'geofield_manual_origin',
];
$options['source_configuration'] = [
'default' => [],
];
return $options;
}
public function __construct(array $configuration, $plugin_id, $plugin_definition, GeofieldProximitySourceManager $proximity_source_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->proximitySourceManager = $proximity_source_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('plugin.manager.geofield_proximity_source'));
}
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$context = $this->pluginDefinition['plugin_type'];
$user_input = $form_state
->getUserInput();
$source_plugin_id = isset($user_input['options']['source']) ? $user_input['options']['source'] : $this->options['source'];
$source_plugin_configuration = isset($user_input['options']['source_configuration']) ? $user_input['options']['source_configuration'] : $this->options['source_configuration'];
$this->proximitySourceManager
->buildCommonFormElements($form, $form_state, $context);
$form['units']['#default_value'] = $this->options['units'];
$form['source']['#default_value'] = $this->options['source'];
try {
$this->sourcePlugin = $this->proximitySourceManager
->createInstance($source_plugin_id, $source_plugin_configuration);
$this->sourcePlugin
->setViewHandler($this);
$form['source_configuration']['origin_description'] = [
'#markup' => $this->sourcePlugin
->getPluginDefinition()['description'],
'#weight' => -10,
];
$this->sourcePlugin
->buildOptionsForm($form['source_configuration'], $form_state, [
'source_configuration',
]);
} catch (\Exception $e) {
watchdog_exception('geofield', $e);
}
parent::buildOptionsForm($form, $form_state);
}
public function validateOptionsForm(&$form, FormStateInterface $form_state) {
parent::validateOptionsForm($form, $form_state);
try {
$this->sourcePlugin
->validateOptionsForm($form['source_configuration'], $form_state, [
'source_configuration',
]);
} catch (\Exception $e) {
watchdog_exception('geofield', $e);
$form_state
->setErrorByName($form['source'], $this
->t("The Proximity Source couldn't be set due to: @error", [
'@error' => $e,
]));
}
}
public function getValue(ResultRow $values, $field = NULL) {
try {
$this->sourcePlugin = $this->proximitySourceManager
->createInstance($this->options['source'], $this->options['source_configuration']);
$this->sourcePlugin
->setViewHandler($this);
$this->sourcePlugin
->setUnits($this->options['units']);
return $this->sourcePlugin
->getProximity($values->{$this->aliases['latitude']}, $values->{$this->aliases['longitude']});
} catch (\Exception $e) {
watchdog_exception('geofield', $e);
return NULL;
}
}
public function query() {
$this
->ensureMyTable();
$this
->addAdditionalFields();
}
public function clickSort($order) {
$this
->addQueryOrderBy($order);
}
public function render(ResultRow $values) {
$build = '';
$value = $this
->getValue($values);
if (is_numeric($value)) {
try {
$build = parent::render($values);
} catch (\Exception $e) {
watchdog_exception('geofield', $e);
}
}
return $build;
}
public function adminSummary() {
$output = parent::adminSummary();
return $this->options['source'] . ' - ' . $output;
}
}