CartEventSubscriber.php in Mailchimp E-Commerce 8
File
modules/mailchimp_ecommerce_commerce/src/EventSubscriber/CartEventSubscriber.php
View source
<?php
namespace Drupal\mailchimp_ecommerce_commerce\EventSubscriber;
use Drupal\commerce_cart\Event\CartEntityAddEvent;
use Drupal\commerce_cart\Event\CartEvents;
use Drupal\commerce_cart\Event\CartOrderItemRemoveEvent;
use Drupal\commerce_cart\Event\CartOrderItemUpdateEvent;
use Drupal\commerce_order\Entity\OrderItem;
use Drupal\commerce_price\Price;
use Drupal\Core\Url;
use Drupal\mailchimp_ecommerce\CartHandler;
use Drupal\mailchimp_ecommerce\CustomerHandler;
use Drupal\mailchimp_ecommerce\OrderHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CartEventSubscriber implements EventSubscriberInterface {
private $cart_handler;
private $order_handler;
private $customer_handler;
public function __construct(CartHandler $cart_handler, OrderHandler $order_handler, CustomerHandler $customer_handler) {
$this->cart_handler = $cart_handler;
$this->order_handler = $order_handler;
$this->customer_handler = $customer_handler;
}
public function cartAdd(CartEntityAddEvent $event) {
$order = $event
->getCart();
$customer['email_address'] = $order
->getEmail();
if (empty($customer['email_address'])) {
return;
}
if ($this->cart_handler
->cartExists($order
->id())) {
$order_item = $event
->getOrderItem();
$product = $this->order_handler
->buildProduct($order_item);
$this->cart_handler
->addCartLine($order
->id(), $order_item
->id(), $product);
}
else {
$billing_profile = $order
->getBillingProfile();
$customer = $this->customer_handler
->buildCustomer($customer, $billing_profile);
$this->customer_handler
->addOrUpdateCustomer($customer);
$order_data = $this->order_handler
->buildOrder($order, $customer);
if (!isset($order_data['currency_code'])) {
$price = $event
->getEntity()
->getPrice();
$order_data['currency_code'] = $price
->getCurrencyCode();
$order_data['order_total'] = $price
->getNumber();
}
$order_data['checkout_url'] = Url::fromRoute('commerce_checkout.form', [
'commerce_order' => $order
->id(),
], [
'absolute' => TRUE,
])
->toString();
$this->cart_handler
->addOrUpdateCart($order
->id(), $customer, $order_data);
}
}
public function cartItemUpdate(CartOrderItemUpdateEvent $event) {
$order = $event
->getCart();
$order_item = $event
->getOrderItem();
$product = $this->order_handler
->buildProduct($order_item);
$this->cart_handler
->updateCartLine($order
->id(), $order_item
->id(), $product);
}
public function cartItemRemove(CartOrderItemRemoveEvent $event) {
$order = $event
->getCart();
if (empty($order
->getItems())) {
$this->cart_handler
->deleteCart($order
->id());
}
else {
$this->cart_handler
->deleteCartLine($order
->id(), $event
->getOrderItem()
->id());
}
}
public static function getSubscribedEvents() {
$events[CartEvents::CART_ENTITY_ADD][] = [
'cartAdd',
];
$events[CartEvents::CART_ORDER_ITEM_UPDATE][] = [
'cartItemUpdate',
];
$events[CartEvents::CART_ORDER_ITEM_REMOVE][] = [
'cartItemRemove',
];
return $events;
}
}