bundles/Factory/CartBundle/Controller/CartController.php line 32

Open in your IDE?
  1. <?php
  2. namespace Factory\CartBundle\Controller;
  3. use App\Model\Product;
  4. use Factory\CartBundle\Classes\Traits\Controller\ControllerDispatchActionTrait;
  5. use Factory\CartBundle\Classes\CartEvents;
  6. use Factory\CartBundle\Classes\DataMapper\CartDataMapper;
  7. use Factory\CartBundle\Classes\Traits\Controller\GetCartTrait;
  8. use Factory\CartBundle\Event\CartEvent;
  9. use Pimcore\Bundle\EcommerceFrameworkBundle\Exception\VoucherServiceException;
  10. use Pimcore\Bundle\EcommerceFrameworkBundle\Model\CheckoutableInterface;
  11. use Pimcore\Model\DataObject\AbstractObject;
  12. use Pimcore\Model\DataObject\Fieldcollection;
  13. use Pimcore\Model\DataObject\Product\Listing as ProductListing;
  14. use App\Classes\DataMapper\Customer\Address\AddressDataMapper;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. class CartController extends FrontController
  20. {
  21.     use GetCartTrait;
  22.     use ControllerDispatchActionTrait;
  23.     public function __construct(private EventDispatcherInterface $eventDispatcher, private TranslatorInterface $translator)
  24.     {
  25.     }
  26.     #[Template()]
  27.     public function indexAction(Request $request)
  28.     {
  29.         $event = new CartEvent(
  30.             null,
  31.             [
  32.                 'cartName' => 'cart'
  33.             ]
  34.         );
  35.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_FETCH);
  36.         if ($event->isStopped()) {
  37.             $this->addFlash($event->getMessageType(), $event->getMessage());
  38.             if ($event->hasResponse()) {
  39.                 return $event->getResponse();
  40.             }
  41.             return;
  42.         }
  43.         $cart $this->getCart($event->getArgument('cartName'), $request);
  44.         $event = new CartEvent(
  45.             $cart
  46.         );
  47.         $this->eventDispatcher->dispatch($eventCartEvents::CART_AFTER_FETCH);
  48.         if ($event->isStopped()) {
  49.             $this->addFlash($event->getMessageType(), $event->getMessage());
  50.             if ($event->hasResponse()) {
  51.                 return $event->getResponse();
  52.             }
  53.             return;
  54.         }
  55.         if ($request->isXmlHttpRequest() || $request->get('ajax')) {
  56.             return $this->respondWithSuccess(
  57.                 $this->translator->trans('looome.cart-mini'),
  58.                 (new CartDataMapper($event->getSubject()))->all($request),
  59.                 200
  60.             );
  61.         }
  62.         if ($user $this->getUser()) {
  63.             $addresses $user->getAddresses() ?? new Fieldcollection();
  64.             $addresses AddressDataMapper::list($addresses->getItems())->all($request);
  65.             $addressesEU array_filter($addresses, function ($var) {
  66.                 return ($var['isEU'] == true);
  67.             });
  68.             $defaultBillingAddressId $user->getDefaultBillingAddress();
  69.             $defaultShippingAddressId $user->getDefaultShippingAddress();
  70.             $checkAddressIsEU array_filter($addressesEU, function ($var) use ($defaultBillingAddressId$defaultShippingAddressId){
  71.                 return (($var['id'] == $defaultBillingAddressId) || ($var['id'] == $defaultShippingAddressId));
  72.             });
  73.             $isEU false;
  74.             if (count($checkAddressIsEU)) {
  75.                 $isEU true;
  76.             }
  77.             $this->view->isEU $isEU;
  78.         }
  79.         $this->view->cartData = (new CartDataMapper($event->getSubject()))->all($request);
  80.         $this->view->cart $cart;
  81.     }
  82.     public function updateAction(Request $request)
  83.     {
  84.         $redirect $request->get('redirect_to');
  85.         $quantities $request->get('quantities', []);
  86.         if (empty($quantities)) {
  87.             return $this->respondWithError(
  88.                 $this->translator->trans('factory.cart-bundle.update.missing-param'),
  89.                 422
  90.             );
  91.         }
  92.         // @todo in future, use service container to get purchasable class
  93.         $productListing = new ProductListing;
  94.         $productListing->setCondition("o_id IN (?)", [array_keys($quantities)]);
  95.         $productListing->setObjectTypes([AbstractObject::OBJECT_TYPE_OBJECTAbstractObject::OBJECT_TYPE_VARIANT]);
  96.         $products $productListing->load();
  97.         foreach ($products as $product) {
  98.             if (!$product instanceof CheckoutableInterface) {
  99.                 return $this->respondWithError(
  100.                     $this->get('translator')->trans('factory.cart-bundle.update.general-error'),
  101.                     422
  102.                 );
  103.             }
  104.         }
  105.         $event = new CartEvent(
  106.             $this->getCart(),
  107.             [
  108.                 'products' => $products,
  109.                 'quantities' => $quantities,
  110.             ]
  111.         );
  112.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_UPDATE);
  113.         if ($event->isStopped()) {
  114.             $this->addFlash($event->getMessageType(), $event->getMessage());
  115.             if ($event->hasResponse()) {
  116.                 return $event->getResponse();
  117.             }
  118.             return $this->redirectBack($request);
  119.         }
  120.         $cart $event->getSubject();
  121.         $products $event->getArgument('products');
  122.         $quantities $event->getArgument('quantities');
  123.         foreach ($products as $product) {
  124.             $quantity intVal($quantities[strVal($product->getId())]);
  125.             if ($quantity 0) {
  126.                 $cart->updateItemCount($product->getId(), $quantity);
  127.             } else {
  128.                 $cart->removeItem($product->getId());
  129.             }
  130.         }
  131.         $cart->save();
  132.         $event = new CartEvent(
  133.             $this->getCart(),
  134.             [
  135.                 'products' => $products,
  136.                 'quantities' => $quantities,
  137.             ]
  138.         );
  139.         $this->eventDispatcher->dispatch($eventCartEvents::CART_AFTER_UPDATE);
  140.         if ($event->isStopped()) {
  141.             $this->addFlash($event->getMessageType(), $event->getMessage());
  142.             if ($event->hasResponse()) {
  143.                 return $event->getResponse();
  144.             }
  145.             return $this->redirectBack($request);
  146.         }
  147.         if ($redirect) {
  148.             return $this->redirect($redirect);
  149.         }
  150.         return $this->respondWithSuccess(
  151.             $this->translator->trans('factory.cart-bundle.update.success'),
  152.             (new CartDataMapper($cart))->all($request),
  153.             200
  154.         );
  155.     }
  156.     public function addAction(Request $request)
  157.     {
  158.         $redirect $request->get('redirect_to');
  159.         // @todo in future, use service container to get purchasable class
  160.         $product Product::getById($request->get('product'));
  161.         if (!$product) {
  162.             return $this->respondWithError(
  163.                 $this->translator->trans('factory.cart-bundle.add.product-404'),
  164.                 404
  165.             );
  166.         }
  167.         if (!$product instanceof CheckoutableInterface) {
  168.             return $this->respondWithError(
  169.                 $this->translator->trans('factory.cart-bundle.add.general-error'),
  170.                 422
  171.             );
  172.         }
  173.         $event = new CartEvent(
  174.             $this->getCart(),
  175.             [
  176.                 'product' => $product,
  177.                 'quantity' => $request->get('quantity'),
  178.                 'itemKey' => null,
  179.                 'replace' => false,
  180.                 'params' => [],
  181.                 'subProducts' => [],
  182.                 'comment' => null,
  183.             ]
  184.         );
  185.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_ADD);
  186.         if ($event->isStopped()) {
  187.             $this->addFlash($event->getMessageType(), $event->getMessage());
  188.             if ($event->hasResponse()) {
  189.                 return $event->getResponse();
  190.             }
  191.             return $this->redirectBack($request);
  192.         }
  193.         $cart $event->getSubject();
  194.         $itemKey $cart->addItem(
  195.             $event->getArgument('product'),
  196.             $event->getArgument('quantity'),
  197.             $event->getArgument('itemKey'),
  198.             $event->getArgument('replace'),
  199.             $event->getArgument('params'),
  200.             $event->getArgument('subProducts'),
  201.             $event->getArgument('comment')
  202.         );
  203.         $cart->save();
  204.         $event = new CartEvent(
  205.             $this->getCart(),
  206.             [
  207.                 'itemKey' => $itemKey,
  208.             ]
  209.         );
  210.         $this->eventDispatcher->dispatch($eventCartEvents::CART_AFTER_ADD);
  211.         if ($event->isStopped()) {
  212.             $this->addFlash($event->getMessageType(), $event->getMessage());
  213.             if ($event->hasResponse()) {
  214.                 return $event->getResponse();
  215.             }
  216.             return $this->redirectBack($request);
  217.         }
  218.         if ($redirect) {
  219.             return $this->redirect($redirect);
  220.         }
  221.         return $this->respondWithSuccess(
  222.             $this->translator->trans('factory.cart-bundle.add.success'),
  223.             (new CartDataMapper($cart))->all($request),
  224.             200
  225.         );
  226.     }
  227.     public function bulkAddAction(Request $request)
  228.     {
  229.         $redirect $request->get('redirect_to');
  230.         $quantities $request->get('products', []);
  231.         if (empty($quantities)) {
  232.             return $this->respondWithError(
  233.                 $this->translator->trans('factory.cart-bundle.bulk-add.missing-param'),
  234.                 422
  235.             );
  236.         }
  237.         // @todo in future, use service container to get purchasable class
  238.         $productListing = new ProductListing;
  239.         $productListing->setCondition("o_id IN (?)", [array_keys($quantities)]);
  240.         $productListing->setObjectTypes([AbstractObject::OBJECT_TYPE_OBJECTAbstractObject::OBJECT_TYPE_VARIANT]);
  241.         $products $productListing->load();
  242.         foreach ($products as $product) {
  243.             if (!$product instanceof CheckoutableInterface) {
  244.                 return $this->respondWithError(
  245.                     $this->translator->trans('factory.cart-bundle.update.general-error'),
  246.                     422
  247.                 );
  248.             }
  249.         }
  250.         $event = new CartEvent(
  251.             $this->getCart(),
  252.             [
  253.                 'products' => $products,
  254.                 'quantities' => $quantities,
  255.             ]
  256.         );
  257.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_BULK_ADD);
  258.         if ($event->isStopped()) {
  259.             $this->addFlash($event->getMessageType(), $event->getMessage());
  260.             if ($event->hasResponse()) {
  261.                 return $event->getResponse();
  262.             }
  263.             return $this->redirectBack($request);
  264.         }
  265.         $cart $event->getSubject();
  266.         $products $event->getArgument('products');
  267.         $quantities $event->getArgument('quantities');
  268.         foreach ($products as $product) {
  269.             $quantity intVal($quantities[strVal($product->getId())]);
  270.             if (!$quantity) {
  271.                 continue;
  272.             }
  273.             $cart->addItem($product$quantity);
  274.         }
  275.         $cart->save();
  276.         $event = new CartEvent(
  277.             $this->getCart(),
  278.             [
  279.                 'products' => $products,
  280.                 'quantities' => $quantities,
  281.             ]
  282.         );
  283.         $this->eventDispatcher->dispatch($eventCartEvents::CART_AFTER_BULK_ADD);
  284.         if ($event->isStopped()) {
  285.             $this->addFlash($event->getMessageType(), $event->getMessage());
  286.             if ($event->hasResponse()) {
  287.                 return $event->getResponse();
  288.             }
  289.             return $this->redirectBack($request);
  290.         }
  291.         if ($redirect) {
  292.             return $this->redirect($redirect);
  293.         }
  294.         return $this->respondWithSuccess(
  295.             $this->translator->trans('factory.cart-bundle.update.success'),
  296.             (new CartDataMapper($cart))->all($request),
  297.             200
  298.         );
  299.     }
  300.     public function removeAction(Request $request)
  301.     {
  302.         $redirect $request->get('redirect_to');
  303.         if (empty($request->get('product'))) {
  304.             return $this->respondWithError(
  305.                 $this->get('translator')->trans('factory.cart-bundle.remove.missing-param'),
  306.                 422
  307.             );
  308.         }
  309.         $event = new CartEvent(
  310.             $this->getCart(),
  311.             [
  312.                 'productId' => $request->get('product'),
  313.                 'itemKey' => $request->get('itemKey'$request->get('product'))
  314.             ]
  315.         );
  316.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_REMOVE);
  317.         if ($event->isStopped()) {
  318.             $this->addFlash($event->getMessageType(), $event->getMessage());
  319.             if ($event->hasResponse()) {
  320.                 return $event->getResponse();
  321.             }
  322.             return $this->redirectBack($request);
  323.         }
  324.         $cart $event->getSubject();
  325.         $cart->removeItem(
  326.             $event->getArgument('itemKey')
  327.         );
  328.         $cart->save();
  329.         $event = new CartEvent(
  330.             $this->getCart(),
  331.             [
  332.                 'itemKey' => $event->getArgument('itemKey')
  333.             ]
  334.         );
  335.         $this->eventDispatcher->dispatch($eventCartEvents::CART_AFTER_REMOVE);
  336.         if ($event->isStopped()) {
  337.             $this->addFlash($event->getMessageType(), $event->getMessage());
  338.             if ($event->hasResponse()) {
  339.                 return $event->getResponse();
  340.             }
  341.             return $this->redirectBack($request);
  342.         }
  343.         if ($redirect) {
  344.             return $this->redirect($redirect);
  345.         }
  346.         return $this->respondWithSuccess(
  347.             $this->translator->trans('factory.cart-bundle.remove.success'),
  348.             (new CartDataMapper($cart))->all($request),
  349.             200
  350.         );
  351.     }
  352.     public function addCouponCodeAction(Request $request)
  353.     {
  354.         $redirect $request->get('redirect_to');
  355.         if (empty($request->get('code'))) {
  356.             return $this->respondWithError(
  357.                 $this->translator->trans('factory.cart-bundle.coupon_code_remove.missing-param'),
  358.                 422
  359.             );
  360.         }
  361.         $event = new CartEvent(
  362.             $this->getCart(),
  363.             [
  364.                 'code' => $request->get('code')
  365.             ]
  366.         );
  367.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_COUPON_CODE_ADD);
  368.         if ($event->isStopped()) {
  369.             $this->addFlash($event->getMessageType(), $event->getMessage());
  370.             if ($event->hasResponse()) {
  371.                 return $event->getResponse();
  372.             }
  373.             return $this->redirectBack($request);
  374.         }
  375.         $cart $event->getSubject();
  376.         try{
  377.             $cart->addVoucherToken($event->getArgument('code'));
  378.         } catch (\Pimcore\Bundle\EcommerceFrameworkBundle\Exception\VoucherServiceException $e) {
  379.             return $this->respondWithError(
  380.                 $this->translator->trans('factory.cart-bundle.coupon_code_add.invalid-code')
  381.             );
  382.         } catch (\Exception $e) {
  383.             return $this->respondWithError(
  384.                 $this->translator->trans('factory.cart-bundle.coupon_code_add.error')
  385.             );
  386.         }
  387.         $cart->save();
  388.         $event = new CartEvent(
  389.             $this->getCart(),
  390.             [
  391.                 'code' => $event->getArgument('code')
  392.             ]
  393.         );
  394.         $this->eventDispatcher->dispatch($eventCartEvents::CART_AFTER_COUPON_CODE_ADD);
  395.         if ($event->isStopped()) {
  396.             $this->addFlash($event->getMessageType(), $event->getMessage());
  397.             if ($event->hasResponse()) {
  398.                 return $event->getResponse();
  399.             }
  400.             return $this->redirectBack($request);
  401.         }
  402.         if ($redirect) {
  403.             return $this->redirect($redirect);
  404.         }
  405.         return $this->respondWithSuccess(
  406.             $this->translator->trans('factory.cart-bundle.coupon_code_add.success'),
  407.             (new CartDataMapper($cart))->all($request),
  408.             200
  409.         );
  410.     }
  411.     public function removeCouponCodeAction(Request $request)
  412.     {
  413.         $redirect $request->get('redirect_to');
  414.         if (empty($request->get('code'))) {
  415.             return $this->respondWithError(
  416.                 $this->translator->trans('factory.cart-bundle.coupon_code_add.missing-param'),
  417.                 422
  418.             );
  419.         }
  420.         $event = new CartEvent(
  421.             $this->getCart(),
  422.             [
  423.                 'code' => $request->get('code')
  424.             ]
  425.         );
  426.         $this->eventDispatcher->dispatch($eventCartEvents::CART_BEFORE_COUPON_CODE_REMOVE);
  427.         if ($event->isStopped()) {
  428.             $this->addFlash($event->getMessageType(), $event->getMessage());
  429.             if ($event->hasResponse()) {
  430.                 return $event->getResponse();
  431.             }
  432.             return $this->redirectBack($request);
  433.         }
  434.         $cart $event->getSubject();
  435.         try {
  436.             $cart->removeVoucherToken($event->getArgument('code'));
  437.         } catch (VoucherServiceException $e) {
  438.             return $this->respondWithError(
  439.                 $this->translator->trans('factory.cart-bundle.coupon_code_remove.invalid-code')
  440.             );
  441.         } catch (\Exception $e) {
  442.             return $this->respondWithError(
  443.                 $this->translator->trans('factory.cart-bundle.coupon_code_remove.error')
  444.             );
  445.         }
  446.         $cart->save();
  447.         $event = new CartEvent(
  448.             $this->getCart(),
  449.             [
  450.                 'code' => $event->getArgument('code')
  451.             ]
  452.         );
  453.         $this->translator->dispatch(CartEvents::CART_AFTER_COUPON_CODE_REMOVE$event);
  454.         if ($event->isStopped()) {
  455.             $this->addFlash($event->getMessageType(), $event->getMessage());
  456.             if ($event->hasResponse()) {
  457.                 return $event->getResponse();
  458.             }
  459.             return $this->redirectBack($request);
  460.         }
  461.         if ($redirect) {
  462.             return $this->redirect($redirect);
  463.         }
  464.         return $this->respondWithSuccess(
  465.             $this->translator->trans('factory.cart-bundle.coupon_code_remove.success'),
  466.             (new CartDataMapper($cart))->all($request),
  467.             200
  468.         );
  469.     }
  470.     public function applyVoucherCodeAction(Request $request)
  471.     {
  472.         $request->request->set('code'$request->get('voucher-code'));
  473.         return $this->addCouponCodeAction($request);
  474.     }
  475. }