You are here

public function FieldInstance::prepareRow in Drupal 10

Same name in this branch
  1. 10 core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php \Drupal\field\Plugin\migrate\source\d6\FieldInstance::prepareRow()
  2. 10 core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php \Drupal\field\Plugin\migrate\source\d7\FieldInstance::prepareRow()
Same name and namespace in other branches
  1. 8 core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php \Drupal\field\Plugin\migrate\source\d7\FieldInstance::prepareRow()
  2. 9 core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php \Drupal\field\Plugin\migrate\source\d7\FieldInstance::prepareRow()

Adds additional data to the row.

Parameters

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

Return value

bool FALSE if this row needs to be skipped.

Overrides SourcePluginBase::prepareRow

File

core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php, line 135

Class

FieldInstance
Drupal 7 field instances source from database.

Namespace

Drupal\field\Plugin\migrate\source\d7

Code

public function prepareRow(Row $row) {
  foreach (unserialize($row
    ->getSourceProperty('data')) as $key => $value) {
    $row
      ->setSourceProperty($key, $value);
  }
  $field_definition = $this
    ->select('field_config', 'fc')
    ->fields('fc')
    ->condition('id', $row
    ->getSourceProperty('field_id'))
    ->execute()
    ->fetch();
  $row
    ->setSourceProperty('field_definition', $field_definition);

  // Determine the translatable setting.
  $translatable = FALSE;
  if ($row
    ->getSourceProperty('entity_type') == 'node') {
    $language_content_type_bundle = (int) $this
      ->variableGet('language_content_type_' . $row
      ->getSourceProperty('bundle'), 0);

    // language_content_type_[bundle] may be
    // - 0: no language support
    // - 1: language assignment support
    // - 2: node translation support
    // - 4: entity translation support
    if ($language_content_type_bundle === 2 || $language_content_type_bundle === 4 && $row
      ->getSourceProperty('translatable')) {
      $translatable = TRUE;
    }
  }
  else {

    // This is not a node entity. Get the translatable value from the source
    // field_config table.
    $field_data = unserialize($field_definition['data']);
    $translatable = $field_data['translatable'];
  }

  // Check if this is an i18n synchronized field.
  $synchronized_fields = $this
    ->variableGet('i18n_sync_node_type_' . $row
    ->getSourceProperty('bundle'), NULL);
  if ($synchronized_fields) {
    if (in_array($row
      ->getSourceProperty('field_name'), $synchronized_fields)) {
      $translatable = FALSE;
    }
  }
  $row
    ->setSourceProperty('translatable', $translatable);

  // Get the vid for each allowed value for taxonomy term reference fields
  // which is used in a migration_lookup in the process pipeline.
  if ($row
    ->getSourceProperty('type') == 'taxonomy_term_reference') {
    $vocabulary = [];
    $data = unserialize($field_definition['data']);
    foreach ($data['settings']['allowed_values'] as $allowed_value) {
      $vocabulary[] = $allowed_value['vocabulary'];
    }
    $query = $this
      ->select('taxonomy_vocabulary', 'v')
      ->fields('v', [
      'vid',
    ])
      ->condition('machine_name', $vocabulary, 'IN');
    $allowed_vid = $query
      ->execute()
      ->fetchAllAssoc('vid');
    $row
      ->setSourceProperty('allowed_vid', $allowed_vid);

    // If there is an i18n_mode use it to determine if this field is
    // translatable. It is TRUE for i18n_modes 'Vocab Fixed' and  'Translate',
    // for all others it is FALSE. When there is a term reference field with
    // two vocabularies where one vocabulary is translatable and other is not
    // the field itself is set to not translatable. Note mode '5' is not used
    // for taxonomy but is listed here for completeness.
    // - 0: No multilingual options.
    // - 1: Localize. Localizable object.
    // - 2: Fixed Language.
    // - 4: Translate. Multilingual objects.
    // - 5: Objects are translatable, if they have language or localizable
    // if not)
    if ($this
      ->getDatabase()
      ->schema()
      ->fieldExists('taxonomy_vocabulary', 'i18n_mode')) {
      $query = $this
        ->select('taxonomy_vocabulary', 'v')
        ->fields('v', [
        'i18n_mode',
      ])
        ->condition('machine_name', $vocabulary, 'IN');
      $results = $query
        ->execute()
        ->fetchAllAssoc('i18n_mode');
      $translatable = FALSE;
      foreach ($results as $result) {
        if ($result['i18n_mode'] == '2' || $result['i18n_mode'] == '4') {
          $translatable = TRUE;
        }
      }
      $row
        ->setSourceProperty('translatable', $translatable);
    }
  }

  // Get the user roles for user reference fields.
  if ($row
    ->getSourceProperty('type') == 'user_reference') {
    $data = unserialize($field_definition['data']);
    if (!empty($data['settings']['referenceable_roles'])) {
      $rid = $data['settings']['referenceable_roles'];
      $query = $this
        ->select('role', 'r')
        ->fields('r')
        ->condition('rid', $rid, 'IN');
      $results = $query
        ->execute()
        ->fetchAll();
      $row
        ->setSourceProperty('roles', $results);
    }
  }
  return parent::prepareRow($row);
}