View source
<?php
namespace Drupal\commerce_order;
use Drupal\commerce\CommerceContentEntityStorage;
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\commerce_order\Event\OrderEvent;
use Drupal\commerce_order\Event\OrderEvents;
use Drupal\Core\Cache\MemoryCache\MemoryCacheInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class OrderStorage extends CommerceContentEntityStorage {
protected $orderRefresh;
protected $skipRefresh = FALSE;
public function __construct(EntityTypeInterface $entity_type, Connection $database, EntityFieldManagerInterface $entity_field_manager, CacheBackendInterface $cache, LanguageManagerInterface $language_manager, MemoryCacheInterface $memory_cache, EntityTypeBundleInfoInterface $entity_type_bundle_info, EntityTypeManagerInterface $entity_type_manager, EventDispatcherInterface $event_dispatcher, OrderRefreshInterface $order_refresh) {
parent::__construct($entity_type, $database, $entity_field_manager, $cache, $language_manager, $memory_cache, $entity_type_bundle_info, $entity_type_manager, $event_dispatcher);
$this->orderRefresh = $order_refresh;
}
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static($entity_type, $container
->get('database'), $container
->get('entity_field.manager'), $container
->get('cache.entity'), $container
->get('language_manager'), $container
->get('entity.memory_cache'), $container
->get('entity_type.bundle.info'), $container
->get('entity_type.manager'), $container
->get('event_dispatcher'), $container
->get('commerce_order.order_refresh'));
}
public function loadUnchanged($id) {
$this->skipRefresh = TRUE;
$unchanged_order = parent::loadUnchanged($id);
$this->skipRefresh = FALSE;
return $unchanged_order;
}
protected function invokeHook($hook, EntityInterface $entity) {
if ($hook == 'presave') {
$this
->doOrderPreSave($entity);
}
parent::invokeHook($hook, $entity);
}
protected function doOrderPreSave(OrderInterface $order) {
$order
->set('order_items', $order
->getItems());
if ($order
->getRefreshState() == OrderInterface::REFRESH_ON_SAVE) {
$this->orderRefresh
->refresh($order);
}
if ($order
->getRefreshState() != OrderInterface::REFRESH_ON_LOAD) {
$order
->setRefreshState(NULL);
}
$order
->recalculateTotalPrice();
$original_paid = isset($order->original) ? $order->original
->isPaid() : FALSE;
if ($order
->isPaid() && !$original_paid) {
if ($order
->getData('paid_event_dispatched') === FALSE) {
$event = new OrderEvent($order);
$this->eventDispatcher
->dispatch(OrderEvents::ORDER_PAID, $event);
$order
->setData('paid_event_dispatched', TRUE);
}
}
}
protected function postLoad(array &$entities) {
if (!$this->skipRefresh) {
foreach ($entities as $entity) {
$explicitly_requested = $entity
->getRefreshState() == OrderInterface::REFRESH_ON_LOAD;
if ($explicitly_requested || $this->orderRefresh
->shouldRefresh($entity)) {
$entity
->setRefreshState(OrderInterface::REFRESH_ON_SAVE);
$entity
->save();
}
}
}
return parent::postLoad($entities);
}
}