commerce-8.x-2.8/modules/checkout/src/CheckoutOrderManager.php
modules/checkout/src/CheckoutOrderManager.php
<?php
namespace Drupal\commerce_checkout;
use Drupal\commerce_checkout\Resolver\ChainCheckoutFlowResolverInterface;
use Drupal\commerce_order\Entity\OrderInterface;
/**
* Manages checkout flows for orders.
*/
class CheckoutOrderManager implements CheckoutOrderManagerInterface {
/**
* The chain checkout flow resolver.
*
* @var \Drupal\commerce_checkout\Resolver\ChainCheckoutFlowResolverInterface
*/
protected $chainCheckoutFlowResolver;
/**
* Constructs a new CheckoutOrderManager object.
*
* @param \Drupal\commerce_checkout\Resolver\ChainCheckoutFlowResolverInterface $chain_checkout_flow_resolver
* The chain checkout flow resolver.
*/
public function __construct(ChainCheckoutFlowResolverInterface $chain_checkout_flow_resolver) {
$this->chainCheckoutFlowResolver = $chain_checkout_flow_resolver;
}
/**
* {@inheritdoc}
*/
public function getCheckoutFlow(OrderInterface $order) {
if ($order->get('checkout_flow')->isEmpty()) {
$checkout_flow = $this->chainCheckoutFlowResolver->resolve($order);
$order->set('checkout_flow', $checkout_flow);
$order->save();
}
return $order->get('checkout_flow')->entity;
}
/**
* {@inheritdoc}
*/
public function getCheckoutStepId(OrderInterface $order, $requested_step_id = NULL) {
// Customers can't edit orders that have already been placed.
if ($order->getState()->value != 'draft') {
return 'complete';
}
$checkout_flow = $this->getCheckoutFlow($order);
$available_step_ids = array_keys($checkout_flow->getPlugin()->getVisibleSteps());
$selected_step_id = $order->get('checkout_step')->value;
$selected_step_id = $selected_step_id ?: reset($available_step_ids);
if (empty($requested_step_id) || $requested_step_id == $selected_step_id) {
return $selected_step_id;
}
if (in_array($requested_step_id, $available_step_ids)) {
// Allow access to a previously completed step.
$requested_step_index = array_search($requested_step_id, $available_step_ids);
$selected_step_index = array_search($selected_step_id, $available_step_ids);
if ($requested_step_index <= $selected_step_index) {
$selected_step_id = $requested_step_id;
}
}
return $selected_step_id;
}
}
