ip_geoloc-2.0.0-alpha0/src/Controller/IpGeoLocController.php
src/Controller/IpGeoLocController.php
<?php
namespace Drupal\ip_geoloc\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Component\Utility\Html;
use Drupal\ip_geoloc\Services\IpGeoLocSession;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
/**
* Pending doc.
*/
class IpGeoLocController extends ControllerBase {
protected $ipGeolocSession;
/**
* Constructs a \Drupal\ip_geoloc\Form\GeoCodeAddressForm object.
*/
public function __construct(IpGeoLocSession $ipGeolocSession, EntityTypeManagerInterface $entityTypeManager) {
$this->ipGeolocSession = $ipGeolocSession;
$this->entityTypeManager = $entityTypeManager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('ip_geoloc.session'),
$container->get('entity_type.manager')
);
}
/**
* Get current location lat long.
*/
public function currentLocation() {
$request = \Drupal::request();
if ($request->get('error') !== NULL) {
// Device/browser does not support getCurrentPosition(), timeout or
// Google reverse-geocode error.
// watchdog() only works at full bootstrap, so store error here and handle
// in ip_geoloc_init() during next click/request.
$error = Html::escape($_POST['error']);
$this->ipGeolocSession->setSessionValue('error', $error);
return new JsonResponse(['response' => $error]);
}
// Flesh out $location with the returned street address components.
$location = [
'ip_address' => $request->getClientIp(),
];
$location_data = $request->request->all();
foreach ($location_data as $key => $value) {
// Ignore crap required for drupal.org/project/js module.
if (mb_substr($key, 0, 3) !== 'js_') {
$location[Html::escape(($key))] = Html::escape(($value));
}
}
$location['provider'] = empty($location['country']) ? 'device' : 'device+google';
$since = $this->ipGeolocSession->getSessionValue('position_pending_since');
// @TODO review this migration to inject dependencies
/*ip_geoloc_debug(t('IPGV&M: returned from position callback in %since s: !location', array(
'%since' => isset($since) ? number_format(microtime(TRUE) - $since, 1) : '?',
'!location' => ip_geoloc_pretty_print($location))));
// If better_statistics module is enabled, we can backfill geolocation
// information to {accesslog} entries occurred since the positioning was
// requested.
if ($since && \Drupal::moduleHandler()->moduleExists('better_statistics')) {
require_once 'plugins/ip_geoloc.statistics.inc';
_ip_geoloc_statistics_backfill($since, $location);
}
if (ip_geoloc_store_location($location) !== FALSE) {
// If successfully stored, don't store again.
$location['ip_address'] = NULL;
}*/
$location['fixed_address'] = 0;
$location['is_updated'] = TRUE;
// Wipe old location before setting the new one (to avoid merging).
$this->ipGeolocSession->setSessionValue('location', NULL);
$this->ipGeolocSession->setSessionValue('location', $location);
// Got fresh location so reset 'position_pending_since' timer.
$this->ipGeolocSession->setSessionValue('position_pending_since', NULL);
// [#2599950], #6.
return new JsonResponse([]);
}
/**
* Autocompletes the partial region received.
*/
public function regionAutocomplete(Request $request) {
$partial_region = $request->query->get('q');
$matches = [];
if (strlen($partial_region) >= 2) {
$geo_vocabulary_id = \Drupal::state()->get('ip_geoloc_geo_vocabulary_id', 0);
$terms =$this->entityTypeManager->getStorage('taxonomy_term')->loadTree($geo_vocabulary_id);
foreach ($terms($geo_vocabulary_id) as $term) {
$term_name = Html::escape($term->name);
// We define a "match" as any 2 consecutive chars, case-insensitive.
$is_match = stripos($term_name, $partial_region) !== FALSE;
if ($is_match) {
$matches[$term_name] = $term_name;
}
}
}
return new JsonResponse($matches);
}
}
