function FileFieldItemList::postSave

Same name in other branches
  1. 8.9.x core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php \Drupal\file\Plugin\Field\FieldType\FileFieldItemList::postSave()
  2. 10 core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php \Drupal\file\Plugin\Field\FieldType\FileFieldItemList::postSave()
  3. 11.x 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 (!empty($entity->original) && $entity->getRevisionId() != $entity->original
            ->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->original;
        if ($original->hasTranslation($langcode)) {
            $original_items = $original->getTranslation($langcode)->{$field_name};
            foreach ($original_items 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.