public function PaymentInformation::submitPaneForm in Commerce Core 8.2
Handles the submission of an pane form.
Parameters
array $pane_form: The pane form.
\Drupal\Core\Form\FormStateInterface $form_state: The form state of the parent form.
array $complete_form: The complete form structure.
Overrides CheckoutPaneBase::submitPaneForm
File
- modules/
payment/ src/ Plugin/ Commerce/ CheckoutPane/ PaymentInformation.php, line 355
Class
- PaymentInformation
- Provides the payment information pane.
Namespace
Drupal\commerce_payment\Plugin\Commerce\CheckoutPaneCode
public function submitPaneForm(array &$pane_form, FormStateInterface $form_state, array &$complete_form) {
if (isset($pane_form['billing_information']['#inline_form'])) {
/** @var \Drupal\commerce\Plugin\Commerce\InlineForm\EntityInlineFormInterface $inline_form */
$inline_form = $pane_form['billing_information']['#inline_form'];
/** @var \Drupal\profile\Entity\ProfileInterface $billing_profile */
$billing_profile = $inline_form
->getEntity();
$this->order
->setBillingProfile($billing_profile);
// The billing profile is provided either because the order is free,
// or the selected gateway does not support stored payment methods.
// If it's the former, stop here.
if ($this->order
->isPaid() || $this->order
->getTotalPrice()
->isZero()) {
return;
}
}
$values = $form_state
->getValue($pane_form['#parents']);
/** @var \Drupal\commerce_payment\PaymentOption $selected_option */
$selected_option = $pane_form['#payment_options'][$values['payment_method']];
/** @var \Drupal\commerce_payment\PaymentGatewayStorageInterface $payment_gateway_storage */
$payment_gateway_storage = $this->entityTypeManager
->getStorage('commerce_payment_gateway');
/** @var \Drupal\commerce_payment\Entity\PaymentGatewayInterface $payment_gateway */
$payment_gateway = $payment_gateway_storage
->load($selected_option
->getPaymentGatewayId());
if (!$payment_gateway) {
return;
}
$payment_gateway_plugin = $payment_gateway
->getPlugin();
if ($payment_gateway_plugin instanceof SupportsCreatingPaymentMethodsInterface) {
if (!empty($selected_option
->getPaymentMethodTypeId())) {
/** @var \Drupal\commerce\Plugin\Commerce\InlineForm\EntityInlineFormInterface $inline_form */
$inline_form = $pane_form['add_payment_method']['#inline_form'];
// The payment method was just created.
$payment_method = $inline_form
->getEntity();
}
else {
/** @var \Drupal\commerce_payment\PaymentMethodStorageInterface $payment_method_storage */
$payment_method_storage = $this->entityTypeManager
->getStorage('commerce_payment_method');
$payment_method = $payment_method_storage
->load($selected_option
->getPaymentMethodId());
}
/** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface $payment_method */
$this->order
->set('payment_gateway', $payment_method
->getPaymentGateway());
$this->order
->set('payment_method', $payment_method);
// Copy the billing information to the order.
$payment_method_profile = $payment_method
->getBillingProfile();
if ($payment_method_profile) {
$billing_profile = $this->order
->getBillingProfile();
if (!$billing_profile) {
$billing_profile = $this->entityTypeManager
->getStorage('profile')
->create([
'type' => 'customer',
'uid' => 0,
]);
}
$billing_profile
->populateFromProfile($payment_method_profile);
// The data field is not copied by default but needs to be.
// For example, both profiles need to have an address_book_profile_id.
$billing_profile
->populateFromProfile($payment_method_profile, [
'data',
]);
$billing_profile
->save();
$this->order
->setBillingProfile($billing_profile);
}
}
elseif ($payment_gateway_plugin instanceof SupportsStoredPaymentMethodsInterface) {
if ($selected_option
->getPaymentMethodId()) {
/** @var \Drupal\commerce_payment\PaymentMethodStorageInterface $payment_method_storage */
$payment_method_storage = $this->entityTypeManager
->getStorage('commerce_payment_method');
$payment_method = $payment_method_storage
->load($selected_option
->getPaymentMethodId());
assert($payment_method instanceof PaymentMethodInterface);
/** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface $payment_method */
$this->order
->set('payment_gateway', $payment_method
->getPaymentGateway());
$this->order
->set('payment_method', $payment_method);
$this->order
->setBillingProfile($payment_method
->getBillingProfile());
}
else {
$this->order
->set('payment_gateway', $payment_gateway);
$this->order
->set('payment_method', NULL);
}
}
else {
$this->order
->set('payment_gateway', $payment_gateway);
$this->order
->set('payment_method', NULL);
}
}