Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\Plugin;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Plugin\Exception\PluginNotFoundException;
|
Chris@0
|
6 use Drupal\Component\Plugin\LazyPluginCollection;
|
Chris@18
|
7 use Drupal\Component\Plugin\PluginHelper;
|
Chris@0
|
8 use Drupal\Component\Plugin\PluginManagerInterface;
|
Chris@0
|
9 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Provides a default plugin collection for a plugin type.
|
Chris@0
|
13 *
|
Chris@0
|
14 * A plugin collection is used to contain plugins that will be lazily
|
Chris@0
|
15 * instantiated. The configurations of each potential plugin are passed in, and
|
Chris@0
|
16 * the configuration key containing the plugin ID is specified by
|
Chris@0
|
17 * self::$pluginKey.
|
Chris@0
|
18 */
|
Chris@0
|
19 class DefaultLazyPluginCollection extends LazyPluginCollection {
|
Chris@0
|
20 use DependencySerializationTrait;
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * The manager used to instantiate the plugins.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @var \Drupal\Component\Plugin\PluginManagerInterface
|
Chris@0
|
26 */
|
Chris@0
|
27 protected $manager;
|
Chris@0
|
28
|
Chris@0
|
29 /**
|
Chris@0
|
30 * The initial configuration for each plugin in the collection.
|
Chris@0
|
31 *
|
Chris@0
|
32 * @var array
|
Chris@0
|
33 * An associative array containing the initial configuration for each plugin
|
Chris@0
|
34 * in the collection, keyed by plugin instance ID.
|
Chris@0
|
35 */
|
Chris@0
|
36 protected $configurations = [];
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * The key within the plugin configuration that contains the plugin ID.
|
Chris@0
|
40 *
|
Chris@0
|
41 * @var string
|
Chris@0
|
42 */
|
Chris@0
|
43 protected $pluginKey = 'id';
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * The original order of the instances.
|
Chris@0
|
47 *
|
Chris@0
|
48 * @var array
|
Chris@0
|
49 */
|
Chris@0
|
50 protected $originalOrder = [];
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * Constructs a new DefaultLazyPluginCollection object.
|
Chris@0
|
54 *
|
Chris@0
|
55 * @param \Drupal\Component\Plugin\PluginManagerInterface $manager
|
Chris@0
|
56 * The manager to be used for instantiating plugins.
|
Chris@0
|
57 * @param array $configurations
|
Chris@0
|
58 * (optional) An associative array containing the initial configuration for
|
Chris@0
|
59 * each plugin in the collection, keyed by plugin instance ID.
|
Chris@0
|
60 */
|
Chris@0
|
61 public function __construct(PluginManagerInterface $manager, array $configurations = []) {
|
Chris@0
|
62 $this->manager = $manager;
|
Chris@0
|
63 $this->configurations = $configurations;
|
Chris@0
|
64
|
Chris@0
|
65 if (!empty($configurations)) {
|
Chris@0
|
66 $instance_ids = array_keys($configurations);
|
Chris@0
|
67 $this->instanceIDs = array_combine($instance_ids, $instance_ids);
|
Chris@0
|
68 // Store the original order of the instance IDs for export.
|
Chris@0
|
69 $this->originalOrder = $this->instanceIDs;
|
Chris@0
|
70 }
|
Chris@0
|
71 }
|
Chris@0
|
72
|
Chris@0
|
73 /**
|
Chris@0
|
74 * {@inheritdoc}
|
Chris@0
|
75 */
|
Chris@0
|
76 protected function initializePlugin($instance_id) {
|
Chris@0
|
77 $configuration = isset($this->configurations[$instance_id]) ? $this->configurations[$instance_id] : [];
|
Chris@0
|
78 if (!isset($configuration[$this->pluginKey])) {
|
Chris@0
|
79 throw new PluginNotFoundException($instance_id);
|
Chris@0
|
80 }
|
Chris@0
|
81 $this->set($instance_id, $this->manager->createInstance($configuration[$this->pluginKey], $configuration));
|
Chris@0
|
82 }
|
Chris@0
|
83
|
Chris@0
|
84 /**
|
Chris@0
|
85 * Sorts all plugin instances in this collection.
|
Chris@0
|
86 *
|
Chris@0
|
87 * @return $this
|
Chris@0
|
88 */
|
Chris@0
|
89 public function sort() {
|
Chris@0
|
90 uasort($this->instanceIDs, [$this, 'sortHelper']);
|
Chris@0
|
91 return $this;
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * Provides uasort() callback to sort plugins.
|
Chris@0
|
96 */
|
Chris@0
|
97 public function sortHelper($aID, $bID) {
|
Chris@0
|
98 $a = $this->get($aID);
|
Chris@0
|
99 $b = $this->get($bID);
|
Chris@0
|
100 return strnatcasecmp($a->getPluginId(), $b->getPluginId());
|
Chris@0
|
101 }
|
Chris@0
|
102
|
Chris@0
|
103 /**
|
Chris@0
|
104 * {@inheritdoc}
|
Chris@0
|
105 */
|
Chris@0
|
106 public function getConfiguration() {
|
Chris@0
|
107 $instances = [];
|
Chris@0
|
108 // Store the current order of the instances.
|
Chris@0
|
109 $current_order = $this->instanceIDs;
|
Chris@0
|
110 // Reorder the instances to match the original order, adding new instances
|
Chris@0
|
111 // to the end.
|
Chris@0
|
112 $this->instanceIDs = $this->originalOrder + $current_order;
|
Chris@0
|
113
|
Chris@0
|
114 foreach ($this as $instance_id => $instance) {
|
Chris@18
|
115 if (PluginHelper::isConfigurable($instance)) {
|
Chris@0
|
116 $instances[$instance_id] = $instance->getConfiguration();
|
Chris@0
|
117 }
|
Chris@0
|
118 else {
|
Chris@0
|
119 $instances[$instance_id] = $this->configurations[$instance_id];
|
Chris@0
|
120 }
|
Chris@0
|
121 }
|
Chris@0
|
122 // Restore the current order.
|
Chris@0
|
123 $this->instanceIDs = $current_order;
|
Chris@0
|
124 return $instances;
|
Chris@0
|
125 }
|
Chris@0
|
126
|
Chris@0
|
127 /**
|
Chris@0
|
128 * {@inheritdoc}
|
Chris@0
|
129 */
|
Chris@0
|
130 public function setConfiguration($configuration) {
|
Chris@0
|
131 // Track each instance ID as it is updated.
|
Chris@0
|
132 $unprocessed_instance_ids = $this->getInstanceIds();
|
Chris@0
|
133
|
Chris@0
|
134 foreach ($configuration as $instance_id => $instance_configuration) {
|
Chris@0
|
135 $this->setInstanceConfiguration($instance_id, $instance_configuration);
|
Chris@0
|
136 // Remove this instance ID from the list being updated.
|
Chris@0
|
137 unset($unprocessed_instance_ids[$instance_id]);
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 // Remove remaining instances that had no configuration specified for them.
|
Chris@0
|
141 foreach ($unprocessed_instance_ids as $unprocessed_instance_id) {
|
Chris@0
|
142 $this->removeInstanceId($unprocessed_instance_id);
|
Chris@0
|
143 }
|
Chris@0
|
144 return $this;
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 /**
|
Chris@0
|
148 * Updates the configuration for a plugin instance.
|
Chris@0
|
149 *
|
Chris@0
|
150 * If there is no plugin instance yet, a new will be instantiated. Otherwise,
|
Chris@0
|
151 * the existing instance is updated with the new configuration.
|
Chris@0
|
152 *
|
Chris@0
|
153 * @param string $instance_id
|
Chris@0
|
154 * The ID of a plugin to set the configuration for.
|
Chris@0
|
155 * @param array $configuration
|
Chris@0
|
156 * The plugin configuration to set.
|
Chris@0
|
157 */
|
Chris@0
|
158 public function setInstanceConfiguration($instance_id, array $configuration) {
|
Chris@0
|
159 $this->configurations[$instance_id] = $configuration;
|
Chris@0
|
160 $instance = $this->get($instance_id);
|
Chris@18
|
161 if (PluginHelper::isConfigurable($instance)) {
|
Chris@0
|
162 $instance->setConfiguration($configuration);
|
Chris@0
|
163 }
|
Chris@0
|
164 }
|
Chris@0
|
165
|
Chris@0
|
166 /**
|
Chris@0
|
167 * {@inheritdoc}
|
Chris@0
|
168 */
|
Chris@0
|
169 public function addInstanceId($id, $configuration = NULL) {
|
Chris@0
|
170 parent::addInstanceId($id);
|
Chris@0
|
171 if ($configuration !== NULL) {
|
Chris@0
|
172 $this->setInstanceConfiguration($id, $configuration);
|
Chris@0
|
173 }
|
Chris@0
|
174 if (!isset($this->originalOrder[$id])) {
|
Chris@0
|
175 $this->originalOrder[$id] = $id;
|
Chris@0
|
176 }
|
Chris@0
|
177 }
|
Chris@0
|
178
|
Chris@0
|
179 /**
|
Chris@0
|
180 * {@inheritdoc}
|
Chris@0
|
181 */
|
Chris@0
|
182 public function removeInstanceId($instance_id) {
|
Chris@0
|
183 parent::removeInstanceId($instance_id);
|
Chris@0
|
184 unset($this->originalOrder[$instance_id]);
|
Chris@0
|
185 unset($this->configurations[$instance_id]);
|
Chris@0
|
186 }
|
Chris@0
|
187
|
Chris@0
|
188 }
|