vendor/crehler/shopping-list/Storefront/Controller/ShoppingListController.php line 305

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. /**
  3.  * @copyright 2020 Crehler Sp. z o. o. <https://crehler.com>
  4.  *
  5.  * @author    Jakub MedyƄski <jme@crehler.com>
  6.  * @support   Crehler <support@crehler.com>
  7.  * @created   13 maj 2020
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Crehler\ShoppingList\Storefront\Controller;
  13. use Crehler\ShoppingList\CrehlerShoppingList;
  14. use Crehler\ShoppingList\Document\ShoppingListDocumentService;
  15. use Crehler\ShoppingList\Service\ShoppingListService;
  16. use Crehler\ShoppingList\Storefront\Page\ShoppingList\ShoppingListPageLoader;
  17. use Shopware\Core\Checkout\Customer\CustomerEntity;
  18. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  19. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  20. use Shopware\Storefront\Controller\StorefrontController;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\RedirectResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Crehler\ShoppingList\Document\Controller\ShoppingListDocumentController;
  27. use DateTimeImmutable;
  28. use DateTimeZone;
  29. /**
  30.  * @RouteScope(scopes={"storefront"})
  31.  */
  32. class ShoppingListController extends StorefrontController
  33. {
  34.     private ShoppingListPageLoader $shoppingListPageLoader;
  35.     private ShoppingListService $shoppingListService;
  36.     private ShoppingListDocumentService $shoppingListDocumentService;
  37.     public function __construct(
  38.         ShoppingListPageLoader      $shoppingListPageLoader,
  39.         ShoppingListService         $shoppingListService,
  40.         ShoppingListDocumentService $shoppingListDocumentService)
  41.     {
  42.         $this->shoppingListPageLoader $shoppingListPageLoader;
  43.         $this->shoppingListService $shoppingListService;
  44.         $this->shoppingListDocumentService $shoppingListDocumentService;
  45.     }
  46.     /**
  47.      * @Route("/shopping-list/cart-to-pdf", name="frontend.shopping-list.cart-to-pdf", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  48.      */
  49.     public function saveCartAndPrintPdf(Request $requestSalesChannelContext $salesChannelContext): Response
  50.     {
  51.         $productsData json_decode($request->get('pdf_creator_add_to_post_products_data'), true);
  52.         $token $request->cookies->get(CrehlerShoppingList::SHOPPING_LIST_COOKIE_TOKEN_NAME);
  53.         $dateNow = new DateTimeImmutable();
  54.         $dateNow $dateNow->setTimezone(new \DateTimeZone('Europe/Warsaw'));
  55.         $listName 'Koszyk_' $dateNow->format('Y_m_d_H:i:s');
  56.         $listId $this->shoppingListService->addListProducts(
  57.             $listName,
  58.             $productsData,
  59.             $token,
  60.             $salesChannelContext
  61.         );
  62.         $this->shoppingListDocumentService->createPdf($listIdtrue$salesChannelContext);
  63.         $page $this->shoppingListPageLoader->loadDetail($listId$request$salesChannelContext);
  64.         if (null === $page) {
  65.             return $this->redirectToRoute('frontend.shopping-list.page');
  66.         }
  67.         return $this->renderStorefront('@CrehlerShoppingList/storefront/page/shopping-list/list.html.twig', ['page' => $page]);
  68.     }
  69.     /**
  70.      * @Route("/shopping-list", name="frontend.shopping-list.page", methods={"GET"}, defaults={"XmlHttpRequest": true})
  71.      */
  72.     public function index(Request $requestSalesChannelContext $salesChannelContext): Response
  73.     {
  74.         $page $this->shoppingListPageLoader->load($request$salesChannelContext);
  75.         return $this->renderStorefront('@CrehlerShoppingList/storefront/page/shopping-list/index.html.twig', ['page' => $page]);
  76.     }
  77.     /**
  78.      * @Route("/widgets/shopping-list", name="widgets.shopping-list.page", methods={"GET"}, defaults={"XmlHttpRequest": true})
  79.      */
  80.     public function widgetsIndex(Request $requestSalesChannelContext $salesChannelContext): Response
  81.     {
  82.         $page $this->shoppingListPageLoader->load($request$salesChannelContext);
  83.         return $this->renderStorefront('@CrehlerShoppingList/storefront/page/shopping-list/widgets-index.html.twig', ['page' => $page]);
  84.     }
  85.     /**
  86.      * @Route("/shopping-list/list/{listId}", name="frontend.shopping-list.list", methods={"GET"}, defaults={"XmlHttpRequest": true})
  87.      */
  88.     public function list(string $listIdRequest $requestSalesChannelContext $salesChannelContext): Response
  89.     {
  90.         $token $request->cookies->get(CrehlerShoppingList::SHOPPING_LIST_COOKIE_TOKEN_NAME);
  91.         $page $this->shoppingListPageLoader->loadDetail($listId$request$salesChannelContext);
  92.         $isCustomer $salesChannelContext->getCustomer() instanceof CustomerEntity;
  93.         if (null === $page) {
  94.             return $this->redirectToRoute('frontend.shopping-list.page');
  95.         }
  96.         if ($this->shoppingListService->isShareList(
  97.             $listId,
  98.             $isCustomer $salesChannelContext->getCustomer()->getId() : null,
  99.             $token,
  100.             $salesChannelContext
  101.         )) {
  102.             return $this->renderStorefront('@CrehlerShoppingList/storefront/page/shopping-list/share.html.twig', ['page' => $page]);
  103.         }
  104.         return $this->renderStorefront('@CrehlerShoppingList/storefront/page/shopping-list/list.html.twig', ['page' => $page]);
  105.     }
  106.     /**
  107.      * @Route("/shopping-list/create", name="frontend.shopping-list.page.create", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  108.      */
  109.     public function create(Request $requestSalesChannelContext $salesChannelContext): Response
  110.     {
  111.         $isJsonRequest 'json' === $request->getContentType();
  112.         $token $request->cookies->get(CrehlerShoppingList::SHOPPING_LIST_COOKIE_TOKEN_NAME);
  113.         $isCustomer $salesChannelContext->getCustomer() instanceof CustomerEntity;
  114.         $productId $request->get('productId');
  115.         $productsData $request->get('productsData');
  116.         if ($productsData) {
  117.             $listId $this->shoppingListService->addListProducts(
  118.                 $request->get('name'),
  119.                 $productsData,
  120.                 $token,
  121.                 $salesChannelContext
  122.             );
  123.         } else {
  124.             $listId $this->shoppingListService->addList(
  125.                 $request->get('name'),
  126.                 $productId,
  127.                 (int)$request->get('quantity'1),
  128.                 $token,
  129.                 $salesChannelContext
  130.             );
  131.         }
  132.         if ($isJsonRequest) {
  133.             return JsonResponse::create(
  134.                 $this->shoppingListService->getShoppingLists(
  135.                     $isCustomer $salesChannelContext->getCustomer()->getId() : null,
  136.                     $token,
  137.                     $salesChannelContext,
  138.                     true
  139.                 )->jsonSerialize()
  140.             );
  141.         }
  142.         return new RedirectResponse($this->generateUrl('frontend.shopping-list.list', ['listId' => $listId]));
  143.     }
  144.     /**
  145.      * @Route("/shopping-list/remove", name="frontend.shopping-list.page.remove", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  146.      */
  147.     public function remove(Request $requestSalesChannelContext $salesChannelContext): Response
  148.     {
  149.         $listId $request->get('listId');
  150.         if (null !== $listId) {
  151.             $this->shoppingListService->deleteList($listId$salesChannelContext);
  152.         }
  153.         return $this->createActionResponse($request);
  154.     }
  155.     /**
  156.      * @Route("/shopping-list/rename", name="frontend.shopping-list.page.rename", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  157.      */
  158.     public function rename(Request $requestSalesChannelContext $salesChannelContext): Response
  159.     {
  160.         $listId $request->get('listId');
  161.         $name $request->get('name');
  162.         if (null !== $listId && $name) {
  163.             $this->shoppingListService->renameList($listId$name$salesChannelContext);
  164.         }
  165.         return $this->createActionResponse($request);
  166.     }
  167.     /**
  168.      * @Route("/shopping-list/addItem", name="frontend.shopping-list.page.addItem", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  169.      */
  170.     public function addItem(Request $requestSalesChannelContext $salesChannelContext): Response
  171.     {
  172.         $isJsonRequest 'json' === $request->getContentType();
  173.         $isCustomer $salesChannelContext->getCustomer() instanceof CustomerEntity;
  174.         $token $request->cookies->get(CrehlerShoppingList::SHOPPING_LIST_COOKIE_TOKEN_NAME);
  175.         $productId $request->get('productId');
  176.         $productsData $request->get('productsData');
  177.         if ($productId) {
  178.             $this->shoppingListService->addItem(
  179.                 $productId,
  180.                 $request->get('shoppingListId'),
  181.                 $request->get('quantity'),
  182.                 $token,
  183.                 $salesChannelContext
  184.             );
  185.         } elseif ($productsData) {
  186.             $this->shoppingListService->addItems(
  187.                 $productsData,
  188.                 $request->get('shoppingListId'),
  189.                 $token,
  190.                 $salesChannelContext
  191.             );
  192.         }
  193.         if ($isJsonRequest) {
  194.             return JsonResponse::create(
  195.                 $this->shoppingListService->getShoppingLists(
  196.                     $isCustomer $salesChannelContext->getCustomer()->getId() : null,
  197.                     $token,
  198.                     $salesChannelContext,
  199.                     true
  200.                 )->jsonSerialize()
  201.             );
  202.         }
  203.         return new RedirectResponse($this->generateUrl('frontend.shopping-list.page', ['itemAdded' => true]));
  204.     }
  205.     /**
  206.      * @Route("/shopping-list/changeQuantity", name="frontend.shopping-list.page.changeQuantity", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  207.      */
  208.     public function changeQuantity(Request $requestSalesChannelContext $salesChannelContext): Response
  209.     {
  210.         try {
  211.             $listId $request->get('listId');
  212.             $quantity $request->get('quantity');
  213.             if ($quantity === null) {
  214.                 throw new \InvalidArgumentException('quantity field is required');
  215.             }
  216.             if ($quantity 1) {
  217.                 throw new \InvalidArgumentException('quantity cannot be lower than 0');
  218.             }
  219.             $shoppingListItemId $request->get('shoppingListItemId');
  220.             if ($shoppingListItemId === null) {
  221.                 throw new \InvalidArgumentException('shopping list item id field is required');
  222.             }
  223.             $this->shoppingListService->changeQuantity($listId$shoppingListItemId, (int)$quantity$salesChannelContext);
  224.             $this->addFlash('success'$this->trans('shoppingList.shoppingListUpdateSuccess'));
  225.         } catch (\Exception $exception) {
  226.             $this->addFlash('danger'$this->trans('error.message-default'));
  227.         }
  228.         return $this->createActionResponse($request);
  229.     }
  230.     /**
  231.      * @Route("/shopping-list/deleteItem", name="frontend.shopping-list.page.deleteItem", methods={"POST"},  options={"seo"="false"}, defaults={"XmlHttpRequest": true})
  232.      */
  233.     public function deleteItem(Request $requestSalesChannelContext $salesChannelContext): Response
  234.     {
  235.         try {
  236.             $listId $request->get('listId');
  237.             $shoppingListItemId $request->get('shoppingListItemId');
  238.             $shoppingListItemIds $request->get('shoppingListItemIds');
  239.             if ($shoppingListItemId === null && $shoppingListItemIds === null) {
  240.                 throw new \InvalidArgumentException('shopping list item id field is required');
  241.             }
  242.             $this->shoppingListService->deleteItems($listId,
  243.                 $shoppingListItemIds ?? [$shoppingListItemId], $salesChannelContext);
  244.             $this->addFlash('success'$this->trans('shoppingList.shoppingListRemoveSuccess'));
  245.         } catch (\Exception $exception) {
  246.             $this->addFlash('danger'$this->trans('error.message-default'));
  247.         }
  248.         return $this->createActionResponse($request);
  249.     }
  250.     /**
  251.      * @Route("/widgets/shopping-list/info", name="frontend.shopping-list.info", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  252.      */
  253.     public function info(Request $requestSalesChannelContext $salesChannelContext): Response
  254.     {
  255.         $page $this->shoppingListPageLoader->load($request$salesChannelContext);
  256.         return $this->renderStorefront('@CrehlerShoppingList/storefront/layout/header/actions/shopping-list-widget.html.twig', ['page' => $page]);
  257.     }
  258. }