You are here

public function Media::prepareSave in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/media/src/Entity/Media.php \Drupal\media\Entity\Media::prepareSave()

Sets the media entity's field values from the source's metadata.

Fetching the metadata could be slow (e.g., if requesting it from a remote API), so this is called by \Drupal\media\MediaStorage::save() prior to it beginning the database transaction, whereas static::preSave() executes after the transaction has already started.

@internal Expose this as an API in https://www.drupal.org/project/drupal/issues/2992426.

File

core/modules/media/src/Entity/Media.php, line 355

Class

Media
Defines the media entity class.

Namespace

Drupal\media\Entity

Code

public function prepareSave() {

  // @todo If the source plugin talks to a remote API (e.g. oEmbed), this code
  // might be performing a fair number of HTTP requests. This is dangerously
  // brittle and should probably be handled by a queue, to avoid doing HTTP
  // operations during entity save. See
  // https://www.drupal.org/project/drupal/issues/2976875 for more.
  // In order for metadata to be mapped correctly, $this->original must be
  // set. However, that is only set once parent::save() is called, so work
  // around that by setting it here.
  if (!isset($this->original) && ($id = $this
    ->id())) {
    $this->original = $this
      ->entityTypeManager()
      ->getStorage('media')
      ->loadUnchanged($id);
  }
  $media_source = $this
    ->getSource();
  foreach ($this->translations as $langcode => $data) {
    if ($this
      ->hasTranslation($langcode)) {
      $translation = $this
        ->getTranslation($langcode);

      // Try to set fields provided by the media source and mapped in
      // media type config.
      foreach ($translation->bundle->entity
        ->getFieldMap() as $metadata_attribute_name => $entity_field_name) {

        // Only save value in entity field if empty. Do not overwrite existing
        // data.
        if ($translation
          ->hasField($entity_field_name) && ($translation
          ->get($entity_field_name)
          ->isEmpty() || $translation
          ->hasSourceFieldChanged())) {
          $translation
            ->set($entity_field_name, $media_source
            ->getMetadata($translation, $metadata_attribute_name));
        }
      }

      // Try to set a default name for this media item if no name is provided.
      if ($translation
        ->get('name')
        ->isEmpty()) {
        $translation
          ->setName($translation
          ->getName());
      }

      // Set thumbnail.
      if ($translation
        ->shouldUpdateThumbnail($this
        ->isNew())) {
        $translation
          ->updateThumbnail();
      }
    }
  }
}