ip_geoloc-2.0.0-alpha0/src/Form/GeoCodeAddressForm.php
src/Form/GeoCodeAddressForm.php
<?php
namespace Drupal\ip_geoloc\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\ip_geoloc\Services\IpGeoLocSession;
use Drupal\Core\Config\ConfigFactoryInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\ip_geoloc\Services\IpGeoLocAPI;
use Drupal\geocoder\Geocoder;
/**
* Form to reverse geocode a address to latitud and Longitude.
*/
class GeoCodeAddressForm extends FormBase {
protected $messenger;
protected $moduleHandler;
protected $ipGeolocSession;
protected $configFactory;
protected $api;
protected $geocoder;
/**
* Constructs a \Drupal\ip_geoloc\Form\GeoCodeAddressForm object. Adds the dependency injection.
*/
public function __construct(ConfigFactoryInterface $configFactory,
MessengerInterface $messenger,
ModuleHandler $moduleHandler,
IpGeoLocSession $ipGeolocSession,
IpGeoLocAPI $api,
Geocoder $geocoder) {
$this->configFactory = $configFactory;
$this->messenger = $messenger;
$this->moduleHandler = $moduleHandler;
$this->ipGeolocSession = $ipGeolocSession;
$this->api = $api;
$this->geocoder = $geocoder;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('config.factory'),
$container->get('messenger'),
$container->get('module_handler'),
$container->get('ip_geoloc.session'),
$container->get('ip_geoloc.api'),
$container->get('geocoder')
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'ip_geoloc_geocode_address';
}
/**
* Geocode, using the Geocoder API, the submitted street address.
*
* Stores the geocoded lat/long on the session.
* Modules may implement their own variations by implementing hook_form_alter()
* and appending their own handler to $form['#submit'].
*
* @param array $form
* A form array.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form's current state.
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Migration comment: Part of ip_geoloc_set_location_form definition.
$config = $this->configFactory->get('ip_geoloc.settings');
$location = $this->api->getVisitorLocation();
$is_address_editable = $config->get('ip_geoloc_visitor_address_editable') ? $config->get('ip_geoloc_visitor_address_editable') : TRUE;
$form['street_address'] = [
'#type' => 'textfield',
'#title' => t('Current approximate address'),
'#default_value' => isset($location['formatted_address']) ? $location['formatted_address'] : '',
'#disabled' => !$is_address_editable,
];
if ($is_address_editable) {
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Refine'),
'#button_type' => 'primary',
];
}
$form['#attributes']['class'][] = 'ip-geoloc-address';
$form['#attached']['library'][] = 'ip_geoloc/client_css';
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// Migration comment: Part of ip_geoloc_geocode for submiting ip_geoloc_set_location_form.
if ($this->moduleHandler->moduleExists('geocoder')) {
// Use Google server-side API to retrieve lat/long from entered address.
$plugins = ['googlemaps'];
$address = $form_state->getValue('street_address');
// Array of (ovverriding) options (@see Note* below)
$options = [
// Array of options.
'googlemaps' => [],
];
$addressCollection = $this->geocoder->geocode($address, $plugins, $options);
$point = $addressCollection->get(0);
if (!$point) {
$this->messenger->addMessage($this->t('The address you entered could not be geocoded to a location.'), 'warning');
return;
}
$location = [
'provider' => 'user/google',
'ip_address' => \Drupal::request()->getClientIp(),
'latitude' => $point->getLatitude(),
'longitude' => $point->getLongitude(),
'country' => $point->getCountry(),
'locality' => $point->getLocality(),
'formatted_address' => $point->getStreetName() . ' ' . $point->getStreetNumber(),
// 'accuracy' => $point->data['geocoder_accuracy'],.
];
// print_r($location);die();
// Flatten the point object into a straight location array.
/*foreach ($point->data['geocoder_address_components'] as $component) {
if (!empty($component->long_name)) {
$type = $component->types[0];
$location[$type] = $component->long_name;
if ($type == 'country' && !empty($component->short_name)) {
$location['country_code'] = $component->short_name;
}
}
}*/
$this->ipGeolocSession->setSessionValue('location', $location);
}
// Form always uses location from session.
$form_state->setRebuild();
}
}
