You are here

abstract class MigrateSourceReference in Relation 8

Same name and namespace in other branches
  1. 8.2 relation_migrate/relation_migrate.source.inc \MigrateSourceReference
  2. 7 relation_migrate/relation_migrate.source.inc \MigrateSourceReference

Migration source for *ference field. This source is primary used in relation_migrate to convert *reference entries into relation entities.

Hierarchy

Expanded class hierarchy of MigrateSourceReference

File

relation_migrate/relation_migrate.source.inc, line 12
Source plugin for *reference fields.

View source
abstract class MigrateSourceReference extends MigrateSource {

  /**
   * Place where data is stored during import.
   */
  protected $result = array();

  /**
   * ID of a row, that will be imported during next iteration.
   */
  protected $next_row = 0;

  /**
   * Machine names of fields that will be imported.
   */
  protected $fields = array();

  /**
   * Field type.
   */
  protected $field_type;

  /**
   * Constructor.
   *
   * @param string $field
   *   Field type machine name.
   * @param array $fields
   *   List of fields to be migrated.
   */
  public function __construct($field_type, array $fields, array $options = array()) {
    parent::__construct($options);
    $this->fields = $fields;
    $this->field_type = $field_type;
  }

  /**
   * Return a string representing the source, for display in the UI.
   */
  public function __toString() {
    return t('Migrate %type fields: %fields', array(
      '%type' => $this->field_type,
      '%fields' => implode(',', $this->fields),
    ));
  }

  /**
   * Returns a list of fields available to be mapped from the source,
   * keyed by field name.
   */
  public function fields() {
    return array(
      'source_type' => t('Source entity type'),
      'source_id' => t('Source entity ID'),
      'destination_type' => t('Destination entity type'),
      'destination_id' => t('Destination entity ID'),
      'field_name' => t('Field name'),
    );
  }

  /**
   * Return the number of available source records.
   */
  public function computeCount() {
    $rows_count = 0;
    foreach ($this->fields as $field_name) {
      $rows_count += \Drupal::database()
        ->query('SELECT count(*) FROM {field_data_' . $field_name . '} WHERE deleted = 0')
        ->fetchField();
    }
    return $rows_count;
  }

  /**
   * Do whatever needs to be done to start a fresh traversal of the source data.
   */
  public function performRewind() {
    $this->result = array();
    $this->next_row = 0;

    // Load data for each field and merge all records in result array.
    foreach ($this->fields as $field_name) {
      $field_info = field_read_field($field_name);
      $columns = array_keys($field_info['columns']);
      if (!empty($field_info) && $field_info['type'] == $this->field_type) {
        $field_data = \Drupal::database()
          ->select('field_data_' . $field_name, 'f')
          ->fields('f', array(
          'entity_type',
          'entity_id',
          'delta',
          $field_name . '_' . $columns[0],
        ))
          ->condition('deleted', 0);
        $field_data
          ->addExpression(":name", 'field_name', array(
          ':name' => $field_name,
        ));
        $field_data = $field_data
          ->execute()
          ->fetchAll();
        $this->result = array_merge($this->result, $field_data);
      }
    }
  }

  /**
   * Constructs row object, that should be returned from $this->getNextRow().
   *
   * @param object $itemRow
   *   item as returned from DB.
   *   Row item as returned from DB.
   * @param string $destination_type
   *   Destiantion entity type.
   * @param string $field_name
   *   Field's machine name.
   */
  protected function _constructRow(stdClass $item, $destination_type, $field_name) {
    $field_info = field_read_field($field_name);
    $columns = array_keys($field_info['columns']);
    $id_key = $field_name . '_' . $columns[0];
    $ret = array(
      'source_type' => $item->entity_type,
      'source_id' => $item->entity_id,
      'destination_type' => $destination_type,
      'destination_id' => $item->{$id_key},
      'field_name' => $field_name,
      'delta' => $item->delta,
    );
    return (object) $ret;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
MigrateSourceReference::$fields protected property Machine names of fields that will be imported.
MigrateSourceReference::$field_type protected property Field type.
MigrateSourceReference::$next_row protected property ID of a row, that will be imported during next iteration.
MigrateSourceReference::$result protected property Place where data is stored during import.
MigrateSourceReference::computeCount public function Return the number of available source records.
MigrateSourceReference::fields public function Returns a list of fields available to be mapped from the source, keyed by field name.
MigrateSourceReference::performRewind public function Do whatever needs to be done to start a fresh traversal of the source data.
MigrateSourceReference::_constructRow protected function Constructs row object, that should be returned from $this->getNextRow().
MigrateSourceReference::__construct public function Constructor. 4
MigrateSourceReference::__toString public function Return a string representing the source, for display in the UI.