public function FileFieldItemList::postSave in Zircon Profile 8
Same name and namespace in other branches
- 8.0 core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php \Drupal\file\Plugin\Field\FieldType\FileFieldItemList::postSave()
Defines custom post-save behavior for field values.
This method is called during the process of saving an entity, just after item values are written into storage.
Parameters
bool $update: Specifies whether the entity is being updated or created.
Return value
bool Whether field items should be rewritten to the storage as a consequence of the logic implemented by the custom behavior.
Overrides FieldItemList::postSave
See also
\Drupal\Core\Field\FieldItemInterface::postSave()
File
- core/
modules/ file/ src/ Plugin/ Field/ FieldType/ FileFieldItemList.php, line 26 - Contains \Drupal\file\Plugin\Field\FieldType\FileFieldItemList.
Class
- FileFieldItemList
- Represents a configurable entity file field.
Namespace
Drupal\file\Plugin\Field\FieldTypeCode
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 = array();
/** @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 = array();
$langcode = $this
->getLangcode();
$original = $entity->original;
$original_items = $original
->hasTranslation($langcode) ? $original
->getTranslation($langcode)->{$field_name} : $original->{$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::entityManager()
->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());
}
}
}
}