You are here

class SmartIpLocation in Smart IP 8.4

Same name and namespace in other branches
  1. 8.2 src/SmartIpLocation.php \Drupal\smart_ip\SmartIpLocation
  2. 8.3 src/SmartIpLocation.php \Drupal\smart_ip\SmartIpLocation

Implements wrapper and utility methods for Smart IP's data location.

@package Drupal\smart_ip

Hierarchy

Expanded class hierarchy of SmartIpLocation

1 string reference to 'SmartIpLocation'
smart_ip.services.yml in ./smart_ip.services.yml
smart_ip.services.yml
1 service uses SmartIpLocation
smart_ip.smart_ip_location in ./smart_ip.services.yml
Drupal\smart_ip\SmartIpLocation

File

src/SmartIpLocation.php, line 15
Contains \Drupal\smart_ip\SmartIpLocation.

Namespace

Drupal\smart_ip
View source
class SmartIpLocation implements SmartIpLocationInterface {

  /**
   * All Smart IP location data.
   *
   * @var array
   */
  private $allData = [];

  /**
   * Original or raw location data from Smart IP data source.
   *
   * @var mixed
   */
  private $originalData;

  /**
   * The source ID.
   *
   * @var int
   */
  private $source;

  /**
   * The IP address.
   *
   * @var string
   */
  private $ipAddress;

  /**
   * The IP address version.
   *
   * @var string
   */
  private $ipVersion;

  /**
   * The country.
   *
   * @var string
   */
  private $country;

  /**
   * The ISO 3166 2-character country code.
   *
   * @var string
   */
  private $countryCode;

  /**
   * The city.
   *
   * @var string
   */
  private $city;

  /**
   * The region (FIPS).
   *
   * @var string
   */
  private $region;

  /**
   * The region code (FIPS).
   *
   * @var string
   */
  private $regionCode;

  /**
   * The postal / ZIP code.
   *
   * @var string
   */
  private $zip;

  /**
   * The longitude.
   *
   * @var float
   */
  private $longitude;

  /**
   * The latitude.
   *
   * @var float
   */
  private $latitude;

  /**
   * EU country flag.
   *
   * @var bool
   */
  private $isEuCountry;

  /**
   * GDPR country flag.
   *
   * @var bool
   */
  private $isGdprCountry;

  /**
   * The timestamp of the request made.
   *
   * @var integer
   */
  private $timestamp;

  /**
   * The time zone.
   *
   * @var string
   */
  private $timeZone;

  /**
   * Constructs Smart IP location.
   *
   * @param array $values
   *   Array of values for the Smart IP location.
   */
  public function __construct(array $values = []) {
    if (!empty($values)) {
      $this
        ->setData($values);
    }
    else {

      // Populate its location variables with stored data.
      $this
        ->getData(FALSE);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function get($key = NULL) {
    if (!empty($key)) {
      $value = $this->{$key};
      if (!empty($value)) {
        return $value;
      }
      $this
        ->getData(FALSE);
      if (isset($this->allData[$key])) {
        return $this->allData[$key];
      }
      else {
        return NULL;
      }
    }
    return $this
      ->getData(FALSE);
  }

  /**
   * {@inheritdoc}
   */
  public function getData($update = FALSE) {
    if (empty($this->allData)) {
      if ($update) {
        SmartIp::updateUserLocation();
      }

      // Get current user's stored location from session.
      $data = SmartIp::getSession('smart_ip');
      $user = \Drupal::currentUser();
      if (empty($data['location']) && $user
        ->id() != 0) {

        /** @var \Drupal\user\UserData $userData */
        $userData = \Drupal::service('user.data');

        // Get current user's stored location from user_data
        $data = $userData
          ->get('smart_ip', $user
          ->id(), 'geoip_location');
      }
      if (!empty($data['location'])) {

        // Populate the Smart IP location from current user's data or session.
        $this
          ->setData($data['location']);
      }
    }
    return $this->allData;
  }

  /**
   * {@inheritdoc}
   */
  public function set($key, $value) {
    $this->{$key} = $value;
    $this->allData[$key] = $value;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function setData(array $values = []) {
    foreach ($values as $key => $value) {
      $this
        ->set($key, $value);
    }
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function save() {

    // Determine if saving location details of visitor from EU countries are
    // permitted.
    $euVisitorsDontSave = \Drupal::config('smart_ip.settings')
      ->get('eu_visitor_dont_save') && $this->isGdprCountry;

    // Check if the user permitted to share location.
    $shareLocation = SmartIp::getSession('smart_ip_user_share_location_permitted', TRUE);
    if ($shareLocation && !$euVisitorsDontSave) {

      // Save only if user has permission to share location.
      $user = \Drupal::currentUser();
      $uid = $user
        ->id();
      $data['location'] = $this->allData;
      SmartIp::updateFields($data['location']);

      // Allow other modules to modify country list via
      // hook_smart_ip_user_save_alter().
      \Drupal::moduleHandler()
        ->alter('smart_ip_user_save', $user, $data);

      // Save the Smart IP location in current user's session.
      SmartIp::setSession('smart_ip', $data);
      if ($uid != 0) {

        /** @var \Drupal\user\UserData $userData */
        $userData = \Drupal::service('user.data');

        // Save the Smart IP location to current user's user_data
        $userData
          ->set('smart_ip', $uid, 'geoip_location', $data);
      }
    }
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function delete() {
    $user = \Drupal::currentUser();
    $uid = $user
      ->id();
    $this->allData = [];

    // Save the Smart IP location in current user's session.
    SmartIp::setSession('smart_ip', NULL);
    if ($uid != 0) {

      /** @var \Drupal\user\UserData $userData */
      $userData = \Drupal::service('user.data');

      // Delete the Smart IP location in current user's user_data.
      $userData
        ->delete('smart_ip', $uid, 'geoip_location');
    }
    return $this;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
SmartIpLocation::$allData private property All Smart IP location data.
SmartIpLocation::$city private property The city.
SmartIpLocation::$country private property The country.
SmartIpLocation::$countryCode private property The ISO 3166 2-character country code.
SmartIpLocation::$ipAddress private property The IP address.
SmartIpLocation::$ipVersion private property The IP address version.
SmartIpLocation::$isEuCountry private property EU country flag.
SmartIpLocation::$isGdprCountry private property GDPR country flag.
SmartIpLocation::$latitude private property The latitude.
SmartIpLocation::$longitude private property The longitude.
SmartIpLocation::$originalData private property Original or raw location data from Smart IP data source.
SmartIpLocation::$region private property The region (FIPS).
SmartIpLocation::$regionCode private property The region code (FIPS).
SmartIpLocation::$source private property The source ID.
SmartIpLocation::$timestamp private property The timestamp of the request made.
SmartIpLocation::$timeZone private property The time zone.
SmartIpLocation::$zip private property The postal / ZIP code.
SmartIpLocation::delete public function Deletes the Smart IP location data in user data and session. Overrides SmartIpLocationInterface::delete
SmartIpLocation::get public function Gets an item in Smart IP location data or all the Smart IP location data if supplied no parameter. Overrides SmartIpLocationInterface::get
SmartIpLocation::getData public function Gets all the Smart IP location data. Overrides SmartIpLocationInterface::getData
SmartIpLocation::save public function Saves the Smart IP location data to user data and session (for anonymous, saves to session only). Overrides SmartIpLocationInterface::save
SmartIpLocation::set public function Sets an item in Smart IP location data. Overrides SmartIpLocationInterface::set
SmartIpLocation::setData public function Sets the Smart IP location data.. Overrides SmartIpLocationInterface::setData
SmartIpLocation::__construct public function Constructs Smart IP location.
SmartIpLocationInterface::GEOCODED_SMART_IP constant Source ID for Google Map Geocoded Smart IP as geolocation source.
SmartIpLocationInterface::SMART_IP constant Source ID for pure Smart IP as geolocation source.
SmartIpLocationInterface::W3C constant Source ID for W3C as geolocation source.