You are here

function taxonomy_update_8702 in Drupal 8

Fix the parent field langcode data.

File

core/modules/taxonomy/taxonomy.install, line 237
Install, update and uninstall functions for the taxonomy module.

Code

function taxonomy_update_8702(&$sandbox) {
  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $field_storage_definition = $definition_update_manager
    ->getFieldStorageDefinition('parent', 'taxonomy_term');
  $entity_type = $definition_update_manager
    ->getEntityType('taxonomy_term');

  // Only perform the update if:
  // - The field is not translatable. It's possible that custom or contrib code
  //   has overridden this.
  // - The field is not revisionable. If it is then
  //   taxonomy_post_update_make_taxonomy_term_revisionable() has already run
  //   and this used to fix the parent field langcode data.
  // - Terms are using a SQL-based storage class.
  if (!$field_storage_definition
    ->isTranslatable() && !$entity_type
    ->isRevisionable() && is_subclass_of($entity_type
    ->getStorageClass(), SqlEntityStorageInterface::class)) {

    // taxonomy_update_8502() populated the langcode field of
    // 'taxonomy_term__parent' using the term's langcode. However, the field is
    // not translatable and, therefore, should use the term's default language.
    $database = \Drupal::database();
    $select = $database
      ->select('taxonomy_term__parent', 'tp');
    $select
      ->join('taxonomy_term_field_data', 'tdf', 'tp.entity_id = tdf.tid AND tdf.langcode <> tp.langcode');
    $select
      ->fields('tp', [
      'entity_id',
    ])
      ->fields('tdf', [
      'tid',
      'langcode',
    ])
      ->condition('tdf.default_langcode', 1);
    if (!isset($sandbox['max'])) {
      $count_query = clone $select;
      $sandbox['max'] = $count_query
        ->countQuery()
        ->execute()
        ->fetchField();
      $sandbox['current'] = 0;
    }
    $result = $select
      ->execute();
    $processed = 0;
    while ($row = $result
      ->fetchAssoc()) {
      $database
        ->update('taxonomy_term__parent')
        ->condition('entity_id', $row['tid'])
        ->fields([
        'langcode' => $row['langcode'],
      ])
        ->execute();
      $sandbox['current']++;
      $processed++;
      if ($processed >= Settings::get('entity_update_batch_size', 50)) {
        break;
      }
    }
  }
  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['current'] / $sandbox['max'];
}