diff --git a/modules/payment_form/src/Entity/Payment/PaymentForm.php b/modules/payment_form/src/Entity/Payment/PaymentForm.php index 97e668cb..87ad57e8 100644 --- a/modules/payment_form/src/Entity/Payment/PaymentForm.php +++ b/modules/payment_form/src/Entity/Payment/PaymentForm.php @@ -6,6 +6,7 @@ use Drupal\Core\Entity\ContentEntityForm; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\payment\PaymentPluginSubFormTrait; use Drupal\payment\Plugin\Payment\Method\PaymentExecutionPaymentMethodManager; use Drupal\plugin\Plugin\Plugin\PluginSelector\PluginSelectorManagerInterface; use Drupal\plugin\PluginDiscovery\LimitedPluginDiscoveryDecorator; @@ -38,6 +39,11 @@ class PaymentForm extends ContentEntityForm { */ protected $pluginSelectorManager; + /** + * Trait for handling plugin selector forms with subFormState. + */ + use PaymentPluginSubFormTrait; + /** * {@inheritdoc} */ @@ -97,15 +103,18 @@ class PaymentForm extends ContentEntityForm { * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { + $form = parent::form($form, $form_state); $payment = $this->getEntity(); $form['line_items'] = [ '#payment_line_items' => $payment, '#type' => 'payment_line_items_display', ]; - $form['payment_method'] = $this->getPluginSelector($form_state)->buildSelectorForm([], $form_state); - return parent::form($form, $form_state); + $form_state->setCompleteForm($form); + $form['payment_method'] = $this->buildPluginSelectorForm($this->getPluginSelector($form_state), [], $form_state); + + return $form; } /** @@ -113,7 +122,7 @@ class PaymentForm extends ContentEntityForm { */ public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); - $this->getPluginSelector($form_state)->validateSelectorForm($form['payment_method'], $form_state); + $this->validatePluginSelectorForm($this->getPluginSelector($form_state), $form['payment_method'], $form_state); } /** @@ -123,8 +132,9 @@ class PaymentForm extends ContentEntityForm { parent::submitForm($form, $form_state); /** @var \Drupal\payment\Entity\PaymentInterface $payment */ $payment = $this->getEntity(); + $plugin_selector = $this->getPluginSelector($form_state); - $plugin_selector->submitSelectorForm($form['payment_method'], $form_state); + $this->submitPluginSelectorForm($plugin_selector, $form['payment_method'], $form_state); $payment->setPaymentMethod($plugin_selector->getSelectedPlugin()); $payment->save(); $result = $payment->execute(); diff --git a/src/PaymentPluginSubFormTrait.php b/src/PaymentPluginSubFormTrait.php new file mode 100644 index 00000000..d3ffbf12 --- /dev/null +++ b/src/PaymentPluginSubFormTrait.php @@ -0,0 +1,60 @@ +getCompleteForm(), $form_state); + return $plugin_selector->buildSelectorForm([], $plugin_selector_sub_form_state); + } + + /** + * Validates the plugin selector forms using subform state. + * + * @param \Drupal\plugin\Plugin\Plugin\PluginSelector\PluginSelectorInterface $plugin_selector + * @param array $plugin_selector_form + * @param \Drupal\Core\Form\FormStateInterface $complete_form_state + * + */ + protected function validatePluginSelectorForm(PluginSelectorInterface $plugin_selector, &$plugin_selector_form, FormStateInterface $complete_form_state) { + $complete_form = $complete_form_state->getCompleteForm(); + $plugin_selector_form_state = SubformState::createForSubform($plugin_selector_form, $complete_form, $complete_form_state); + $plugin_selector->validateSelectorForm($plugin_selector_form, $plugin_selector_form_state); + } + + /** + * Submits the plugin selector forms using subform state. + * + * @param \Drupal\plugin\Plugin\Plugin\PluginSelector\PluginSelectorInterface $plugin_selector + * @param array $plugin_selector_form + * @param \Drupal\Core\Form\FormStateInterface $complete_form_state + */ + protected function submitPluginSelectorForm(PluginSelectorInterface $plugin_selector, &$plugin_selector_form, FormStateInterface $complete_form_state) { + $complete_form = $complete_form_state->getCompleteForm(); + $plugin_selector_form_state = SubformState::createForSubform($plugin_selector_form, $complete_form, $complete_form_state); + $plugin_selector->submitSelectorForm($plugin_selector_form, $plugin_selector_form_state); + } + +} diff --git a/src/Plugin/Payment/MethodConfiguration/Basic.php b/src/Plugin/Payment/MethodConfiguration/Basic.php index fbca7f8b..f9a21a21 100644 --- a/src/Plugin/Payment/MethodConfiguration/Basic.php +++ b/src/Plugin/Payment/MethodConfiguration/Basic.php @@ -247,7 +247,7 @@ class Basic extends PaymentMethodConfigurationBase implements ContainerFactoryPl '#type' => 'details', '#title' => $this->t('Execution'), ); - $element['execute']['execute_status'] = $this->getExecutePaymentStatusSelector($form_state)->buildSelectorForm([], $form_state); + $element['execute']['execute_status'] = $this->buildPluginSelectorForm($this->getExecutePaymentStatusSelector($form_state), [], $form_state); $element['capture'] = array( '#group' => $workflow_group, '#open' => TRUE, @@ -271,7 +271,7 @@ class Basic extends PaymentMethodConfigurationBase implements ContainerFactoryPl ), ], ]; - $element['capture']['plugin_form']['capture_status'] = $this->getCapturePaymentStatusSelector($form_state)->buildSelectorForm([], $form_state); + $element['capture']['plugin_form']['capture_status'] = $this->buildPluginSelectorForm($this->getCapturePaymentStatusSelector($form_state), [], $form_state); $refund_id = Html::getUniqueId('refund'); $element['refund'] = array( '#group' => $workflow_group, @@ -295,7 +295,8 @@ class Basic extends PaymentMethodConfigurationBase implements ContainerFactoryPl ), ], ]; - $element['refund']['plugin_form']['refund_status'] = $this->getRefundPaymentStatusSelector($form_state)->buildSelectorForm([], $form_state); + + $element['refund']['plugin_form']['refund_status'] = $this->buildPluginSelectorForm($this->getRefundPaymentStatusSelector($form_state), [], $form_state); return $element; } @@ -304,9 +305,9 @@ class Basic extends PaymentMethodConfigurationBase implements ContainerFactoryPl * {@inheritdoc} */ public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { - $this->getExecutePaymentStatusSelector($form_state)->validateSelectorForm($form['plugin_form']['execute']['execute_status'], $form_state); - $this->getCapturePaymentStatusSelector($form_state)->validateSelectorForm($form['plugin_form']['capture']['plugin_form']['capture_status'], $form_state); - $this->getRefundPaymentStatusSelector($form_state)->validateSelectorForm($form['plugin_form']['refund']['plugin_form']['refund_status'], $form_state); + $this->validatePluginSelectorForm($this->getExecutePaymentStatusSelector($form_state), $form['plugin_form']['execute']['execute_status'], $form_state); + $this->validatePluginSelectorForm($this->getCapturePaymentStatusSelector($form_state), $form['plugin_form']['capture']['plugin_form']['capture_status'], $form_state); + $this->validatePluginSelectorForm($this->getRefundPaymentStatusSelector($form_state), $form['plugin_form']['refund']['plugin_form']['refund_status'], $form_state); } /** @@ -314,9 +315,9 @@ class Basic extends PaymentMethodConfigurationBase implements ContainerFactoryPl */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { parent::submitConfigurationForm($form, $form_state); - $this->getExecutePaymentStatusSelector($form_state)->submitSelectorForm($form['plugin_form']['execute']['execute_status'], $form_state); - $this->getCapturePaymentStatusSelector($form_state)->submitSelectorForm($form['plugin_form']['capture']['plugin_form']['capture_status'], $form_state); - $this->getRefundPaymentStatusSelector($form_state)->submitSelectorForm($form['plugin_form']['refund']['plugin_form']['refund_status'], $form_state); + $this->submitPluginSelectorForm($this->getExecutePaymentStatusSelector($form_state), $form['plugin_form']['execute']['execute_status'], $form_state); + $this->submitPluginSelectorForm($this->getCapturePaymentStatusSelector($form_state), $form['plugin_form']['capture']['plugin_form']['capture_status'], $form_state); + $this->submitPluginSelectorForm($this->getRefundPaymentStatusSelector($form_state), $form['plugin_form']['refund']['plugin_form']['refund_status'], $form_state); $parents = $form['plugin_form']['brand_label']['#parents']; array_pop($parents); diff --git a/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php b/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php index 7081d170..93554b27 100644 --- a/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php +++ b/src/Plugin/Payment/MethodConfiguration/PaymentMethodConfigurationBase.php @@ -13,6 +13,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\Core\StringTranslation\TranslationInterface; +use Drupal\payment\PaymentPluginSubFormTrait; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -24,6 +25,11 @@ use Symfony\Component\DependencyInjection\ContainerInterface; */ abstract class PaymentMethodConfigurationBase extends PluginBase implements PaymentMethodConfigurationInterface, ConfigurableInterface, DependentPluginInterface { + /** + * Trait for handling plugin selector forms with subFormState. + */ + use PaymentPluginSubFormTrait; + /** * The module handler. *