View source
<?php
namespace Drupal\search_api_location_geocoder\Plugin\search_api_location\location_input;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\geocoder\Geocoder;
use Drupal\search_api_location\LocationInput\LocationInputPluginBase;
use Drupal\Component\Utility\SortArray;
use Symfony\Component\DependencyInjection\ContainerInterface;
class Geocode extends LocationInputPluginBase implements ContainerFactoryPluginInterface {
protected $geocoder;
protected $geocoderConfig;
public function __construct(array $configuration, $plugin_id, $plugin_definition, Geocoder $geocoder, ConfigFactoryInterface $config_factory) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->geocoder = $geocoder;
$this->geocoderConfig = $config_factory
->get('geocoder.settings');
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('geocoder'), $container
->get('config.factory'));
}
public function getParsedInput(array $input) {
if (empty($input['value'])) {
throw new \InvalidArgumentException('Input doesn\'t contain a location value.');
}
else {
$active_plugins = $this
->getActivePlugins();
$plugin_options = (array) $this->geocoderConfig
->get('plugins_options');
$geocoded_addresses = $this->geocoder
->geocode($input['value'], $active_plugins, $plugin_options);
if ($geocoded_addresses) {
return $geocoded_addresses
->first()
->getLatitude() . ',' . $geocoded_addresses
->first()
->getLongitude();
}
}
return NULL;
}
protected function getActivePlugins() {
$plugins = $this->configuration['plugins'];
uasort($plugins, [
SortArray::class,
'sortByWeightProperty',
]);
$active_plugins = [];
foreach ($plugins as $id => $plugin) {
if ($plugin['checked']) {
$active_plugins[$id] = $id;
}
}
return $active_plugins;
}
public function defaultConfiguration() {
$configuration = parent::defaultConfiguration();
$configuration['plugins'] = [];
$geocoderpluginmanager = \Drupal::service('plugin.manager.geocoder.provider');
foreach ($geocoderpluginmanager
->getPluginsAsOptions() as $plugin_id => $plugin_name) {
$configuration['plugins'][$plugin_id]['checked'] = 0;
$configuration['plugins'][$plugin_id]['weight'] = 0;
}
return $configuration;
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$geocoderpluginmanager = \Drupal::service('plugin.manager.geocoder.provider');
$form['plugins'] = [
'#type' => 'table',
'#header' => [
$this
->t('Geocoder plugins'),
$this
->t('Weight'),
],
'#tabledrag' => [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => 'plugins-order-weight',
],
],
'#caption' => $this
->t('Select the Geocoder plugins to use, you can reorder them. The first one to return a valid value will be used.'),
];
foreach ($geocoderpluginmanager
->getPluginsAsOptions() as $plugin_id => $plugin_name) {
$form['plugins'][$plugin_id] = [
'checked' => [
'#type' => 'checkbox',
'#title' => $plugin_name,
'#default_value' => $this->configuration['plugins'][$plugin_id]['checked'],
],
'weight' => [
'#type' => 'weight',
'#title' => $this
->t('Weight for @title', [
'@title' => $plugin_name,
]),
'#title_display' => 'invisible',
'#attributes' => [
'class' => [
'plugins-order-weight',
],
],
'#default_value' => $this->configuration['plugins'][$plugin_id]['weight'],
],
'#attributes' => [
'class' => [
'draggable',
],
],
];
}
$form += parent::buildConfigurationForm($form, $form_state);
return $form;
}
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
}
}