dynamic_image_generator-1.0.x-dev/src/DynamicImageManager.php

src/DynamicImageManager.php
<?php

namespace Drupal\dynamic_image_generator;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\media\Entity\Media;

/**
 * Service for managing dynamic image media entities.
 */
class DynamicImageManager {

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The logger service.
   *
   * @var \Psr\Log\LoggerInterface
   */
  protected $logger;

  /**
   * Constructs a DynamicImageManager object.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory
   *   The logger factory service.
   */
  public function __construct(
    EntityTypeManagerInterface $entity_type_manager,
    LoggerChannelFactoryInterface $logger_factory
  ) {
    $this->entityTypeManager = $entity_type_manager;
    $this->logger = $logger_factory->get('dynamic_image_generator');
  }

  /**
   * Get all dynamic image media entities for a specific entity.
   *
   * @param int $entity_id
   *   The entity ID.
   * @param string $entity_type
   *   The entity type (defaults to 'node').
   *
   * @return \Drupal\media\Entity\Media[]
   *   Array of dynamic image media entities.
   */
  public function getDynamicImageMediaForEntity($entity_id, $entity_type = 'node') {
    $media_storage = $this->entityTypeManager->getStorage('media');

    $query = $media_storage->getQuery()
      ->condition('bundle', 'dynamic_image')
      ->condition('field_entity_id_generated', $entity_id)
      ->accessCheck(FALSE)
      ->sort('created', 'DESC');

    $media_ids = $query->execute();

    if (empty($media_ids)) {
      return [];
    }

    return $media_storage->loadMultiple($media_ids);
  }

  /**
   * Get dynamic image media by template and entity.
   *
   * @param int $template_entity_id
   *   The template entity ID.
   * @param int $entity_id
   *   The entity ID.
   *
   * @return \Drupal\media\Entity\Media|null
   *   The dynamic image media entity or NULL if not found.
   */
  public function getDynamicImageMediaByTemplate($template_entity_id, $entity_id) {
    $media_storage = $this->entityTypeManager->getStorage('media');

    $query = $media_storage->getQuery()
      ->condition('bundle', 'dynamic_image')
      ->condition('field_poster_id', $template_entity_id)
      ->condition('field_entity_id_generated', $entity_id)
      ->accessCheck(FALSE)
      ->range(0, 1)
      ->sort('created', 'DESC');

    $media_ids = $query->execute();

    if (!empty($media_ids)) {
      $media_id = reset($media_ids);
      return $media_storage->load($media_id);
    }

    return NULL;
  }

  /**
   * Delete old dynamic image media entities for cleanup.
   *
   * @param int $entity_id
   *   The entity ID.
   * @param int $keep_count
   *   Number of recent images to keep (defaults to 5).
   *
   * @return int
   *   Number of deleted media entities.
   */
  public function cleanupOldDynamicImages($entity_id, $keep_count = 5) {
    $media_storage = $this->entityTypeManager->getStorage('media');

    // Get all dynamic image media for this entity, sorted by creation date
    $query = $media_storage->getQuery()
      ->condition('bundle', 'dynamic_image')
      ->condition('field_entity_id_generated', $entity_id)
      ->accessCheck(FALSE)
      ->sort('created', 'DESC');

    $media_ids = $query->execute();

    if (count($media_ids) <= $keep_count) {
      return 0; // Nothing to clean up
    }

    // Get the IDs of media to delete (all except the most recent $keep_count)
    $media_to_delete = array_slice($media_ids, $keep_count);

    $deleted_count = 0;
    foreach ($media_to_delete as $media_id) {
      try {
        $media = $media_storage->load($media_id);
        if ($media) {
          $media->delete();
          $deleted_count++;
        }
      }
      catch (\Exception $e) {
        $this->logger->error('Error deleting dynamic image media @id: @error', [
          '@id' => $media_id,
          '@error' => $e->getMessage(),
        ]);
      }
    }

    $this->logger->info('Cleaned up @count old dynamic image media entities for entity @entity_id', [
      '@count' => $deleted_count,
      '@entity_id' => $entity_id,
    ]);

    return $deleted_count;
  }

  /**
   * Get dynamic image media statistics.
   *
   * @return array
   *   Array containing statistics about dynamic image media.
   */
  public function getStatistics() {
    $media_storage = $this->entityTypeManager->getStorage('media');

    // Count total dynamic image media
    $total_query = $media_storage->getQuery()
      ->condition('bundle', 'dynamic_image')
      ->accessCheck(FALSE)
      ->count();
    $total_count = $total_query->execute();

    // Count dynamic image media created in the last 30 days
    $recent_query = $media_storage->getQuery()
      ->condition('bundle', 'dynamic_image')
      ->condition('created', strtotime('-30 days'), '>=')
      ->accessCheck(FALSE)
      ->count();
    $recent_count = $recent_query->execute();

    // Get template entities and their usage
    $template_storage = $this->entityTypeManager->getStorage('poster_entity');
    $template_query = $template_storage->getQuery()
      ->condition('status', 1)
      ->accessCheck(FALSE);
    $template_entities = $template_query->execute();

    $template_usage = [];
    foreach ($template_entities as $template_id) {
      $usage_query = $media_storage->getQuery()
        ->condition('bundle', 'dynamic_image')
        ->condition('field_poster_id', $template_id)
        ->accessCheck(FALSE)
        ->count();
      $usage_count = $usage_query->execute();

      $template_usage[$template_id] = $usage_count;
    }

    return [
      'total_dynamic_images' => $total_count,
      'recent_dynamic_images' => $recent_count,
      'template_usage' => $template_usage,
      'active_templates' => count($template_entities),
    ];
  }

  /**
   * Regenerate dynamic image for an entity using a specific template.
   *
   * @param int $template_entity_id
   *   The template entity ID.
   * @param int $entity_id
   *   The entity ID.
   * @param bool $force_regenerate
   *   Whether to force regeneration even if an image already exists.
   *
   * @return \Drupal\media\Entity\Media|null
   *   The created or existing media entity.
   */
  public function regenerateDynamicImage($template_entity_id, $entity_id, $force_regenerate = FALSE) {
    // Check if dynamic image already exists
    if (!$force_regenerate) {
      $existing_media = $this->getDynamicImageMediaByTemplate($template_entity_id, $entity_id);
      if ($existing_media) {
        return $existing_media;
      }
    }

    // Use the dynamic image generator service to create new image
    $dynamic_image_generator = \Drupal::service('dynamic_image_generator.dynamic_image_generator_service');
    $image_url = $dynamic_image_generator->generateDynamicImage($template_entity_id, [], $entity_id);

    if ($image_url) {
      // The service should have created the media entity
      return $this->getDynamicImageMediaByTemplate($template_entity_id, $entity_id);
    }

    return NULL;
  }

  /**
   * Get the URL of a dynamic image from media entity.
   *
   * @param \Drupal\media\Entity\Media $media
   *   The dynamic image media entity.
   * @param string $image_style
   *   Optional image style to apply.
   *
   * @return string|null
   *   The image URL or NULL if not found.
   */
  public function getDynamicImageUrl(Media $media, $image_style = NULL) {
    $image_field = $media->get('field_poster_image');
    if ($image_field->isEmpty()) {
      return NULL;
    }

    $file = $image_field->entity;
    if (!$file) {
      return NULL;
    }

    if ($image_style) {
      $image_style_storage = $this->entityTypeManager->getStorage('image_style');
      $style = $image_style_storage->load($image_style);
      if ($style) {
        return $style->buildUrl($file->getFileUri());
      }
    }

    return $file->createFileUrl();
  }
}

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

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