function FileFieldItemList::postSave

Same name and namespace in other branches
  1. 9 core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php \Drupal\file\Plugin\Field\FieldType\FileFieldItemList::postSave()
  2. 8.9.x core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php \Drupal\file\Plugin\Field\FieldType\FileFieldItemList::postSave()
  3. 10 core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php \Drupal\file\Plugin\Field\FieldType\FileFieldItemList::postSave()

Overrides FieldItemList::postSave

File

core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php, line 21

Class

FileFieldItemList
Represents a configurable entity file field.

Namespace

Drupal\file\Plugin\Field\FieldType

Code

public function postSave($update) {
  $entity = $this->getEntity();
  if (!$update) {
    // Add a new usage for newly uploaded files.
    foreach ($this->referencedEntities() as $file) {
      \Drupal::service('file.usage')->add($file, 'file', $entity->getEntityTypeId(), $entity->id());
    }
  }
  else {
    // Get current target file entities and file IDs.
    $files = $this->referencedEntities();
    $ids = [];
    /** @var \Drupal\file\FileInterface $file */
    foreach ($files as $file) {
      $ids[] = $file->id();
    }
    // On new revisions, all files are considered to be a new usage and no
    // deletion of previous file usages are necessary.
    if ($entity->getRevisionId() != $entity->getOriginal()?->getRevisionId()) {
      foreach ($files as $file) {
        \Drupal::service('file.usage')->add($file, 'file', $entity->getEntityTypeId(), $entity->id());
      }
      return;
    }
    // Get the file IDs attached to the field before this update.
    $field_name = $this->getFieldDefinition()
      ->getName();
    $original_ids = [];
    $langcode = $this->getLangcode();
    $original = $entity->getOriginal();
    if ($original->hasTranslation($langcode)) {
      foreach ($original->getTranslation($langcode)->{$field_name} as $item) {
        $original_ids[] = $item->target_id;
      }
    }
    // Decrement file usage by 1 for files that were removed from the field.
    $removed_ids = array_filter(array_diff($original_ids, $ids));
    $removed_files = \Drupal::entityTypeManager()->getStorage('file')
      ->loadMultiple($removed_ids);
    foreach ($removed_files as $file) {
      \Drupal::service('file.usage')->delete($file, 'file', $entity->getEntityTypeId(), $entity->id());
    }
    // Add new usage entries for newly added files.
    foreach ($files as $file) {
      if (!in_array($file->id(), $original_ids)) {
        \Drupal::service('file.usage')->add($file, 'file', $entity->getEntityTypeId(), $entity->id());
      }
    }
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.