class MediaThumbnailManager in Media Thumbnails 8
Provides the Media thumbnail plugin manager.
Hierarchy
- class \Drupal\Component\Plugin\PluginManagerBase implements PluginManagerInterface uses DiscoveryTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements CachedDiscoveryInterface, PluginManagerInterface, CacheableDependencyInterface uses DiscoveryCachedTrait, UseCacheBackendTrait
- class \Drupal\media_thumbnails\Plugin\MediaThumbnailManager implements \Symfony\Component\DependencyInjection\ContainerAwareInterface uses \Symfony\Component\DependencyInjection\ContainerAwareTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements CachedDiscoveryInterface, PluginManagerInterface, CacheableDependencyInterface uses DiscoveryCachedTrait, UseCacheBackendTrait
Expanded class hierarchy of MediaThumbnailManager
1 string reference to 'MediaThumbnailManager'
1 service uses MediaThumbnailManager
File
- src/
Plugin/ MediaThumbnailManager.php, line 22
Namespace
Drupal\media_thumbnails\PluginView source
class MediaThumbnailManager extends DefaultPluginManager implements ContainerAwareInterface {
use ContainerAwareTrait;
/**
* List of mime types and corresponding plugin ids.
*
* @var array
*/
protected $plugins;
/**
* Constructs a new MediaThumbnailManager object.
*
* @param \Traversable $namespaces
* An object that implements \Traversable which contains the root paths
* keyed by the corresponding namespace to look for plugin implementations.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
* Cache backend instance to use.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler to invoke the alter hook with.
*/
public function __construct(Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
parent::__construct('Plugin/MediaThumbnail', $namespaces, $module_handler, MediaThumbnailInterface::class, MediaThumbnail::class);
$this
->alterInfo('media_thumbnails_media_thumbnail_info');
$this
->setCacheBackend($cache_backend, 'media_thumbnails_media_thumbnail_plugins');
$this->plugins = [];
// Build a list of unique mime types supported by thumbnail plugins.
$definitions = $this
->getDefinitions();
foreach ($definitions as $id => $definition) {
foreach ($definition['mime'] as $mime) {
$this->plugins[$mime] = $id;
}
}
}
/**
* Create a new media thumbnail.
*
* @param \Drupal\media\MediaInterface $media
* The media object.
*/
public function createThumbnail(MediaInterface $media) {
// Get a thumbnail plugin id for supported media types.
if (!($plugin = $this
->getPluginId($media))) {
return;
}
// Get the global configuration to pass it to the plugins.
$config = $this->container
->get('config.factory')
->get('media_thumbnails.settings')
->get();
// Create a plugin instance.
try {
/** @var \Drupal\media_thumbnails\Plugin\MediaThumbnailInterface $instance */
$instance = $this
->createInstance($plugin, $config);
} catch (PluginException $e) {
return;
}
// Create the thumbnail file using the plugin.
/** @var \Drupal\file\Entity\File $file */
$file = $this
->getSource($media);
if (!($file = $instance
->createThumbnail($file
->getFileUri()))) {
return;
}
// Add this file to the media entity.
$media
->set('thumbnail', $file);
}
/**
* Update a media thumbnail.
*
* @param \Drupal\media\MediaInterface $media
* The media object.
*/
public function updateThumbnail(MediaInterface $media) {
$this
->deleteThumbnail($media);
$this
->createThumbnail($media);
}
/**
* Delete a media thumbnail.
*
* @param \Drupal\media\MediaInterface $media
* The media object.
*/
public function deleteThumbnail(MediaInterface $media) {
// Get the thumbnail file object.
/** @var \Drupal\file\FileInterface $thumbnail */
$thumbnail = $this
->getThumbnail($media);
// Remove the thumbnail from the media entity.
$media
->set('thumbnail', NULL);
// Don't delete thumbnails used in other places.
/** @var \Drupal\file\FileUsage\FileUsageInterface $fileUsage */
$fileUsage = $this->container
->get('file.usage');
$usage = $fileUsage
->listUsage($thumbnail);
$count = 0;
array_walk_recursive($usage, static function () use (&$count) {
$count++;
});
if ($count > 1) {
return;
}
// Don't delete generic default thumbnails.
if ($thumbnail
->getCreatedTime() < $media
->getCreatedTime()) {
return;
}
// Delete the thumbnail file.
try {
$thumbnail
->delete();
} catch (EntityStorageException $e) {
}
}
/**
* Get the source file object for a media entity, if any.
*
* @param \Drupal\media\MediaInterface $media
* The given media entity.
*
* @return \Drupal\Core\Entity\EntityInterface|null
* The loaded file object.
*/
public function getSource(MediaInterface $media) {
try {
return $this
->getFileObject($media, $media
->getSource()
->getConfiguration()['source_field']);
} catch (Exception $e) {
return NULL;
}
}
/**
* Get the thumbnail file object for a media entity, if any.
*
* @param \Drupal\media\MediaInterface $media
* The given media entity.
*
* @return \Drupal\Core\Entity\EntityInterface|null
* The loaded file object.
*/
public function getThumbnail(MediaInterface $media) {
try {
return $this
->getFileObject($media, 'thumbnail');
} catch (Exception $e) {
return NULL;
}
}
/**
* Get a media file object, either source or thumbnail.
*
* @param \Drupal\media\MediaInterface $media
* The given media entity.
* @param string $field_name
* The field name of the source file, or 'thumbnail'.
*
* @return \Drupal\Core\Entity\EntityInterface|null
* The loaded file object.
*/
public function getFileObject(MediaInterface $media, $field_name) {
// Fetch the thumbnail file id, if any.
try {
$fid = $media
->get($field_name)
->first()
->getValue()['target_id'];
} catch (Exception $e) {
return NULL;
}
// Return the corresponding file object, if any.
return $this->container
->get('entity_type.manager')
->getStorage('file')
->load($fid);
}
/**
* Check if the media source is a local file.
*
* @param \Drupal\media\MediaInterface $media
* The media entity.
*
* @return bool
* TRUE if there is a local file, FALSE otherwise.
*/
public function isLocal(MediaInterface $media) : bool {
$source = $media
->getSource()
->getConfiguration()['source_field'];
return $media
->get($source) instanceof FileFieldItemList;
}
/**
* Get the thumbnail plugin id for a media entity, if any.
*
* @param \Drupal\media\MediaInterface $media
* The media entity.
*
* @return string|null
* Plugin id if there is a plugin, NULL otherwise
*/
public function getPluginId(MediaInterface $media) {
if (!$this
->isLocal($media)) {
return NULL;
}
$source = $media
->getSource()
->getConfiguration()['source_field'];
try {
$first = $media
->get($source)
->first();
$file = $first ? $first
->getValue() : NULL;
} catch (MissingDataException $e) {
return NULL;
}
if (!isset($file['target_id'])) {
return NULL;
}
/** @var \Drupal\file\Entity\File $file */
$file = $this->container
->get('entity_type.manager')
->getStorage('file')
->load($file['target_id']);
if (!$file) {
return NULL;
}
$mime = $file
->getMimeType();
return $this->plugins[$mime] ?? NULL;
}
/**
* Check if the media source has a thumbnail plugin.
*
* @param \Drupal\media\MediaInterface $media
* The media entity.
*
* @return bool
* TRUE if there is a plugin, FALSE otherwise.
*/
public function hasPlugin(MediaInterface $media) : bool {
return (bool) $this
->getPluginId($media);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DefaultPluginManager:: |
protected | property | Additional namespaces the annotation discovery mechanism should scan for annotation definitions. | |
DefaultPluginManager:: |
protected | property | Name of the alter hook if one should be invoked. | |
DefaultPluginManager:: |
protected | property | The cache key. | |
DefaultPluginManager:: |
protected | property | An array of cache tags to use for the cached definitions. | |
DefaultPluginManager:: |
protected | property | A set of defaults to be referenced by $this->processDefinition() if additional processing of plugins is necessary or helpful for development purposes. | 9 |
DefaultPluginManager:: |
protected | property | The module handler to invoke the alter hook. | 1 |
DefaultPluginManager:: |
protected | property | An object that implements \Traversable which contains the root paths keyed by the corresponding namespace to look for plugin implementations. | |
DefaultPluginManager:: |
protected | property | The name of the annotation that contains the plugin definition. | |
DefaultPluginManager:: |
protected | property | The interface each plugin should implement. | 1 |
DefaultPluginManager:: |
protected | property | The subdirectory within a namespace to look for plugins, or FALSE if the plugins are in the top level of the namespace. | |
DefaultPluginManager:: |
protected | function | Invokes the hook to alter the definitions if the alter hook is set. | 1 |
DefaultPluginManager:: |
protected | function | Sets the alter hook name. | |
DefaultPluginManager:: |
public | function |
Clears static and persistent plugin definition caches. Overrides CachedDiscoveryInterface:: |
5 |
DefaultPluginManager:: |
protected | function | Extracts the provider from a plugin definition. | |
DefaultPluginManager:: |
protected | function | Finds plugin definitions. | 7 |
DefaultPluginManager:: |
private | function | Fix the definitions of context-aware plugins. | |
DefaultPluginManager:: |
public | function |
The cache contexts associated with this object. Overrides CacheableDependencyInterface:: |
|
DefaultPluginManager:: |
protected | function | Returns the cached plugin definitions of the decorated discovery class. | |
DefaultPluginManager:: |
public | function |
The maximum age for which this object may be cached. Overrides CacheableDependencyInterface:: |
|
DefaultPluginManager:: |
public | function |
The cache tags associated with this object. Overrides CacheableDependencyInterface:: |
|
DefaultPluginManager:: |
public | function |
Gets the definition of all plugins for this type. Overrides DiscoveryTrait:: |
2 |
DefaultPluginManager:: |
protected | function |
Gets the plugin discovery. Overrides PluginManagerBase:: |
12 |
DefaultPluginManager:: |
protected | function |
Gets the plugin factory. Overrides PluginManagerBase:: |
|
DefaultPluginManager:: |
public | function | Performs extra processing on plugin definitions. | 13 |
DefaultPluginManager:: |
protected | function | Determines if the provider of a definition exists. | 3 |
DefaultPluginManager:: |
public | function | Initialize the cache backend. | |
DefaultPluginManager:: |
protected | function | Sets a cache of plugin definitions for the decorated discovery class. | |
DefaultPluginManager:: |
public | function |
Disable the use of caches. Overrides CachedDiscoveryInterface:: |
1 |
DiscoveryCachedTrait:: |
protected | property | Cached definitions array. | 1 |
DiscoveryCachedTrait:: |
public | function |
Overrides DiscoveryTrait:: |
3 |
DiscoveryTrait:: |
protected | function | Gets a specific plugin definition. | |
DiscoveryTrait:: |
public | function | ||
MediaThumbnailManager:: |
protected | property | List of mime types and corresponding plugin ids. | |
MediaThumbnailManager:: |
public | function | Create a new media thumbnail. | |
MediaThumbnailManager:: |
public | function | Delete a media thumbnail. | |
MediaThumbnailManager:: |
public | function | Get a media file object, either source or thumbnail. | |
MediaThumbnailManager:: |
public | function | Get the thumbnail plugin id for a media entity, if any. | |
MediaThumbnailManager:: |
public | function | Get the source file object for a media entity, if any. | |
MediaThumbnailManager:: |
public | function | Get the thumbnail file object for a media entity, if any. | |
MediaThumbnailManager:: |
public | function | Check if the media source has a thumbnail plugin. | |
MediaThumbnailManager:: |
public | function | Check if the media source is a local file. | |
MediaThumbnailManager:: |
public | function | Update a media thumbnail. | |
MediaThumbnailManager:: |
public | function |
Constructs a new MediaThumbnailManager object. Overrides DefaultPluginManager:: |
|
PluginManagerBase:: |
protected | property | The object that discovers plugins managed by this manager. | |
PluginManagerBase:: |
protected | property | The object that instantiates plugins managed by this manager. | |
PluginManagerBase:: |
protected | property | The object that returns the preconfigured plugin instance appropriate for a particular runtime condition. | |
PluginManagerBase:: |
public | function |
Creates a pre-configured instance of a plugin. Overrides FactoryInterface:: |
12 |
PluginManagerBase:: |
public | function |
Gets a preconfigured instance of a plugin. Overrides MapperInterface:: |
7 |
PluginManagerBase:: |
protected | function | Allows plugin managers to specify custom behavior if a plugin is not found. | 1 |
UseCacheBackendTrait:: |
protected | property | Cache backend instance. | |
UseCacheBackendTrait:: |
protected | property | Flag whether caches should be used or skipped. | |
UseCacheBackendTrait:: |
protected | function | Fetches from the cache backend, respecting the use caches flag. | 1 |
UseCacheBackendTrait:: |
protected | function | Stores data in the persistent cache, respecting the use caches flag. |