commerce-8.x-2.8/modules/payment/src/Form/PaymentMethodAddForm.php
modules/payment/src/Form/PaymentMethodAddForm.php
<?php namespace Drupal\commerce_payment\Form; use Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\SupportsStoredPaymentMethodsInterface; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\user\UserInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; /** * Provides the payment method add form. */ class PaymentMethodAddForm extends FormBase implements ContainerInjectionInterface { /** * The entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * Constructs a new PaymentMethodAddForm instance. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. */ public function __construct(EntityTypeManagerInterface $entity_type_manager) { $this->entityTypeManager = $entity_type_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager') ); } /** * {@inheritdoc} */ public function getFormId() { return 'commerce_payment_method_add_form'; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, UserInterface $user = NULL) { $payment_gateway = $form_state->get('payment_gateway'); if (!$payment_gateway) { /** @var \Drupal\commerce_payment\PaymentGatewayStorageInterface $payment_gateway_storage */ $payment_gateway_storage = $this->entityTypeManager->getStorage('commerce_payment_gateway'); $payment_gateway = $payment_gateway_storage->loadForUser($user); // @todo Move this check to the access handler. if (!$payment_gateway || !($payment_gateway->getPlugin() instanceof SupportsStoredPaymentMethodsInterface)) { throw new AccessDeniedHttpException(); } $form_state->set('payment_gateway', $payment_gateway); } $step = $form_state->get('step'); if (!$step) { $step = 'payment_method_type'; // Skip the payment method type selection if there's only 1 type. $payment_method_types = $payment_gateway->getPlugin()->getPaymentMethodTypes(); if (count($payment_method_types) === 1) { /** @var \Drupal\commerce_payment\Plugin\Commerce\PaymentMethodType\PaymentMethodTypeInterface $payment_method_type */ $payment_method_type = reset($payment_method_types); $form_state->set('payment_method_type', $payment_method_type->getPluginId()); $step = 'payment_method'; } $form_state->set('step', $step); } if ($step == 'payment_method_type') { $form = $this->buildPaymentMethodTypeForm($form, $form_state); } elseif ($step == 'payment_method') { $form = $this->buildPaymentMethodForm($form, $form_state); } return $form; } /** * Builds the form for selecting a payment method type. * * @param array $form * The parent form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the complete form. * * @return array * The built form. */ protected function buildPaymentMethodTypeForm(array $form, FormStateInterface $form_state) { $payment_method_types = $form_state->get('payment_gateway')->getPlugin()->getPaymentMethodTypes(); $payment_method_type_options = array_map(function ($payment_method_type) { /** @var \Drupal\commerce_payment\Plugin\Commerce\PaymentMethodType\PaymentMethodTypeInterface $payment_method_type */ return $payment_method_type->getLabel(); }, $payment_method_types); $form['payment_method_type'] = [ '#type' => 'radios', '#title' => $this->t('Payment method type'), '#options' => $payment_method_type_options, '#default_value' => '', '#required' => TRUE, ]; $form['actions']['submit'] = [ '#type' => 'submit', '#value' => $this->t('Continue'), '#button_type' => 'primary', ]; return $form; } /** * Builds the form for adding a payment method. * * @param array $form * The parent form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the complete form. * * @return array * The built form. */ protected function buildPaymentMethodForm(array $form, FormStateInterface $form_state) { $payment_method_storage = $this->entityTypeManager->getStorage('commerce_payment_method'); $payment_method = $payment_method_storage->create([ 'type' => $form_state->get('payment_method_type'), 'payment_gateway' => $form_state->get('payment_gateway'), 'uid' => $form_state->getBuildInfo()['args'][0]->id(), ]); $form['payment_method'] = [ '#type' => 'commerce_payment_gateway_form', '#operation' => 'add-payment-method', '#default_value' => $payment_method, ]; $form['actions']['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), '#button_type' => 'primary', ]; return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $step = $form_state->get('step'); if ($step == 'payment_method_type') { $form_state->set('payment_method_type', $form_state->getValue('payment_method_type')); $form_state->set('step', 'payment_method'); $form_state->setRebuild(TRUE); } elseif ($step == 'payment_method') { /** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface $payment_method */ $payment_method = $form_state->getValue('payment_method'); $this->messenger()->addMessage($this->t('%label saved to your payment methods.', ['%label' => $payment_method->label()])); $form_state->setRedirect('entity.commerce_payment_method.collection', ['user' => $payment_method->getOwnerId()]); } } }