You are here

function paragraphs_post_update_set_paragraphs_parent_fields in Paragraphs 8

Set the parent id, type and field name to the already created paragraphs.

Parameters

$sandbox:

1 call to paragraphs_post_update_set_paragraphs_parent_fields()
ParagraphsCompositeRelationshipTest::testParagraphsRevisions in tests/src/Kernel/ParagraphsCompositeRelationshipTest.php
Tests the revision of paragraphs.

File

./paragraphs.post_update.php, line 21
Post update functions for Paragraphs.

Code

function paragraphs_post_update_set_paragraphs_parent_fields(&$sandbox) {

  // Don't execute the function if paragraphs_update_8003() was already executed
  // which used to do the same.
  $module_schema = drupal_get_installed_schema_version('paragraphs');

  // The state entry 'paragraphs_update_8003_placeholder' is used in order to
  // indicate that the placeholder paragraphs_update_8003() function has been
  // executed, so this function needs to be executed as well. If the non
  // placeholder version of paragraphs_update_8003() got executed already, the
  // state won't be set and we skip this update.
  if ($module_schema >= 8003 && !\Drupal::state()
    ->get('paragraphs_update_8003_placeholder', FALSE)) {
    return;
  }
  if (!isset($sandbox['current_paragraph_field_id'])) {
    $paragraph_field_ids = [];

    // Get all the entity reference revisions fields.
    $map = \Drupal::service('entity_field.manager')
      ->getFieldMapByFieldType('entity_reference_revisions');
    foreach ($map as $entity_type_id => $info) {
      foreach ($info as $name => $data) {
        if (FieldStorageConfig::loadByName($entity_type_id, $name)
          ->getSetting('target_type') == 'paragraph') {
          $paragraph_field_ids[] = "{$entity_type_id}.{$name}";
        }
      }
    }
    if (!$paragraph_field_ids) {

      // There are no paragraph fields. Return before initializing the sandbox.
      return;
    }

    // Initialize the sandbox.
    $sandbox['current_paragraph_field_id'] = 0;
    $sandbox['paragraph_field_ids'] = $paragraph_field_ids;
    $sandbox['max'] = count($paragraph_field_ids);
    $sandbox['progress'] = 0;
  }

  /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
  $field_storage = FieldStorageConfig::load($sandbox['paragraph_field_ids'][$sandbox['current_paragraph_field_id']]);

  // For revisionable entity types, we load and update all revisions.
  $target_entity_type = \Drupal::entityTypeManager()
    ->getDefinition($field_storage
    ->getTargetEntityTypeId());
  if ($target_entity_type
    ->isRevisionable()) {
    $revision_id = $target_entity_type
      ->getKey('revision');
    $entity_ids = \Drupal::entityQuery($field_storage
      ->getTargetEntityTypeId())
      ->condition($field_storage
      ->getName(), NULL, 'IS NOT NULL')
      ->range($sandbox['progress'], Settings::get('paragraph_limit', 50))
      ->allRevisions()
      ->sort($revision_id, 'ASC')
      ->accessCheck(FALSE)
      ->execute();
  }
  else {
    $id = $target_entity_type
      ->getKey('id');
    $entity_ids = \Drupal::entityQuery($field_storage
      ->getTargetEntityTypeId())
      ->condition($field_storage
      ->getName(), NULL, 'IS NOT NULL')
      ->range($sandbox['progress'], Settings::get('paragraph_limit', 50))
      ->sort($id, 'ASC')
      ->accessCheck(FALSE)
      ->execute();
  }
  foreach ($entity_ids as $revision_id => $entity_id) {

    // For revisionable entity types, we load a specific revision otherwise load
    // the entity.
    if ($target_entity_type
      ->isRevisionable()) {
      $host_entity = \Drupal::entityTypeManager()
        ->getStorage($field_storage
        ->getTargetEntityTypeId())
        ->loadRevision($revision_id);
    }
    else {
      $host_entity = \Drupal::entityTypeManager()
        ->getStorage($field_storage
        ->getTargetEntityTypeId())
        ->load($entity_id);
    }
    foreach ($host_entity
      ->get($field_storage
      ->getName()) as $field_item) {

      // Skip broken and already updated references (e.g. Nested paragraphs).
      if ($field_item->entity && empty($field_item->entity->parent_type->value)) {

        // Set the parent fields and save, ensure that no new revision is
        // created.
        $field_item->entity->parent_type = $field_storage
          ->getTargetEntityTypeId();
        $field_item->entity->parent_id = $host_entity
          ->id();
        $field_item->entity->parent_field_name = $field_storage
          ->getName();
        $field_item->entity
          ->setNewRevision(FALSE);
        $field_item->entity
          ->save();
      }
    }
  }

  // Continue with the next paragraph_field_id when the loaded entities are less
  // than paragraph_limit.
  if (count($entity_ids) < Settings::get('paragraph_limit', 50)) {
    $sandbox['current_paragraph_field_id']++;
    $sandbox['progress'] = 0;
  }
  else {
    $sandbox['progress'] += Settings::get('paragraph_limit', 50);
  }

  // Update #finished, 1 if the whole update has finished.
  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['current_paragraph_field_id'] / $sandbox['max'];
}