You are here

IpGeoLocController.php in IP Geolocation Views & Maps 8

File

src/Controller/IpGeoLocController.php
View source
<?php

namespace Drupal\ip_geoloc\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Component\Utility\Html;
use Drupal\ip_geoloc\Services\IpGeoLocSession;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Drupal\Component\Utility\SafeMarkup;
use Drupal\Component\Utility\Unicode;

/**
 * Pending doc.
 */
class IpGeoLocController extends ControllerBase {
  protected $ipGeolocSession;

  /**
   * Constructs a \Drupal\ip_geoloc\Form\GeoCodeAddressForm object.
   */
  public function __construct(IpGeoLocSession $ipGeolocSession) {
    $this->ipGeolocSession = $ipGeolocSession;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('ip_geoloc.session'));
  }

  /**
   * 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 (Unicode::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);
      foreach (taxonomy_get_tree($geo_vocabulary_id) as $term) {
        $term_name = SafeMarkup::checkPlain($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);
  }

}

Classes

Namesort descending Description
IpGeoLocController Pending doc.