vendor/shopware/storefront/Controller/WishlistController.php line 47

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Controller;
  3. use Shopware\Core\Checkout\Customer\CustomerEntity;
  4. use Shopware\Core\Checkout\Customer\Exception\CustomerWishlistNotFoundException;
  5. use Shopware\Core\Checkout\Customer\Exception\DuplicateWishlistProductException;
  6. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractAddWishlistProductRoute;
  7. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractLoadWishlistRoute;
  8. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractMergeWishlistProductRoute;
  9. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractRemoveWishlistProductRoute;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\Log\Package;
  12. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  13. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  14. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  15. use Shopware\Storefront\Page\Wishlist\GuestWishlistPageLoadedHook;
  16. use Shopware\Storefront\Page\Wishlist\GuestWishlistPageLoader;
  17. use Shopware\Storefront\Page\Wishlist\WishlistPageLoadedHook;
  18. use Shopware\Storefront\Page\Wishlist\WishlistPageLoader;
  19. use Shopware\Storefront\Page\Wishlist\WishListPageProductCriteriaEvent;
  20. use Shopware\Storefront\Page\Wishlist\WishlistWidgetLoadedHook;
  21. use Shopware\Storefront\Pagelet\Wishlist\GuestWishlistPageletLoadedHook;
  22. use Shopware\Storefront\Pagelet\Wishlist\GuestWishlistPageletLoader;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  29. /**
  30.  * @internal
  31.  */
  32. #[Route(defaults: ['_routeScope' => ['storefront']])]
  33. #[Package('storefront')]
  34. class WishlistController extends StorefrontController
  35. {
  36.     /**
  37.      * @internal
  38.      */
  39.     public function __construct(private readonly WishlistPageLoader $wishlistPageLoader, private readonly AbstractLoadWishlistRoute $wishlistLoadRoute, private readonly AbstractAddWishlistProductRoute $addWishlistRoute, private readonly AbstractRemoveWishlistProductRoute $removeWishlistProductRoute, private readonly AbstractMergeWishlistProductRoute $mergeWishlistProductRoute, private readonly GuestWishlistPageLoader $guestPageLoader, private readonly GuestWishlistPageletLoader $guestPageletLoader, private readonly EventDispatcherInterface $eventDispatcher)
  40.     {
  41.     }
  42.     #[Route(path'/wishlist'name'frontend.wishlist.page'options: ['seo' => false], defaults: ['_noStore' => true], methods: ['GET'])]
  43.     public function index(Request $requestSalesChannelContext $context): Response
  44.     {
  45.         $customer $context->getCustomer();
  46.         if ($customer !== null && $customer->getGuest() === false) {
  47.             $page $this->wishlistPageLoader->load($request$context$customer);
  48.             $this->hook(new WishlistPageLoadedHook($page$context));
  49.         } else {
  50.             $page $this->guestPageLoader->load($request$context);
  51.             $this->hook(new GuestWishlistPageLoadedHook($page$context));
  52.         }
  53.         return $this->renderStorefront('@Storefront/storefront/page/wishlist/index.html.twig', ['page' => $page]);
  54.     }
  55.     #[Route(path'/wishlist/guest-pagelet'name'frontend.wishlist.guestPage.pagelet'options: ['seo' => false], defaults: ['XmlHttpRequest' => true], methods: ['POST'])]
  56.     public function guestPagelet(Request $requestSalesChannelContext $context): Response
  57.     {
  58.         $customer $context->getCustomer();
  59.         if ($customer !== null && $customer->getGuest() === false) {
  60.             throw new NotFoundHttpException();
  61.         }
  62.         $pagelet $this->guestPageletLoader->load($request$context);
  63.         $this->hook(new GuestWishlistPageletLoadedHook($pagelet$context));
  64.         return $this->renderStorefront(
  65.             '@Storefront/storefront/page/wishlist/wishlist-pagelet.html.twig',
  66.             ['page' => $pagelet'searchResult' => $pagelet->getSearchResult()->getObject()]
  67.         );
  68.     }
  69.     #[Route(path'/widgets/wishlist'name'widgets.wishlist.pagelet'options: ['seo' => false], defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['GET''POST'])]
  70.     public function ajaxPagination(Request $requestSalesChannelContext $contextCustomerEntity $customer): Response
  71.     {
  72.         $request->request->set('no-aggregations'true);
  73.         $page $this->wishlistPageLoader->load($request$context$customer);
  74.         $this->hook(new WishlistPageLoadedHook($page$context));
  75.         $response $this->renderStorefront('@Storefront/storefront/page/wishlist/index.html.twig', ['page' => $page]);
  76.         $response->headers->set('x-robots-tag''noindex');
  77.         return $response;
  78.     }
  79.     #[Route(path'/wishlist/list'name'frontend.wishlist.product.list'options: ['seo' => false], defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['GET'])]
  80.     public function ajaxList(Request $requestSalesChannelContext $contextCustomerEntity $customer): Response
  81.     {
  82.         $criteria = new Criteria();
  83.         $this->eventDispatcher->dispatch(new WishListPageProductCriteriaEvent($criteria$context$request));
  84.         try {
  85.             $res $this->wishlistLoadRoute->load($request$context$criteria$customer);
  86.         } catch (CustomerWishlistNotFoundException) {
  87.             return new JsonResponse([]);
  88.         }
  89.         return new JsonResponse($res->getProductListing()->getIds());
  90.     }
  91.     #[Route(path'/wishlist/product/delete/{id}'name'frontend.wishlist.product.delete'defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['POST''DELETE'])]
  92.     public function remove(string $idRequest $requestSalesChannelContext $contextCustomerEntity $customer): Response
  93.     {
  94.         if (!$id) {
  95.             throw new MissingRequestParameterException('Parameter id missing');
  96.         }
  97.         try {
  98.             $this->removeWishlistProductRoute->delete($id$context$customer);
  99.             $this->addFlash(self::SUCCESS$this->trans('wishlist.itemDeleteSuccess'));
  100.         } catch (\Throwable) {
  101.             $this->addFlash(self::DANGER$this->trans('error.message-default'));
  102.         }
  103.         return $this->createActionResponse($request);
  104.     }
  105.     #[Route(path'/wishlist/add/{productId}'name'frontend.wishlist.product.add'options: ['seo' => false], defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['POST'])]
  106.     public function ajaxAdd(string $productIdSalesChannelContext $contextCustomerEntity $customer): JsonResponse
  107.     {
  108.         try {
  109.             $this->addWishlistRoute->add($productId$context$customer);
  110.             $success true;
  111.         } catch (\Throwable) {
  112.             $success false;
  113.         }
  114.         return new JsonResponse([
  115.             'success' => $success,
  116.         ]);
  117.     }
  118.     #[Route(path'/wishlist/remove/{productId}'name'frontend.wishlist.product.remove'options: ['seo' => false], defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['POST'])]
  119.     public function ajaxRemove(string $productIdSalesChannelContext $contextCustomerEntity $customer): JsonResponse
  120.     {
  121.         try {
  122.             $this->removeWishlistProductRoute->delete($productId$context$customer);
  123.             $success true;
  124.         } catch (\Throwable) {
  125.             $success false;
  126.         }
  127.         return new JsonResponse([
  128.             'success' => $success,
  129.         ]);
  130.     }
  131.     #[Route(path'/wishlist/add-after-login/{productId}'name'frontend.wishlist.add.after.login'options: ['seo' => false], defaults: ['_loginRequired' => true], methods: ['GET'])]
  132.     public function addAfterLogin(string $productIdSalesChannelContext $contextCustomerEntity $customer): Response
  133.     {
  134.         try {
  135.             $this->addWishlistRoute->add($productId$context$customer);
  136.             $this->addFlash(self::SUCCESS$this->trans('wishlist.itemAddedSuccess'));
  137.         } catch (DuplicateWishlistProductException) {
  138.             $this->addFlash(self::WARNING$this->trans('wishlist.duplicateItemError'));
  139.         } catch (\Throwable) {
  140.             $this->addFlash(self::DANGER$this->trans('error.message-default'));
  141.         }
  142.         return $this->redirectToRoute('frontend.home.page');
  143.     }
  144.     #[Route(path'/wishlist/merge'name'frontend.wishlist.product.merge'options: ['seo' => false], defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['POST'])]
  145.     public function ajaxMerge(RequestDataBag $requestDataBagRequest $requestSalesChannelContext $contextCustomerEntity $customer): Response
  146.     {
  147.         try {
  148.             $this->mergeWishlistProductRoute->merge($requestDataBag$context$customer);
  149.             return $this->renderStorefront('@Storefront/storefront/utilities/alert.html.twig', [
  150.                 'type' => 'info''content' => $this->trans('wishlist.wishlistMergeHint'),
  151.             ]);
  152.         } catch (\Throwable) {
  153.             $this->addFlash(self::DANGER$this->trans('error.message-default'));
  154.         }
  155.         return $this->createActionResponse($request);
  156.     }
  157.     #[Route(path'/wishlist/merge/pagelet'name'frontend.wishlist.product.merge.pagelet'defaults: ['XmlHttpRequest' => true'_loginRequired' => true], methods: ['GET''POST'])]
  158.     public function ajaxPagelet(Request $requestSalesChannelContext $contextCustomerEntity $customer): Response
  159.     {
  160.         $request->request->set('no-aggregations'true);
  161.         $page $this->wishlistPageLoader->load($request$context$customer);
  162.         $this->hook(new WishlistWidgetLoadedHook($page$context));
  163.         return $this->renderStorefront('@Storefront/storefront/page/wishlist/wishlist-pagelet.html.twig', [
  164.             'page' => $page,
  165.             'searchResult' => $page->getWishlist()->getProductListing(),
  166.         ]);
  167.     }
  168. }