geolocation-8.x-3.x-dev/src/Plugin/geolocation/Location/IpStack.php

src/Plugin/geolocation/Location/IpStack.php
<?php

namespace Drupal\geolocation\Plugin\geolocation\Location;

use Drupal\geolocation\Attribute\Location;
use Drupal\geolocation\LocationBase;
use Drupal\geolocation\LocationInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Fixed coordinates map center.
 */
#[Location(
  id: 'ipstack',
  name: new \Drupal\Core\StringTranslation\TranslatableMarkup('ipstack Service'),
  description: new \Drupal\Core\StringTranslation\TranslatableMarkup('See https://ipstack.com/ website. Limited to 10000 requests per month. Access key required.')
)]
class IpStack extends LocationBase implements LocationInterface {

  /**
   * {@inheritdoc}
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    protected Request $request,
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): LocationInterface {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('request_stack')->getCurrentRequest()
    );
  }

  /**
   * {@inheritdoc}
   */
  public static function getDefaultSettings(): array {
    return [
      'access_key' => '',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function getSettingsForm(?string $location_option_id = NULL, array $settings = [], $context = NULL): array {
    $settings = $this->getSettings($settings);

    $form['access_key'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Access Key'),
      '#default_value' => $settings['access_key'],
      '#size' => 60,
      '#maxlength' => 128,
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function getCoordinates(string $location_option_id, array $location_option_settings, $context = NULL): array {
    $settings = $this->getSettings($location_option_settings);
    // Access Key is required.
    if (empty($settings['access_key'])) {
      return [];
    }

    // Get client IP.
    $ip = $this->request->getClientIp();
    if (empty($ip)) {
      return [];
    }

    // Get data from api.ipstack.com.
    $json = file_get_contents("https://api.ipstack.com/" . $ip . "?access_key=" . $settings['access_key']);
    if (empty($json)) {
      return [];
    }

    $result = json_decode($json, TRUE);
    if (
      empty($result)
      || empty($result['latitude'])
      || empty($result['longitude'])
    ) {
      return [];
    }

    return [
      'lat' => (float) $result['latitude'],
      'lng' => (float) $result['longitude'],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc