You are here

protected function FarmLog::prepareMovement in farmOS 2.x

Prepare a log's movement information.

Parameters

\Drupal\migrate\Row $row: The row object.

1 call to FarmLog::prepareMovement()
FarmLog::prepareRow in modules/core/migrate/src/Plugin/migrate/source/d7/FarmLog.php
Adds additional data to the row.

File

modules/core/migrate/src/Plugin/migrate/source/d7/FarmLog.php, line 61

Class

FarmLog
Log source from database.

Namespace

Drupal\farm_migrate\Plugin\migrate\source\d7

Code

protected function prepareMovement(Row $row) {
  $id = $row
    ->getSourceProperty('id');

  // Determine if we will allow overwriting "Areas" and "Geometry" fields on
  // the log with "Move to" and "Movement geometry" fields.
  $allow_overwrite = Settings::get('farm_migrate_allow_movement_overwrite', FALSE);

  // By default, logs are not movements.
  $is_movement = FALSE;

  // Get movement field values.
  $movement_values = $this
    ->getFieldValues('log', 'field_farm_movement', $id);

  // If the log has a movement, load the Field Collection.
  if (!empty($movement_values)) {

    // Iterate through movement field values to collect field collection item
    // IDs.
    $field_collection_item_ids = [];
    foreach ($movement_values as $movement_value) {
      if (!empty($movement_value['value'])) {
        $field_collection_item_ids[] = $movement_value['value'];
      }
    }

    // There should only be one movement field collection associated with a
    // log, so take the first.
    $fcid = reset($field_collection_item_ids);

    // Query the movement area references.
    $query = $this
      ->select('field_collection_item', 'fci');
    $query
      ->leftJoin('field_data_field_farm_move_to', 'fdffmt', "fdffmt.entity_id = fci.item_id AND fdffmt.entity_type = 'field_collection_item' AND fdffmt.bundle = 'field_farm_movement' AND fdffmt.deleted = 0");
    $query
      ->addField('fdffmt', 'field_farm_move_to_tid', 'tid');
    $query
      ->condition('fci.item_id', $fcid);
    $result = $query
      ->execute()
      ->fetchCol();
    $movement_areas = FALSE;
    if (!empty($result)) {
      foreach ($result as $col) {
        if (!empty($col)) {
          $movement_areas[] = [
            'tid' => $col,
          ];
        }
      }
    }

    // Query the movement geometry.
    $query = $this
      ->select('field_collection_item', 'fci');
    $query
      ->leftJoin('field_data_field_farm_geofield', 'fdffg', "fdffg.entity_id = fci.item_id AND fdffg.entity_type = 'field_collection_item' AND fdffg.bundle = 'field_farm_movement' AND fdffg.deleted = 0");
    $query
      ->addField('fdffg', 'field_farm_geofield_geom', 'geom');
    $query
      ->condition('fci.item_id', $fcid);
    $result = $query
      ->execute()
      ->fetchField();
    $movement_geometry = FALSE;
    if (!empty($result)) {
      $movement_geometry = [
        [
          'geom' => $result,
        ],
      ];
    }

    // Get any areas/geometry stored on the log itself.
    $log_areas = $this
      ->getFieldValues('log', 'field_farm_area', $id);
    $log_geometry = $this
      ->getFieldValues('log', 'field_farm_geofield', $id);

    // If the log has movement areas, then the log is a movement.
    if (!empty($movement_areas)) {
      $is_movement = TRUE;
    }

    // If the log has a movement geometry, but no movement areas, throw an
    // exception.
    if (empty($movement_areas) && !empty($movement_geometry)) {
      $message = 'Movement has a geometry but no areas (log ' . $id . ').';
      $this->idMap
        ->saveMessage([
        'id' => $id,
      ], $message, MigrationInterface::MESSAGE_WARNING);
    }

    // If the log has area references and movement areas, and they are
    // different, throw an exception or print a warning, depending on whether
    // or not we are allowing overwrites.
    if (!empty($log_areas) && !empty($movement_areas) && $log_areas != $movement_areas) {
      $message = 'Log ' . $id . ' has both area references and movement area references. See https://github.com/farmOS/farmOS/blob/2.x/docs/hosting/migration.md#movement-logs';
      if (!$allow_overwrite) {
        throw new MigrateException($message);
      }
      else {
        $this->idMap
          ->saveMessage([
          'id' => $id,
        ], $message, MigrationInterface::MESSAGE_WARNING);
      }
    }

    // If the log has a geometry and a movement geometry, and they are
    // different, throw an exception or print a warning, depending on whether
    // or not we are allowing overwrites.
    if (!empty($log_geometry[0]['geom']) && !empty($movement_geometry[0]['geom']) && $log_geometry[0]['geom'] != $movement_geometry[0]['geom']) {
      $message = 'Log ' . $id . ' has both a geometry and a movement geometry. See https://github.com/farmOS/farmOS/blob/2.x/docs/hosting/migration.md#movement-logs';
      if (!$allow_overwrite) {
        throw new MigrateException($message);
      }
      else {
        $this->idMap
          ->saveMessage([
          'id' => $id,
        ], $message, MigrationInterface::MESSAGE_WARNING);
      }
    }

    // If the log has movement areas, copy them to the log itself.
    // This will overwrite existing area references, but an exception should
    // be thrown above unless overwriting is explicitly allowed.
    if (!empty($movement_areas)) {
      $row
        ->setSourceProperty('field_farm_area', $movement_areas);
    }

    // If the log has a movement geometry, copy it to the log itself.
    // This will overwrite an existing geometry, but an exception should
    // be thrown above unless overwriting is explicitly allowed.
    if (!empty($movement_geometry)) {
      $row
        ->setSourceProperty('field_farm_geofield', $movement_geometry);
    }
  }

  // Set the "is_movement" property for use in migrations.
  $row
    ->setSourceProperty('is_movement', $is_movement);
}