diff --git a/modules/payment_test/src/Plugin/PluginTest/MockConfigurablePlugin.php b/modules/payment_test/src/Plugin/PluginTest/MockConfigurablePlugin.php index 69a0b9c..36d9603 100644 --- a/modules/payment_test/src/Plugin/PluginTest/MockConfigurablePlugin.php +++ b/modules/payment_test/src/Plugin/PluginTest/MockConfigurablePlugin.php @@ -47,7 +47,7 @@ class MockConfigurablePlugin extends PluginBase implements ConfigurablePluginInt */ public function setConfiguration(array $configuration) { $this->configuration = $configuration + $this->defaultConfiguration(); - $this->setContainingFieldItemConfiguration($this->configuration); + $this->setContainingFieldItemConfiguration(); } /** diff --git a/src/Entity/Payment.php b/src/Entity/Payment.php index f4ef039..94457b4 100644 --- a/src/Entity/Payment.php +++ b/src/Entity/Payment.php @@ -77,7 +77,7 @@ class Payment extends ContentEntityBase implements PaymentInterface { * {@inheritdoc} */ public function getPaymentType() { - /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemBase $field_item */ + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $field_item */ $field_item = $this->get('payment_type')[0]; return $field_item->getContainedPluginInstance(); @@ -110,9 +110,7 @@ class Payment extends ContentEntityBase implements PaymentInterface { * {@inheritdoc} */ public function setLineItems(array $line_items) { - /** @var \Drupal\payment\Plugin\Payment\LineItem\PaymentLineItemInterface[] $line_items */ foreach ($line_items as $line_item) { - $line_item->setPayment($this); $this->setLineItem($line_item); } @@ -126,7 +124,6 @@ class Payment extends ContentEntityBase implements PaymentInterface { $line_item->setPayment($this); $line_items = $this->getLineItems(); $line_items[] = $line_item; - $this->get('line_items')->applyDefaultValue(); foreach (array_values($line_items) as $delta => $line_item) { $this->get('line_items')[$delta]->setValue($line_item); } @@ -155,7 +152,7 @@ class Payment extends ContentEntityBase implements PaymentInterface { */ public function getLineItems() { $line_items = []; - /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemBase $field_item */ + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $field_item */ foreach ($this->get('line_items') as $field_item) { /** @var \Drupal\payment\Plugin\Payment\LineItem\PaymentLineItemInterface $line_item */ $line_item = $field_item->getContainedPluginInstance(); @@ -199,10 +196,10 @@ class Payment extends ContentEntityBase implements PaymentInterface { */ public function setPaymentStatuses(array $statuses) { /** @var \Drupal\payment\Plugin\Payment\Status\PaymentStatusInterface[] $statuses */ - foreach ($statuses as $status) { + foreach (array_values($statuses) as $delta => $status) { $status->setPayment($this); + $this->get('payment_statuses')[$delta]->setValue($status, FALSE); } - $this->get('payment_statuses')->setValue($statuses, FALSE); return $this; } @@ -210,23 +207,22 @@ class Payment extends ContentEntityBase implements PaymentInterface { /** * {@inheritdoc} */ - public function setPaymentStatus(PluginPaymentStatusInterface $status, $notify = TRUE) { + public function setPaymentStatus(PluginPaymentStatusInterface $status) { $previous_status = $this->getPaymentStatus(); $status->setPayment($this); // Prevent duplicate statuses. - $payment_statuses = $this->getPaymentStatuses(); if (!$this->getPaymentStatus() || $this->getPaymentStatus()->getPluginId() != $status->getPluginId()) { $payment_statuses = $this->getPaymentStatuses(); $payment_statuses[] = $status; - $this->get('payment_statuses')->setValue($payment_statuses); - } - if ($notify) { - /** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher */ - $event_dispatcher = \Drupal::service('event_dispatcher'); - $event = new PaymentStatusSet($this, $previous_status); - $event_dispatcher->dispatch(PaymentEvents::PAYMENT_STATUS_SET, $event); - // @todo Invoke Rules event. + foreach (array_values($payment_statuses) as $delta => $payment_status) { + $this->get('payment_statuses')[$delta]->setValue($payment_status); + } } + /** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher */ + $event_dispatcher = \Drupal::service('event_dispatcher'); + $event = new PaymentStatusSet($this, $previous_status); + $event_dispatcher->dispatch(PaymentEvents::PAYMENT_STATUS_SET, $event); + // @todo Invoke Rules event. return $this; } @@ -236,8 +232,9 @@ class Payment extends ContentEntityBase implements PaymentInterface { */ public function getPaymentStatuses() { $payment_statuses = []; - /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemBase $field_item */ + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $field_item */ foreach ($this->get('payment_statuses') as $field_item) { + debug('NEMAN'); $payment_statuses[] = $field_item->getContainedPluginInstance(); } @@ -249,7 +246,7 @@ class Payment extends ContentEntityBase implements PaymentInterface { */ public function getPaymentStatus() { $deltas = []; - /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemBase $field_item */ + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $field_item */ foreach ($this->get('payment_statuses') as $delta => $field_item) { $deltas[] = $delta; } @@ -263,7 +260,7 @@ class Payment extends ContentEntityBase implements PaymentInterface { */ public function setPaymentMethod(PluginPaymentMethodInterface $payment_method) { $payment_method->setPayment($this); - /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemBase $field_item */ + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $field_item */ $field_item = $this->get('payment_method')[0]; $field_item->setContainedPluginInstance($payment_method); @@ -274,7 +271,7 @@ class Payment extends ContentEntityBase implements PaymentInterface { * {@inheritdoc} */ public function getPaymentMethod() { - /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemBase $field_item */ + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $field_item */ $field_item = $this->get('payment_method')[0]; return $field_item->getContainedPluginInstance(); diff --git a/src/Entity/Payment/PaymentStorage.php b/src/Entity/Payment/PaymentStorage.php index 5ea6ca6..e5c330d 100644 --- a/src/Entity/Payment/PaymentStorage.php +++ b/src/Entity/Payment/PaymentStorage.php @@ -105,7 +105,7 @@ class PaymentStorage extends SqlContentEntityStorage { $record = parent::mapToStorageRecord($entity, $table_name); $deltas = []; - foreach ($payment->get('payment_statuses') as $delta => $item) { + foreach ($payment->getPaymentStatuses() as $delta => $item) { $deltas[] = $delta; } $record->first_payment_status_delta = min($deltas); diff --git a/src/Entity/PaymentInterface.php b/src/Entity/PaymentInterface.php index 435b46f..1b67197 100644 --- a/src/Entity/PaymentInterface.php +++ b/src/Entity/PaymentInterface.php @@ -118,12 +118,10 @@ interface PaymentInterface extends ContentEntityInterface, EntityChangedInterfac * Sets a status. * * @param \Drupal\payment\Plugin\Payment\Status\PaymentStatusInterface $status - * @param bool $notify - * Whether or not to trigger a notification event. * * @return \Drupal\payment\Entity\PaymentInterface */ - public function setPaymentStatus(PluginPaymentStatusInterface $status, $notify = TRUE); + public function setPaymentStatus(PluginPaymentStatusInterface $status); /** * Gets all payment statuses. diff --git a/src/Plugin/DataType/ArrayData.php b/src/Plugin/DataType/ArrayData.php deleted file mode 100644 index b89033e..0000000 --- a/src/Plugin/DataType/ArrayData.php +++ /dev/null @@ -1,36 +0,0 @@ -getParent(); + if ($parent->getContainedPluginInstance() instanceof ConfigurablePluginInterface) { + parent::setValue((array) $value, $notify); + $parent->_updateContainedPluginWithPluginConfiguration(); + } + } + + /** + * {@inheritdoc} + */ + public function _setValueFromContainingFieldItem($value) { + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $parent */ + $parent = $this->getParent(); + if ($parent->getContainedPluginInstance() instanceof ConfigurablePluginInterface) { + parent::setValue((array) $value); + } + } + +} diff --git a/src/Plugin/DataType/PluginDataInterface.php b/src/Plugin/DataType/PluginDataInterface.php new file mode 100644 index 0000000..6c3292b --- /dev/null +++ b/src/Plugin/DataType/PluginDataInterface.php @@ -0,0 +1,22 @@ +getParent(); + $parent->_updateContainedPluginWithPluginId(); + } + + /** + * {@inheritdoc} + */ + public function _setValueFromContainingFieldItem($value) { + parent::setValue((string) $value); + } + +} diff --git a/src/Plugin/DataType/PluginInstance.php b/src/Plugin/DataType/PluginInstance.php new file mode 100644 index 0000000..93cc317 --- /dev/null +++ b/src/Plugin/DataType/PluginInstance.php @@ -0,0 +1,58 @@ +setContainingFieldItem($this->getParent()); + } + else { + $value = NULL; + } + parent::setValue($value, $notify); + if ($value) { + /** @var \Drupal\payment\Plugin\Field\FieldType\PluginBagItemInterface $parent */ + $parent = $this->getParent(); + $parent->_updateContainedPluginWithPluginInstance(); + } + } + + /** + * {@inheritdoc} + */ + public function _setValueFromContainingFieldItem($value) { + if (!$value instanceof FieldTypePluginInterface) { + $value = NULL; + } + parent::setValue($value); + } + +} diff --git a/src/Plugin/Field/FieldType/PluginBagItemBase.php b/src/Plugin/Field/FieldType/PluginBagItemBase.php index 627c608..7244f9c 100644 --- a/src/Plugin/Field/FieldType/PluginBagItemBase.php +++ b/src/Plugin/Field/FieldType/PluginBagItemBase.php @@ -18,14 +18,14 @@ use Drupal\payment\Plugin\Payment\FieldTypePluginInterface; /** * Provides a base for plugin bag field items. */ -abstract class PluginBagItemBase extends FieldItemBase { +abstract class PluginBagItemBase extends FieldItemBase implements PluginBagItemInterface { /** - * Whether the field properties and plugin are being synchronized. + * Whether the plugin configuration is being updated from within the plugin. * - * @var bool + *@var bool */ - protected $synchronizing = FALSE; + protected $_setContainedPluginConfigurationFromPlugin = FALSE; /** * The previously contained plugin instance. @@ -35,58 +35,39 @@ abstract class PluginBagItemBase extends FieldItemBase { protected $previouslyContainedPluginInstance; /** - * Returns the manager for plugins of the type contained by this item. - * - * @return \Drupal\Component\Plugin\PluginManagerInterface - */ - abstract protected function getPluginManager(); - - /** - * Validates a plugin instance. - * - * @param \Drupal\payment\Plugin\Payment\FieldTypePluginInterface $plugin_instance - * - * @throws \Exception + * {@inheritdoc} */ - protected function validatePluginInstance(FieldTypePluginInterface $plugin_instance) { + public function validatePluginInstance(FieldTypePluginInterface $plugin_instance) { if (!$this->getPluginManager()->hasDefinition($plugin_instance->getPluginId())) { throw new \Exception(sprintf('Plugin manager %s does not have a definition for plugin %s.', get_class($this->getPluginManager()), $plugin_instance->getPluginId())); } } /** - * Creates a plugin instance. - * - * @param string $plugin_id - * @param mixed[] $plugin_configuration - * - * @return \Drupal\Component\Plugin\PluginInspectionInterface + * {@inheritdoc} */ - protected function createContainedPluginInstance($plugin_id, array $plugin_configuration = []) { - /** @var \Drupal\payment\Plugin\Payment\FieldTypePluginInterface $plugin_instance */ - $plugin_instance = $this->getPluginManager()->createInstance($plugin_id, $plugin_configuration); - $this->validatePluginInstance($plugin_instance); - $plugin_instance->setContainingFieldItem($this); - - return $plugin_instance; + public function createContainedPluginInstance($plugin_id, array $plugin_configuration = []) { + if ($plugin_id) { + /** @var \Drupal\payment\Plugin\Payment\FieldTypePluginInterface $plugin_instance */ + $plugin_instance = $this->getPluginManager() + ->createInstance($plugin_id, $plugin_configuration); + $this->validatePluginInstance($plugin_instance); + $plugin_instance->setContainingFieldItem($this); + + return $plugin_instance; + } + return NULL; } /** - * Gets the instantiated plugin. - * - * @return \Drupal\payment\Plugin\Payment\FieldTypePluginInterface|null - * The plugin or NULL if no plugin was set yet. + * {@inheritdoc} */ public function getContainedPluginInstance() { return $this->get('plugin_instance')->getValue(); } /** - * Sets the instantiated plugin. - * - * @param \Drupal\Component\Plugin\PluginInspectionInterface $plugin_instance - * - * @return $this + * {@inheritdoc} */ public function setContainedPluginInstance(PluginInspectionInterface $plugin_instance) { $this->get('plugin_instance')->setValue($plugin_instance); @@ -95,31 +76,26 @@ abstract class PluginBagItemBase extends FieldItemBase { } /** - * Resets the instantiated plugin. - * - * @return $this + * {@inheritdoc} */ - public function resetContainedPluginInstance() { - $this->get('plugin_instance')->applyDefaultValue(); + public function _updateContainedPluginWithPluginInstance() { + $this->setContainedPluginId($this->getContainedPluginInstance()->getPluginId()); + if ($this->getContainedPluginInstance() instanceof ConfigurablePluginInterface) { + $this->setContainedPluginConfiguration($this->getContainedPluginInstance()->getConfiguration()); + } return $this; } /** - * Gets the plugin ID. - * - * @return string + * {@inheritdoc} */ public function getContainedPluginId() { return $this->get('plugin_id')->getValue(); } /** - * Sets the plugin ID. - * - * @param string $plugin_id - * - * @return $this + * {@inheritdoc} */ public function setContainedPluginId($plugin_id) { $this->get('plugin_id')->setValue($plugin_id); @@ -128,20 +104,29 @@ abstract class PluginBagItemBase extends FieldItemBase { } /** - * Sets the plugin configuration. - * - * @return mixed[] + * {@inheritdoc} + */ + public function _updateContainedPluginWithPluginId() { + if (!$this->getContainedPluginInstance() || $this->getContainedPluginInstance()->getPluginId() != $this->getContainedPluginId()) { + $plugin_instance = $this->createContainedPluginInstance($this->getContainedPluginId()); + if ($plugin_instance) { + $this->setContainedPluginInstance($plugin_instance); + $this->setContainedPluginConfiguration([]); + } + } + + return $this; + } + + /** + * {@inheritdoc} */ public function getContainedPluginConfiguration() { return $this->get('plugin_configuration')->getValue(); } /** - * Sets the plugin configuration. - * - * @param mixed[] $configuration - * - * @return $this + * {@inheritdoc} */ public function setContainedPluginConfiguration(array $configuration) { $this->get('plugin_configuration')->setValue($configuration); @@ -150,16 +135,12 @@ abstract class PluginBagItemBase extends FieldItemBase { } /** - * Sets the plugin configuration without typed data notifications. - * - * @param mixed[] $configuration - * - * @return $this + * {@inheritdoc} */ - public function _setContainedPluginConfigurationFromContainedPlugin(array $configuration) { - $this->synchronizing = TRUE; - $this->setContainedPluginConfiguration($configuration); - $this->synchronizing = FALSE; + public function _updateContainedPluginWithPluginConfiguration() { + if ($this->getContainedPluginInstance() instanceof ConfigurablePluginInterface && !$this->_setContainedPluginConfigurationFromPlugin) { + $this->getContainedPluginInstance()->setConfiguration($this->getContainedPluginConfiguration()); + } return $this; } @@ -167,79 +148,28 @@ abstract class PluginBagItemBase extends FieldItemBase { /** * {@inheritdoc} */ - public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { - $properties['plugin_id'] = DataDefinition::create('string') - ->setLabel(t('Plugin ID')); - $properties['plugin_configuration'] = MapDataDefinition::create('payment_array') - ->setLabel(t('Plugin configuration')); - $properties['plugin_instance'] = MapDataDefinition::create('any') - ->setLabel(t('Plugin instance')); + public function _setContainedPluginConfigurationFromPlugin() { + if ($this->getContainedPluginInstance() instanceof ConfigurablePluginInterface) { + $this->_setContainedPluginConfigurationFromPlugin = TRUE; + $this->setContainedPluginConfiguration($this->getContainedPluginInstance()->getConfiguration()); + $this->_setContainedPluginConfigurationFromPlugin = FALSE; + } - return $properties; + return $this; } /** * {@inheritdoc} */ - public function onChange($property_name) { - if ($property_name == 'plugin_id') { - if ($this->get($property_name)->getValue()) { - $plugin_instance = $this->createContainedPluginInstance($this->getContainedPluginId()); - if ($this->previouslyContainedPluginInstance) { - $this->previouslyContainedPluginInstance->unsetContainingFieldItem(); - } - $this->previouslyContainedPluginInstance = $plugin_instance; - $this->get('plugin_instance')->setValue($plugin_instance, FALSE); - if ($plugin_instance instanceof ConfigurablePluginInterface) { - $this->get('plugin_configuration')->setValue($plugin_instance->getConfiguration(), FALSE); - } - else { - $this->get('plugin_configuration')->applyDefaultValue(FALSE); - } - } - else { - $this->get('plugin_instance')->applyDefaultValue(FALSE); - $this->get('plugin_configuration')->applyDefaultValue(FALSE); - } - } - - if ($property_name == 'plugin_configuration' && !$this->synchronizing) { - /** @var \Drupal\Component\Plugin\ConfigurablePluginInterface $plugin_instance */ - $plugin_instance = $this->getContainedPluginInstance(); - if ($plugin_instance instanceof ConfigurablePluginInterface) { - $plugin_instance->setConfiguration($this->get($property_name)->getValue()); - } - else { - $this->get('plugin_configuration')->applyDefaultValue(FALSE); - } - } - - if ($property_name == 'plugin_instance') { - if ($this->previouslyContainedPluginInstance) { - $this->previouslyContainedPluginInstance->unsetContainingFieldItem(); - } - $plugin_instance = $this->getContainedPluginInstance(); - $this->previouslyContainedPluginInstance = $plugin_instance; - if ($plugin_instance) { - $plugin_instance->setContainingFieldItem($this); - $this->validatePluginInstance($plugin_instance); - $this->get('plugin_id') - ->setValue($plugin_instance->getPluginId(), FALSE); - if ($plugin_instance instanceof ConfigurablePluginInterface) { - $this->get('plugin_configuration') - ->setValue($plugin_instance->getConfiguration(), FALSE); - } - else { - $this->get('plugin_configuration')->applyDefaultValue(FALSE); - } - } - else { - $this->get('plugin_id')->applyDefaultValue(FALSE); - $this->get('plugin_configuration')->applyDefaultValue(FALSE); - } - } + public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { + $properties['plugin_id'] = DataDefinition::create('payment_plugin_id') + ->setLabel(t('Plugin ID')); + $properties['plugin_configuration'] = MapDataDefinition::create('payment_plugin_configuration') + ->setLabel(t('Plugin configuration')); + $properties['plugin_instance'] = MapDataDefinition::create('payment_plugin_instance') + ->setLabel(t('Plugin instance')); - parent::onChange($property_name); + return $properties; } /** @@ -279,7 +209,11 @@ abstract class PluginBagItemBase extends FieldItemBase { * {@inheritdoc} */ public function isEmpty() { - return !$this->getContainedPluginId() || !$this->getContainedPluginConfiguration() || !$this->getContainedPluginInstance(); + if (!$this->getContainedPluginId() || !$this->getContainedPluginConfiguration() || !$this->getContainedPluginInstance()) { + debug($this->getContainedPluginId()); + debug($this->getContainedPluginInstance()->getPluginId()); + } + return !$this->getContainedPluginInstance(); } /** @@ -292,14 +226,15 @@ abstract class PluginBagItemBase extends FieldItemBase { ]; } + /** @var \Drupal\payment\Plugin\DataType\PluginDataInterface $property */ foreach ($this->properties as $name => $property) { if (!isset($values[$name])) { continue; } - // Always notify properties, because this field items depends on + // Always notify properties, because this field item depends on // notifications for property synchronization. - $property->setValue($values[$name], TRUE); + $property->_setValueFromContainingFieldItem($values[$name], TRUE); } // Notify the parent of any changes. @@ -314,7 +249,9 @@ abstract class PluginBagItemBase extends FieldItemBase { public function __clone() { $plugin_instance = $this->get('plugin_instance')->getValue(); if (is_object($plugin_instance)) { - $this->get('plugin_instance')->setValue(clone $plugin_instance, FALSE); + /** @var \Drupal\payment\Plugin\DataType\PluginDataInterface $property */ + $property = $this->get('plugin_instance'); + $property->_setValueFromContainingFieldItem(clone $plugin_instance, FALSE); } } diff --git a/src/Plugin/Field/FieldType/PluginBagItemInterface.php b/src/Plugin/Field/FieldType/PluginBagItemInterface.php new file mode 100644 index 0000000..dd3324f --- /dev/null +++ b/src/Plugin/Field/FieldType/PluginBagItemInterface.php @@ -0,0 +1,123 @@ +fieldItem; + } + + /** + * {@inheritdoc} + */ + public function setContainingFieldItem(PluginBagItemInterface $field_item) { $this->fieldItem = $field_item; return $this; @@ -44,10 +51,10 @@ trait FieldTypePluginTrait { /** * Sets the plugin configuration on the containing field item. */ - public function setContainingFieldItemConfiguration() { - if ($this->fieldItem) { + protected function setContainingFieldItemConfiguration() { + if ($this->getContainingFieldItem()) { /** @var \Drupal\payment\Plugin\Payment\FieldTypePluginTrait|\Drupal\Component\Plugin\ConfigurablePluginInterface $this */ - $this->fieldItem->_setContainedPluginConfigurationFromContainedPlugin($this->getConfiguration()); + $this->fieldItem->_setContainedPluginConfigurationFromPlugin($this->getConfiguration()); } } diff --git a/src/Plugin/Payment/LineItem/PaymentLineItemBase.php b/src/Plugin/Payment/LineItem/PaymentLineItemBase.php index 750d8d5..d714384 100644 --- a/src/Plugin/Payment/LineItem/PaymentLineItemBase.php +++ b/src/Plugin/Payment/LineItem/PaymentLineItemBase.php @@ -91,7 +91,7 @@ abstract class PaymentLineItemBase extends PluginBase implements PaymentLineItem * {@inheritdoc} */ public function setConfiguration(array $configuration) { - $this->configuration = $configuration; + $this->configuration = $configuration + $this->defaultConfiguration(); } /** diff --git a/src/Plugin/Payment/Method/PaymentMethodBase.php b/src/Plugin/Payment/Method/PaymentMethodBase.php index 3821d51..a7e690e 100644 --- a/src/Plugin/Payment/Method/PaymentMethodBase.php +++ b/src/Plugin/Payment/Method/PaymentMethodBase.php @@ -119,7 +119,7 @@ abstract class PaymentMethodBase extends PluginBase implements ContainerFactoryP * {@inheritdoc} */ public function setConfiguration(array $configuration) { - $this->configuration = $configuration; + $this->configuration = $configuration + $this->defaultConfiguration(); } /** diff --git a/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php b/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php index 7c245cf..3b25a0b 100644 --- a/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php +++ b/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php @@ -96,7 +96,7 @@ abstract class PaymentMethodConfigurationBase extends PluginBase implements Paym * {@inheritdoc} */ public function setConfiguration(array $configuration) { - $this->configuration = $configuration; + $this->configuration = $configuration + $this->defaultConfiguration(); } /** diff --git a/src/Plugin/Payment/Status/PaymentStatusBase.php b/src/Plugin/Payment/Status/PaymentStatusBase.php index 9588860..cc8786f 100644 --- a/src/Plugin/Payment/Status/PaymentStatusBase.php +++ b/src/Plugin/Payment/Status/PaymentStatusBase.php @@ -88,7 +88,7 @@ abstract class PaymentStatusBase extends PluginBase implements ContainerFactoryP * {@inheritdoc} */ public function setConfiguration(array $configuration) { - $this->configuration = $configuration; + $this->configuration = $configuration + $this->defaultConfiguration(); } /** diff --git a/src/Plugin/Payment/Type/PaymentTypeBase.php b/src/Plugin/Payment/Type/PaymentTypeBase.php index 4bc0239..fccef66 100644 --- a/src/Plugin/Payment/Type/PaymentTypeBase.php +++ b/src/Plugin/Payment/Type/PaymentTypeBase.php @@ -86,7 +86,7 @@ abstract class PaymentTypeBase extends PluginBase implements ContainerFactoryPlu * {@inheritdoc} */ public function setConfiguration(array $configuration) { - $this->configuration = $configuration; + $this->configuration = $configuration + $this->defaultConfiguration(); } /** diff --git a/src/Tests/Entity/Payment/PaymentStorageWebTest.php b/src/Tests/Entity/Payment/PaymentStorageWebTest.php index 11e160d..a845a57 100644 --- a/src/Tests/Entity/Payment/PaymentStorageWebTest.php +++ b/src/Tests/Entity/Payment/PaymentStorageWebTest.php @@ -49,7 +49,9 @@ class PaymentStorageWebTest extends WebTestBase { // Test saving a payment. $this->assertFalse($payment->id()); // Set an extra status, so we can test for status IDs later. + debug(count($payment->getPaymentStatuses())); $payment->setPaymentStatus(Payment::statusManager()->createInstance('payment_success')); + debug(count($payment->getPaymentStatuses())); $payment->save(); // @todo The ID should be an integer, but for some reason the entity field // API returns a string. @@ -72,21 +74,5 @@ class PaymentStorageWebTest extends WebTestBase { $this->assertEqual(count($payment_loaded->getPaymentStatuses()), count($payment->getPaymentStatuses())); $this->assertEqual($payment_loaded->getPaymentMethod()->getConfiguration(), $payment->getPaymentMethod()->getConfiguration()); $this->assertEqual($payment_loaded->getPaymentType()->getConfiguration(), $payment->getPaymentType()->getConfiguration()); - - // Test deleting a payment. - $payment->delete(); - $this->assertFalse(entity_load('payment', $payment->id())); - $line_items_exists = db_select('payment_line_item') - ->condition('payment_id', $payment->id()) - ->countQuery() - ->execute() - ->fetchField(); - $this->assertFalse($line_items_exists); - $statuses_exist = db_select('payment_status') - ->condition('payment_id', $payment->id()) - ->countQuery() - ->execute() - ->fetchField(); - $this->assertFalse($statuses_exist); } } diff --git a/src/Tests/Entity/PaymentUnitTest.php b/src/Tests/Entity/PaymentUnitTest.php index 386ac70..60039fb 100644 --- a/src/Tests/Entity/PaymentUnitTest.php +++ b/src/Tests/Entity/PaymentUnitTest.php @@ -159,9 +159,13 @@ class PaymentUnitTest extends KernelTestBase { * Tests setPaymentStatus() and getPaymentStatus(). */ protected function testGetPaymentStatus() { - $status = $this->statusManager->createInstance('payment_pending'); - $this->assertEqual(spl_object_hash($this->payment->setPaymentStatus($status, FALSE)), spl_object_hash($this->payment)); - $this->assertEqual(spl_object_hash($this->payment->getPaymentStatus()), spl_object_hash($status)); + $payment_status_a = $this->statusManager->createInstance('payment_pending'); + $payment_status_b = $this->statusManager->createInstance('payment_failed'); + $this->assertEqual(spl_object_hash($this->payment->setPaymentStatus($payment_status_a)), spl_object_hash($this->payment)); + $this->assertEqual(spl_object_hash($this->payment->getPaymentStatus()), spl_object_hash($payment_status_a)); + // Make sure we always get the last status. + $this->payment->setPaymentStatus($payment_status_b); + $this->assertEqual(spl_object_hash($this->payment->getPaymentStatus()), spl_object_hash($payment_status_b)); } /** @@ -173,6 +177,8 @@ class PaymentUnitTest extends KernelTestBase { $retrieved_statuses = $this->payment->getPaymentStatuses(); $this->assertEqual(spl_object_hash(reset($retrieved_statuses)), spl_object_hash(reset($statuses))); $this->assertEqual(spl_object_hash(end($retrieved_statuses)), spl_object_hash(end($statuses))); + // Make sure we always get the last status. + $this->assertEqual(spl_object_hash($this->payment->getPaymentStatus()), spl_object_hash(end($statuses))); } /** diff --git a/src/Tests/Plugin/Field/FieldType/PluginBagItemBaseTest.php b/src/Tests/Plugin/Field/FieldType/PluginBagItemBaseTest.php index d07a716..d579873 100644 --- a/src/Tests/Plugin/Field/FieldType/PluginBagItemBaseTest.php +++ b/src/Tests/Plugin/Field/FieldType/PluginBagItemBaseTest.php @@ -82,13 +82,13 @@ class PluginBagItemBaseTest extends KernelTestBase { $this->assertEqual($this->fieldItem->getContainedPluginConfiguration(), $altered_plugin_configuration); // Test resetting the values. - $this->fieldItem->resetContainedPluginInstance(); - $this->assertNull($this->fieldItem->getContainedPluginId()); + $this->fieldItem->applyDefaultValue(); + $this->assertEqual($this->fieldItem->getContainedPluginId(), ''); $this->assertEqual($this->fieldItem->getContainedPluginConfiguration(), []); $this->assertNull($this->fieldItem->getContainedPluginInstance()); // Test setting values again and auto-instantiation. - $this->fieldItem->resetContainedPluginInstance(); + $this->fieldItem->applyDefaultValue(); $this->fieldItem->setContainedPluginId($plugin_id_configurable); $this->assertEqual($this->fieldItem->getContainedPluginId(), $plugin_id_configurable); $this->fieldItem->setContainedPluginConfiguration($plugin_configuration);