Chris@0: manager = $manager; Chris@0: $this->configurations = $configurations; Chris@0: Chris@0: if (!empty($configurations)) { Chris@0: $instance_ids = array_keys($configurations); Chris@0: $this->instanceIDs = array_combine($instance_ids, $instance_ids); Chris@0: // Store the original order of the instance IDs for export. Chris@0: $this->originalOrder = $this->instanceIDs; Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function initializePlugin($instance_id) { Chris@0: $configuration = isset($this->configurations[$instance_id]) ? $this->configurations[$instance_id] : []; Chris@0: if (!isset($configuration[$this->pluginKey])) { Chris@0: throw new PluginNotFoundException($instance_id); Chris@0: } Chris@0: $this->set($instance_id, $this->manager->createInstance($configuration[$this->pluginKey], $configuration)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sorts all plugin instances in this collection. Chris@0: * Chris@0: * @return $this Chris@0: */ Chris@0: public function sort() { Chris@0: uasort($this->instanceIDs, [$this, 'sortHelper']); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Provides uasort() callback to sort plugins. Chris@0: */ Chris@0: public function sortHelper($aID, $bID) { Chris@0: $a = $this->get($aID); Chris@0: $b = $this->get($bID); Chris@0: return strnatcasecmp($a->getPluginId(), $b->getPluginId()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConfiguration() { Chris@0: $instances = []; Chris@0: // Store the current order of the instances. Chris@0: $current_order = $this->instanceIDs; Chris@0: // Reorder the instances to match the original order, adding new instances Chris@0: // to the end. Chris@0: $this->instanceIDs = $this->originalOrder + $current_order; Chris@0: Chris@0: foreach ($this as $instance_id => $instance) { Chris@18: if (PluginHelper::isConfigurable($instance)) { Chris@0: $instances[$instance_id] = $instance->getConfiguration(); Chris@0: } Chris@0: else { Chris@0: $instances[$instance_id] = $this->configurations[$instance_id]; Chris@0: } Chris@0: } Chris@0: // Restore the current order. Chris@0: $this->instanceIDs = $current_order; Chris@0: return $instances; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setConfiguration($configuration) { Chris@0: // Track each instance ID as it is updated. Chris@0: $unprocessed_instance_ids = $this->getInstanceIds(); Chris@0: Chris@0: foreach ($configuration as $instance_id => $instance_configuration) { Chris@0: $this->setInstanceConfiguration($instance_id, $instance_configuration); Chris@0: // Remove this instance ID from the list being updated. Chris@0: unset($unprocessed_instance_ids[$instance_id]); Chris@0: } Chris@0: Chris@0: // Remove remaining instances that had no configuration specified for them. Chris@0: foreach ($unprocessed_instance_ids as $unprocessed_instance_id) { Chris@0: $this->removeInstanceId($unprocessed_instance_id); Chris@0: } Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Updates the configuration for a plugin instance. Chris@0: * Chris@0: * If there is no plugin instance yet, a new will be instantiated. Otherwise, Chris@0: * the existing instance is updated with the new configuration. Chris@0: * Chris@0: * @param string $instance_id Chris@0: * The ID of a plugin to set the configuration for. Chris@0: * @param array $configuration Chris@0: * The plugin configuration to set. Chris@0: */ Chris@0: public function setInstanceConfiguration($instance_id, array $configuration) { Chris@0: $this->configurations[$instance_id] = $configuration; Chris@0: $instance = $this->get($instance_id); Chris@18: if (PluginHelper::isConfigurable($instance)) { Chris@0: $instance->setConfiguration($configuration); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function addInstanceId($id, $configuration = NULL) { Chris@0: parent::addInstanceId($id); Chris@0: if ($configuration !== NULL) { Chris@0: $this->setInstanceConfiguration($id, $configuration); Chris@0: } Chris@0: if (!isset($this->originalOrder[$id])) { Chris@0: $this->originalOrder[$id] = $id; Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function removeInstanceId($instance_id) { Chris@0: parent::removeInstanceId($instance_id); Chris@0: unset($this->originalOrder[$instance_id]); Chris@0: unset($this->configurations[$instance_id]); Chris@0: } Chris@0: Chris@0: }