Newer
Older
Alex Pott
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
/**
* @file
* Contains \Drupal\Core\ImageToolkit\ImageToolkitOperationManager.
*/
namespace Drupal\Core\ImageToolkit;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Drupal\Component\Plugin\Factory\DefaultFactory;
use Drupal\Component\Utility\String;
/**
* Manages toolkit operation plugins.
*/
class ImageToolkitOperationManager extends DefaultPluginManager implements ImageToolkitOperationManagerInterface {
/**
* Constructs the ImageToolkitOperationManager 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/ImageToolkit/Operation', $namespaces, $module_handler, 'Drupal\Core\ImageToolkit\Annotation\ImageToolkitOperation');
$this->alterInfo('image_toolkit_operation');
$this->setCacheBackend($cache_backend, 'image_toolkit_operation_plugins');
}
/**
* Returns the plugin ID for a given toolkit and operation.
*
* @param string $toolkit_id
* The toolkit plugin ID.
* @param string $operation
* The operation (e.g. "crop").
*
* @return string
* The plugin ID.
*
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
* When no plugin is available.
*/
protected function getToolkitOperationPluginId($toolkit_id, $operation) {
$definitions = $this->getDefinitions();
$definitions = array_filter($definitions,
function ($definition) use ($toolkit_id, $operation) {
return $definition['toolkit'] == $toolkit_id && $definition['operation'] == $operation;
}
);
if (!$definitions) {
$message = String::format("No image operation plugin for '@toolkit' toolkit and '@operation' operation.", array('@toolkit' => $toolkit_id, '@operation' => $operation));
throw new PluginNotFoundException($toolkit_id . '.' . $operation, $message);
}
else {
// Pickup the first plugin found.
// @todo In https://drupal.org/node/2110591 we'll return here the UI
// selected plugin or the first found if missed.
$definition = reset($definitions);
return $definition['id'];
}
}
/**
* {@inheritdoc}
*/
public function createInstance($plugin_id, array $configuration = array(), ImageToolkitInterface $toolkit = NULL) {
$plugin_definition = $this->getDefinition($plugin_id);
$plugin_class = DefaultFactory::getPluginClass($plugin_id, $plugin_definition);
return new $plugin_class($configuration, $plugin_id, $plugin_definition, $toolkit);
}
/**
* {@inheritdoc}
*/
public function getToolkitOperation(ImageToolkitInterface $toolkit, $operation) {
$plugin_id = $this->getToolkitOperationPluginId($toolkit->getPluginId(), $operation);
return $this->createInstance($plugin_id, array(), $toolkit);
}
}