contacts_events-8.x-1.x-dev/src/Plugin/Commerce/CheckoutPane/BookingPaymentProcess.php

src/Plugin/Commerce/CheckoutPane/BookingPaymentProcess.php
<?php

namespace Drupal\contacts_events\Plugin\Commerce\CheckoutPane;

use Drupal\commerce_checkout\Plugin\Commerce\CheckoutFlow\CheckoutFlowInterface;
use Drupal\commerce_payment\Entity\PaymentGatewayInterface;
use Drupal\commerce_payment\Plugin\Commerce\CheckoutPane\PaymentProcess;
use Drupal\contacts_events\Plugin\Commerce\CheckoutFlow\BookingFlow;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Security\TrustedCallbackInterface;
use Drupal\Core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides the payment process pane.
 *
 * @CommerceCheckoutPane(
 *   id = "booking_payment_process",
 *   label = @Translation("Booking payment process"),
 *   default_step = "payment",
 *   wrapper_element = "container",
 * )
 */
class BookingPaymentProcess extends PaymentProcess implements TrustedCallbackInterface {

  use BookingPaymentTrait;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, CheckoutFlowInterface $checkout_flow = NULL) {
    /** @var static $plugin */
    $plugin = parent::create($container, $configuration, $plugin_id, $plugin_definition, $checkout_flow);
    static::init($container, $plugin);
    return $plugin;
  }

  /**
   * {@inheritdoc}
   */
  public function isVisible() {
    // Default behaviour is to hide the payment step if the order
    // has a total of 0. This is no good for us as our bookings always start
    // with a total of 0 and only have a on-zero balance once a ticket is added.
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form) {
    // As we override the visibility to always show, we need to continue to
    // the next step if there is still no balance to pay.
    $balance = $this->order->getBalance();
    // If there's nothing to pay, move on.
    if (!$balance || !$balance->isPositive()) {
      $this->checkoutFlow->redirectToStep($this->checkoutFlow->getNextStepId($this->getStepId()));
    }

    // Otherwise we can pass onto the parent.
    return parent::buildPaneForm($pane_form, $form_state, $complete_form);
  }

  /**
   * Builds the URL to the "error" page.
   *
   * @return \Drupal\Core\Url
   *   The "error" page URL.
   */
  protected function buildErrorUrl() {
    $route_name = $this->checkoutFlow instanceof BookingFlow ?
      $this->checkoutFlow::ROUTE_NAME :
      'commerce_checkout.form';
    return Url::fromRoute($route_name, [
      'commerce_order' => $this->order->id(),
      'step' => $this->getErrorStepId(),
    ], ['absolute' => TRUE]);
  }

  /**
   * {@inheritdoc}
   */
  protected function buildReturnUrl() {
    return Url::fromRoute('contacts_events.payment.return', [
      'commerce_order' => $this->order->id(),
      'step' => 'payment',
    ], ['absolute' => TRUE]);
  }

  /**
   * {@inheritdoc}
   */
  protected function buildCancelUrl() {
    return Url::fromRoute('contacts_events.payment.cancel', [
      'commerce_order' => $this->order->id(),
      'step' => 'payment',
    ], ['absolute' => TRUE]);
  }

  /**
   * Gets the step ID that the customer should be sent to on error.
   *
   * @return string
   *   The error step ID.
   */
  protected function getErrorStepId() {
    // Default to the step that contains the PaymentInformation pane.
    $step_id = $this->checkoutFlow->getPane('booking_payment_information')->getStepId();
    if ($step_id == '_disabled') {
      // Can't redirect to the _disabled step. This could mean that isVisible()
      // was overridden to allow PaymentProcess to be used without a
      // payment_information pane, but this method was not modified.
      throw new \RuntimeException('Cannot get the step ID for the booking_payment_information pane. The pane is disabled.');
    }

    return $step_id;
  }

  /**
   * {@inheritdoc}
   */
  protected function createPayment(PaymentGatewayInterface $payment_gateway) {
    // Retrieve the amount from the tempstore.
    $amount = $this->getPaymentAmount();

    $payment_storage = $this->entityTypeManager->getStorage('commerce_payment');
    /** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */
    $payment = $payment_storage->create([
      'state' => 'new',
      'amount' => $amount ?? $this->order->getBalance(),
      'payment_gateway' => $payment_gateway->id(),
      'order_id' => $this->order->id(),
    ]);
    return $payment;
  }

  /**
   * {@inheritdoc}
   */
  public static function trustedCallbacks() {
    return ['preRenderAmount'];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc