You are here

geolocation.inc in Geolocation Field 7

Contains geolocation field migration handler.

File

migrate/destinations/geolocation.inc
View source
<?php

/**
 * @file
 * Contains geolocation field migration handler.
 */

/**
 * Geolocation field migration handler class.
 *
 * Geolocation field requires both latitude and longitude values, so it doesn't
 * make sense to use the primary value, i.e. map to field itself.
 * In order to use it, please map values to the subfields (mapping to the field
 * won't work).
 *
 * Subfields:
 *   - 'lat': Geolocation field latitude value.
 *   - 'lng': Geolocation field longitude value.
 *   - 'language': Geolocation field value language.
 *
 * See more at https://www.drupal.org/node/2671068
 */
class MigrateGeolocationFieldHandler extends MigrateFieldHandler {

  /**
   * {@inheritdoc}
   */
  public function __construct() {
    $this
      ->registerTypes(array(
      'geolocation_latlng',
    ));
  }

  /**
   * {@inheritdoc}
   */
  public static function arguments($lat = NULL, $lng = NULL, $language = NULL) {
    $arguments = array();
    if (!is_null($lat)) {
      $arguments['lat'] = $lat;
    }
    if (!is_null($lng)) {
      $arguments['lng'] = $lng;
    }
    if (!is_null($language)) {
      $arguments['language'] = $language;
    }
    return $arguments;
  }

  /**
   * {@inheritdoc}
   */
  public function fields($type, $instance, $migration = NULL) {
    return array(
      'lat' => t('Subfield: Geolocation field latitude value'),
      'lng' => t('Subfield: Geolocation field longitude value'),
      'language' => t('Subfield:  Geolocation field value language'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function prepare($entity, array $field_info, array $instance, array $values) {
    $arguments = isset($values['arguments']) ? $values['arguments'] : array();
    $arguments += array(
      'lat' => array(),
      'lng' => array(),
    );

    // When a single value is mapped to an argument, Migrate module doesn't wrap
    // it in array.
    foreach (array(
      'lat',
      'lng',
    ) as $subelement) {
      if (!is_array($arguments[$subelement])) {
        $arguments[$subelement] = array(
          $arguments[$subelement],
        );
      }
    }
    $return = array();
    foreach ($arguments['lat'] as $delta => $value) {
      $item = array(
        'lat' => $arguments['lat'][$delta],
        'lng' => isset($arguments['lng'][$delta]) ? $arguments['lng'][$delta] : NULL,
      );
      if ($this
        ->validate($entity, $field_info, $instance, $item)) {
        $language = $this
          ->getGeolocationFieldLanguage($entity, $field_info, $arguments, $delta);
        $return[$language][] = _geolocation_field_precalculate_values($item);
      }
    }
    return !empty($return) ? $return : NULL;
  }

  /**
   * Determines field language.
   *
   * @param object $entity
   *   Entity being processed.
   * @param array $field_info
   *   Field info.
   * @param array $arguments
   *   Arguments passed to the field migration handler.
   * @param int $delta
   *   Field values delta.
   *
   * @return string
   *   Language code.
   *
   * @see MigrateFieldHandler::getFieldLanguage()
   */
  public function getGeolocationFieldLanguage($entity, array $field_info, array $arguments, $delta = 0) {
    static $language = NULL;
    if (is_null($language)) {
      $language = $this
        ->getFieldLanguage($entity, $field_info, $arguments);
    }
    if (!is_array($language)) {
      return $language;
    }
    else {
      if (!empty($language[$delta])) {
        return $language[$delta];
      }
      else {
        return LANGUAGE_NONE;
      }
    }
  }

  /**
   * Validates given geolocation field value item.
   *
   * @param object $entity
   *   Entity being processed.
   * @param array $field_info
   *   Field info.
   * @param array $instance
   *   Field instance.
   * @param array $item
   *   Field values delta.
   *
   * @return bool
   *   TRUE if given item contains valid geolocation field value, FALSE -
   *   otherwise.
   */
  protected function validate($entity, array $field_info, array $instance, array $item) {
    $item_is_valid = TRUE;
    $migration = Migration::currentMigration();
    if ((string) $item['lat'] === '' || (string) $item['lng'] === '') {
      $migration
        ->saveMessage(t('%name: both latitude and longitude values are required.', array(
        '%name' => $instance['label'],
      )), Migration::MESSAGE_ERROR);
      $item_is_valid = FALSE;
    }
    if (!is_numeric($item['lat']) || !is_numeric($item['lng'])) {
      $migration
        ->saveMessage(t('%name: only numeric values are acceptable.', array(
        '%name' => $instance['label'],
      )), Migration::MESSAGE_ERROR);
      $item_is_valid = FALSE;
    }
    if ($item['lat'] < -90 || $item['lat'] > 90 || $item['lng'] < -180 || $item['lng'] > 180) {
      $migration
        ->saveMessage(t('%name: invalid latitude or longitude has been provided.', array(
        '%name' => $instance['label'],
      )), Migration::MESSAGE_ERROR);
      $item_is_valid = FALSE;
    }
    return $item_is_valid;
  }

}

Classes

Namesort descending Description
MigrateGeolocationFieldHandler Geolocation field migration handler class.