navigation_plus-1.0.5/src/EventSubscriber/ReplaceMediaFieldAttributes.php

src/EventSubscriber/ReplaceMediaFieldAttributes.php
<?php

declare(strict_types=1);

namespace Drupal\navigation_plus\EventSubscriber;

use Drupal\Component\Utility\Bytes;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\navigation_plus\Event\EditableFieldAttributes;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Adds the required attributes needed to make media replaceable.
 */
class ReplaceMediaFieldAttributes implements EventSubscriberInterface {

  public function __construct(
    private readonly EntityTypeManagerInterface $entityTypeManager,
    private readonly ConfigFactoryInterface $configFactory,
  ) {}

  public function onEditableFieldAttributes(EditableFieldAttributes $event) {
    $variables = $event->getVariables();
    $element = &$variables['element'];
    /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
    $entity = $element['#object'];
    $field_definition = $entity->getFieldDefinition($element['#field_name']);
    $field_storage = $field_definition->getFieldStorageDefinition();
    if ($field_storage->getType() === 'entity_reference' && $field_storage->getSetting('target_type') === 'media') {
      $medias = $entity->get($element['#field_name'])->referencedEntities();
      foreach ($medias as $delta => $media) {
        // Add attributes to media references so user can drop files right on
        // them to replace it.
        $media_type = $this->entityTypeManager->getStorage('media_type')->load($media->bundle());
        $settings = $media->getSource()->getSourceFieldDefinition($media_type)->getSettings();
        $variables['items'][$delta]['content']['edit_mode_wrapper']['#attributes']['data-media-reference'] = $element['#field_name'];
        $variables['items'][$delta]['content']['edit_mode_wrapper']['#attributes']['data-media-bundle'] = $entity->get($element['#field_name'])->entity->bundle();
        $variables['items'][$delta]['content']['edit_mode_wrapper']['#attributes']['data-timeout'] = $this->configFactory->get('dropzonejs.settings')->get('upload_timeout_ms');
        if (!empty($settings['max_filesize'])) {
          $max_size = round(Bytes::toNumber($settings['max_filesize']) / pow(Bytes::KILOBYTE, 2), 2);
          $variables['items'][$delta]['content']['edit_mode_wrapper']['#attributes']['data-max-file-size'] = $max_size;
        }
        if (!empty($settings['file_extensions'])) {
          $variables['items'][$delta]['content']['edit_mode_wrapper']['#attributes']['data-accepted-files'] = '.' . implode(',.', explode(' ', $settings['file_extensions']));
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    return [
      EditableFieldAttributes::class => ['onEditableFieldAttributes', 200],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc