src/EventSubscriber/Cart/CartActionSubscriber.php line 94

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Cart;
  3. use App\Model\Customer;
  4. use Exception;
  5. use Factory\CartBundle\Classes\CartEvents;
  6. use Factory\CartBundle\Event\CartEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Factory\CartBundle\Repository\CartRepository;
  9. use Pimcore\Bundle\EcommerceFrameworkBundle\EnvironmentInterface;
  10. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\Security\Core\Security;
  13. use Symfony\Component\HttpFoundation\Request;
  14. class CartActionSubscriber implements EventSubscriberInterface
  15. {
  16.     /**
  17.      * @var Security
  18.      */
  19.     protected $security;
  20.     /**
  21.      * @var RequestStack
  22.      */
  23.     protected $requestStack;
  24.     /**
  25.      * @var CartRepository
  26.      */
  27.     protected $cartRepository;
  28.     /**
  29.      * @var EnvironmentInterface
  30.      */
  31.     protected $environment;
  32.     public static function getSubscribedEvents()
  33.     {
  34.         return [
  35.             CartEvents::CART_BEFORE_BULK_ADD => [
  36.                 ['prepareCartForDivision'10],
  37.                 ['checkProductsCompatibility'8],
  38.                 ['updateCustomerAddress'5]
  39.             ],
  40.             CartEvents::CART_BEFORE_FETCH => [
  41.                 ['prepareCartNameForDivision'10],
  42.                 ['updateCustomerAddress'5]
  43.             ],
  44.             CartEvents::CART_BEFORE_ADD => [
  45.                 ['prepareCartForDivision'10],
  46.                 ['checkProductCompatibility'8],
  47.                 ['checkAvailability'6],
  48.                 ['updateCustomerAddress'5]
  49.             ],
  50.             CartEvents::CART_BEFORE_UPDATE => [
  51.                 ['prepareCartForDivision'10],
  52.                 ['checkProductsCompatibility'8],
  53.                 ['checkAvailability'6],
  54.                 ['updateCustomerAddress'5]
  55.             ],
  56.             CartEvents::CART_BEFORE_REMOVE => [
  57.                 ['prepareCartForDivision'10],
  58.                 ['updateCustomerAddress'5]
  59.             ],
  60.             CartEvents::CART_BEFORE_COUPON_CODE_ADD => [
  61.                 ['prepareCartForDivision'10]
  62.             ],
  63.             CartEvents::CART_BEFORE_COUPON_CODE_REMOVE => [
  64.                 ['prepareCartForDivision'10]
  65.             ]
  66.         ];
  67.     }
  68.     public function __construct(
  69.         Security $security,
  70.         RequestStack $requestStack,
  71.         CartRepository $cartRepository,
  72.         EnvironmentInterface $environment
  73.     ) {
  74.         $this->security $security;
  75.         $this->requestStack $requestStack;
  76.         $this->cartRepository $cartRepository;
  77.         $this->environment $environment;
  78.     }
  79.     protected function getRequest(): Request
  80.     {
  81.         return $this->requestStack->getMasterRequest();
  82.     }
  83.     public function updateCustomerAddress()
  84.     {
  85.         $env Factory::getInstance()->getEnvironment();
  86.         if ($env->getCurrentUserId() < 1) {
  87.             $env->setBillingAddress(null);
  88.             return;
  89.         }
  90.         $customer Customer::getById($env->getCurrentUserId());
  91.         $billing_address null;
  92.         $shipping_address null;
  93.         $billing_default_address $customer->getDefaultBillingAddressObject();
  94.         $shipping_default_address $customer->getDefaultShippingAddressObject();
  95.         if ($this->getRequest()->cookies->has('__billing_address_id')) {
  96.             $billing_address_id $this->getRequest()->cookies->get('__billing_address_id');
  97.             $billing_address $customer->getAddress($billing_address_id);
  98.         }
  99.         if ($this->getRequest()->cookies->has('__shipping_address_id')) {
  100.             $shipping_address_id $this->getRequest()->cookies->get('__shipping_address_id');
  101.             $shipping_address $customer->getAddress($shipping_address_id);
  102.         }
  103.         if (!$billing_address && !$billing_default_address) {
  104.             throw new Exception('User must have selected default billing address!');
  105.         }
  106.         $env->setBillingAddress($billing_address ?? $billing_default_address);
  107.         $env->setShippingAddress($shipping_address ?? $shipping_default_address);
  108.         $env->save();
  109.     }
  110.     public function prepareCartNameForDivision(CartEvent $event)
  111.     {
  112.         if (!$this->hasDivisionSegment()) {
  113.             return;
  114.         }
  115.         $cartName $this->createCartName($this->getDivisionSegment());
  116.         $event->setArgument('cartName'$cartName);
  117.     }
  118.     public function prepareCartForDivision(CartEvent $event)
  119.     {
  120.         if (!$this->hasDivisionSegment()) {
  121.             return;
  122.         }
  123.         $cartName $this->createCartName($this->getDivisionSegment());
  124.         $cart $this->getCart($cartName$this->getUser());
  125.         $event->setSubject($cart);
  126.     }
  127.     public function checkProductsCompatibility(CartEvent $event)
  128.     {
  129.         //dd($this->requestStack->getCurrentRequest()->get('products'));
  130.         if (!$this->hasDivisionSegment()) {
  131.             return;
  132.         }
  133.         // Do Nothing
  134.     }
  135.     public function checkProductCompatibility(CartEvent $event)
  136.     {
  137.         if (!$this->hasDivisionSegment()) {
  138.             return;
  139.         }
  140.         // Do Nothing
  141.     }
  142.     public function checkAvailability(CartEvent $event)
  143.     {
  144.         if (!$this->hasDivisionSegment()) {
  145.             return;
  146.         }
  147.         // Do Nothing
  148.     }
  149.     protected function createCartName($division)
  150.     {
  151.         return $division '_cart';
  152.     }
  153.     protected function getCart($cartName$user null)
  154.     {
  155.         if ($user) {
  156.             return $this->cartRepository->getDatabaseCart($user$cartName) ?? $this->cartRepository->createDatabaseCart($user$cartName);
  157.         }
  158.         return $this->cartRepository->getSessionCart($cartName) ?? $this->cartRepository->createSessionCart($cartName);
  159.     }
  160.     protected function getUser()
  161.     {
  162.         if (!$token $this->security->getToken()) {
  163.             return null;
  164.         }
  165.         $user $this->security->getToken()->getUser();
  166.         if (!is_object($user)) {
  167.             // eg. "anon."
  168.             return null;
  169.         }
  170.         return $user;
  171.     }
  172.     protected function hasDivisionSegment()
  173.     {
  174.         return !empty($this->getDivisionSegment());
  175.     }
  176.     protected function getDivisionSegment()
  177.     {
  178.         return $this->getRequest()->get('division');
  179.     }
  180. }