Uploading media using media_library should assign group on upload

Created on 6 June 2025, about 2 months ago

Hi, is it somehow possible to assign media to parent group on uploading the media using media_library?
Background:
media_library offers to upload and insert directly - or to first just upload and reload the media_library.
If a user chooses the second option and selects a different media (e.g. trying to upload multiple media before select the one to be inserted) or closing the media_library without inserting the one - and saving the node afterwards - will leave the uploaded media unattached to any group.
For now I use a maybe bad workaround:

use Drupal\group\Entity\GroupRelationship;
use Drupal\group\Entity\Group;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Symfony\Component\HttpFoundation\Request;

/**
 * Implements hook_media_insert().
 *
 * @throws \Drupal\Core\Entity\EntityStorageException
 */
function ddbstudio_general_hooks_media_insert(MediaInterface $media) {
  $mid = $media->id();
  $mediaType = $media->bundle();
  $mediaRelationType = 'cockpit_va-group_media-' . $mediaType;

  $current_user = \Drupal::currentUser();

  // Referer-URL analysieren
  $referer_url = \Drupal::request()->server->get('HTTP_REFERER');
  $fake_request = \Symfony\Component\HttpFoundation\Request::create($referer_url);
  $url_object = \Drupal::service('path.validator')->getUrlIfValid($fake_request->getRequestUri());

  $params = $url_object->getRouteParameters();
  if (isset($params['node'])) {
    $node = \Drupal::entityTypeManager()->getStorage('node')->load($params['node']);
    if ($node instanceof \Drupal\node\NodeInterface) {
      $nid = $node->id();

      // Bestehende Beziehungen zur Node finden
      $relationships = \Drupal::entityTypeManager()
        ->getStorage('group_relationship')
        ->loadByProperties([
          'entity_id' => $nid,
          'type' => 'cockpit_va-70ca4d242eb34a0c55e94',
        ]);

      foreach ($relationships as $relationship) {
        $group = $relationship->getGroup();

        // Prüfen, ob Media bereits verbunden ist
        $existing = \Drupal::entityTypeManager()
          ->getStorage('group_relationship')
          ->loadByProperties([
            'type' => $mediaRelationType, // z. B. 'group_media'
            'entity_id' => $mid,
            'gid' => $group->id(),
          ]);

        if (empty($existing)) {
          // Media zur Gruppe hinzufügen
          $new_relationship = GroupRelationship::create([
            'type' => $mediaRelationType, // <- den richtigen Typnamen verwenden!
            'gid' => $group->id(),
            'entity_type' => 'media',
            'entity_id' => $mid,
          ]);
          $new_relationship->save();
        }
      }
    }
  }
}
Feature request
Status

Active

Version

4.0

Component

Code

Created by

🇩🇪Germany vistree

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

  • Issue created by @vistree
  • 🇩🇪Germany vistree

    I changed the hook a little bit and use library opener now:

    /**
     * Implements hook_media_insert().
     *
     * @throws \Drupal\Core\Entity\EntityStorageException
     */
    function mymodule_media_insert(MediaInterface $media) {
      $mid = $media->id();
      $mediaType = $media->bundle();
      $mediaRelationType = 'cockpit_va-group_media-' . $mediaType;
    
      $request = \Drupal::request();
      $query_params = $request->query->all();
    
      if (!empty($query_params["media_library_opener_parameters"]["entity_type_id"]) && $query_params["media_library_opener_parameters"]["entity_type_id"] == 'node' && !empty($query_params['media_library_opener_parameters']['entity_id'])) {
        $nid = $query_params['media_library_opener_parameters']['entity_id'];
    
        // Bestehende Beziehungen zur Node finden
        $relationships = \Drupal::entityTypeManager()
          ->getStorage('group_relationship')
          ->loadByProperties([
            'entity_id' => $nid,
            'type' => 'cockpit_va-70ca4d242eb34a0c55e94',
          ]);
    
        foreach ($relationships as $relationship) {
          $group = $relationship->getGroup();
    
          // Prüfen, ob Media bereits verbunden ist
          $existing = \Drupal::entityTypeManager()
            ->getStorage('group_relationship')
            ->loadByProperties([
              'type' => $mediaRelationType, // z. B. 'group_media'
              'entity_id' => $mid,
              'gid' => $group->id(),
            ]);
    
          if (empty($existing)) {
            // Media zur Gruppe hinzufügen
            $new_relationship = GroupRelationship::create([
              'type' => $mediaRelationType, // <- den richtigen Typnamen verwenden!
              'gid' => $group->id(),
              'entity_type' => 'media',
              'entity_id' => $mid,
            ]);
            $new_relationship->save();
          }
        }
      }
    }
    
Production build 0.71.5 2024