You are here

class MigrateGeolocationFieldHandler in Geolocation Field 7

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

Hierarchy

Expanded class hierarchy of MigrateGeolocationFieldHandler

1 string reference to 'MigrateGeolocationFieldHandler'
geolocation_migrate_api in ./geolocation.migrate.inc
Implement hook_migrate_api().

File

migrate/destinations/geolocation.inc, line 23
Contains geolocation field migration handler.

View source
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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
MigrateFieldHandler::getFieldLanguage function Determine the language of the field.
MigrateGeolocationFieldHandler::arguments public static function
MigrateGeolocationFieldHandler::fields public function
MigrateGeolocationFieldHandler::getGeolocationFieldLanguage public function Determines field language.
MigrateGeolocationFieldHandler::prepare public function
MigrateGeolocationFieldHandler::validate protected function Validates given geolocation field value item.
MigrateGeolocationFieldHandler::__construct public function Overrides MigrateHandler::__construct
MigrateHandler::$dependencies protected property List of other handler classes which should be invoked before the current one.
MigrateHandler::$typesHandled protected property List of "types" handled by this handler. Depending on the kind of handler, these may be destination types, field types, etc.
MigrateHandler::getDependencies public function
MigrateHandler::getTypesHandled public function
MigrateHandler::handlesType public function Does this handler handle the given type? 1
MigrateHandler::registerTypes protected function Register a list of types handled by this class