commerce-8.x-2.8/modules/order/src/OrderStorage.php
modules/order/src/OrderStorage.php
<?php namespace Drupal\commerce_order; use Drupal\commerce\CommerceContentEntityStorage; use Drupal\commerce_order\Entity\OrderInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Database\Connection; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Language\LanguageManagerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * Defines the order storage. */ class OrderStorage extends CommerceContentEntityStorage { /** * The order refresh. * * @var \Drupal\commerce_order\OrderRefreshInterface */ protected $orderRefresh; /** * Whether the order refresh should be skipped. * * @var bool */ protected $skipRefresh = FALSE; /** * Constructs a new OrderStorage object. * * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type * The entity type definition. * @param \Drupal\Core\Database\Connection $database * The database connection to be used. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. * @param \Drupal\Core\Cache\CacheBackendInterface $cache * The cache backend to be used. * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager * The language manager. * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher * The event dispatcher. * @param \Drupal\commerce_order\OrderRefreshInterface $order_refresh * The order refresh process. */ public function __construct(EntityTypeInterface $entity_type, Connection $database, EntityManagerInterface $entity_manager, CacheBackendInterface $cache, LanguageManagerInterface $language_manager, EventDispatcherInterface $event_dispatcher, OrderRefreshInterface $order_refresh) { parent::__construct($entity_type, $database, $entity_manager, $cache, $language_manager, $event_dispatcher); $this->orderRefresh = $order_refresh; } /** * {@inheritdoc} */ public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { return new static( $entity_type, $container->get('database'), $container->get('entity.manager'), $container->get('cache.entity'), $container->get('language_manager'), $container->get('event_dispatcher'), $container->get('commerce_order.order_refresh') ); } /** * {@inheritdoc} */ public function loadUnchanged($id) { // This method is used by the entity save process, triggering an order // refresh would cause a save-within-a-save. $this->skipRefresh = TRUE; $unchanged_order = parent::loadUnchanged($id); $this->skipRefresh = FALSE; return $unchanged_order; } /** * {@inheritdoc} */ protected function doPreSave(EntityInterface $entity) { $id = parent::doPreSave($entity); /** @var \Drupal\commerce_order\Entity\OrderInterface $entity */ if ($entity->getRefreshState() == OrderInterface::REFRESH_ON_SAVE) { $this->orderRefresh->refresh($entity); } // Only the REFRESH_ON_LOAD state needs to be persisted on the entity. if ($entity->getRefreshState() != OrderInterface::REFRESH_ON_LOAD) { $entity->setRefreshState(NULL); } $entity->recalculateTotalPrice(); return $id; } /** * {@inheritdoc} */ protected function postLoad(array &$entities) { if (!$this->skipRefresh) { /** @var \Drupal\commerce_order\Entity\OrderInterface[] $entities */ foreach ($entities as $entity) { $explicitly_requested = $entity->getRefreshState() == OrderInterface::REFRESH_ON_LOAD; if ($explicitly_requested || $this->orderRefresh->shouldRefresh($entity)) { // Reuse the doPostLoad logic. $entity->setRefreshState(OrderInterface::REFRESH_ON_SAVE); $entity->save(); } } } return parent::postLoad($entities); } }