src/Ecommerce/Controller/CategoryController.php line 369

Open in your IDE?
  1. <?php
  2. namespace App\Ecommerce\Controller;
  3. use App\Form\Type\WatchesFilterType;
  4. use App\Model\SearchHistory;
  5. use App\Service\WishListService;
  6. use App\Website\LinkGenerator\CategoryLinkGenerator;
  7. use App\Website\Tool\Text;
  8. use Carbon\Carbon;
  9. use CoreShop\Bundle\FrontendBundle\Controller\CategoryController as BaseCategoryController;
  10. use CoreShop\Component\Core\Model\CategoryInterface;
  11. use CoreShop\Component\Index\Condition\LikeCondition;
  12. use CoreShop\Component\Index\Factory\FilteredListingFactoryInterface;
  13. use CoreShop\Component\Index\Filter\FilterProcessorInterface;
  14. use CoreShop\Component\Index\Listing\ListingInterface;
  15. use CoreShop\Component\Index\Model\FilterInterface;
  16. use CoreShop\Component\Index\Order\SimpleOrder;
  17. use CoreShop\Component\SEO\SEOPresentationInterface;
  18. use CoreShop\Component\Tracking\Tracker\TrackerInterface;
  19. use Doctrine\Common\Collections\Criteria;
  20. use Exception;
  21. use Pimcore\Model\DataObject\CoreShopCategory;
  22. use Pimcore\Model\DataObject\CoreShopProduct;
  23. use Pimcore\Model\Site;
  24. use Pimcore\Twig\Extension\Templating\Placeholder;
  25. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  26. use Symfony\Component\HttpFoundation\JsonResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. class CategoryController extends BaseCategoryController
  31. {
  32.     private const FILTER_ID 'watchesfilter';
  33.     protected CoreShopCategory $defaultCategory;
  34.     protected array $allowedFilters = [];
  35.     protected array $filterintervals = [];
  36.     public function __construct(
  37.         array  $validSortProperties,
  38.         string $defaultSortName,
  39.         string $defaultSortDirection,
  40.         private readonly ParameterBagInterface $parameterBag,
  41.     )
  42.     {
  43.         parent::__construct($validSortProperties$defaultSortName$defaultSortDirection);
  44.         if (Site::isSiteRequest()) {
  45.             throw $this->createNotFoundException('Page not found!');
  46.         }
  47.         $this->defaultCategory CoreShopCategory::getByWorkingName('SEIKO'1);
  48.     }
  49.     /**
  50.      * @param Request $request
  51.      * @param Placeholder $placeholder
  52.      * @param CategoryLinkGenerator $generator
  53.      * @return Response
  54.      * @Route("/e-boutique", name="e_boutique", methods={"GET"})
  55.      */
  56.     public function eboutiqueAction(Request $requestPlaceholder $placeholderCategoryLinkGenerator $generator): Response
  57.     {
  58.         return $this->redirect($generator->generate($this->defaultCategory));
  59.     }
  60.     /**
  61.      * @param Request $request
  62.      * @param Placeholder $placeholder
  63.      * @param CategoryLinkGenerator $generator
  64.      * @return Response
  65.      * @Route("{path}~c{category}", name="category-list-redirect", defaults={"path"=""}, requirements={"path"=".*?", "category"="\d+"})
  66.      */
  67.     public function listRedirectAction(Request $requestPlaceholder $placeholderCategoryLinkGenerator $generator): Response
  68.     {
  69.         //https://seikoboutique.hu/e-boutique/seiko/prospex/alpinist~c375272 old url, id changed
  70.         //https://seikoboutique.hu/e-boutique/seiko/prospex/zend/alpinist~c546013 old url, id changed
  71.         $category CoreShopCategory::getById($request->get('category'));
  72.         if ($category instanceof CoreShopCategory) {
  73.             return $this->redirect($generator->generate($category));
  74.         }
  75.         throw $this->createNotFoundException('Page not found!');
  76.     }
  77.     /**
  78.      * @param Request $request
  79.      * @param Placeholder $placeholder
  80.      * @param CategoryLinkGenerator $generator
  81.      * @param WishListService $wishListService
  82.      * @return Response
  83.      * @Route("{path}-c{category}", name="category-list", defaults={"path"=""}, requirements={"path"=".*?", "category"="\d+"})
  84.      */
  85.     public function listAction(Request $requestPlaceholder $placeholderCategoryLinkGenerator $generatorWishListService $wishListService): Response
  86.     {
  87.         $category CoreShopCategory::getById($request->get('category'));
  88.         if (!$category instanceof CoreShopCategory ||
  89.             !$category->getFilter() instanceof FilterInterface ||
  90.             !(new CoreShopProduct\Listing())->filterByCategories($category)->count()
  91.         ) {
  92.             return $this->redirect($generator->generate($this->defaultCategory));
  93.         }
  94.         $session $request->getSession();
  95.         $defaultPerPage $this->getConfigurationService()->getForStore('system.category.list.per_page.default');
  96.         if (!$session->has('perPage')) {
  97.             $session->set('perPage'$defaultPerPage);
  98.         }
  99.         if (!$session->has('sort')) {
  100.             $session->set('sort'$this->defaultSortName '_' $this->defaultSortDirection);
  101.         }
  102.         $perPage $this->getParameterFromRequest($request'perPage');
  103.         if ($perPage) {
  104.             $session->set('perPage'$perPage);
  105.             $request->attributes->set('page'1);
  106.         }
  107.         $sort $this->getParameterFromRequest($request'sort');
  108.         if ($sort) {
  109.             $session->set('sort'$sort);
  110.             $request->attributes->set('page'1);
  111.         }
  112.         $request->attributes->set('perPage'$session->get('perPage'));
  113.         $request->attributes->set('sort'$session->get('sort'));
  114.         // no comment...
  115.         if ($request->getLocale() == 'hu') {
  116.             $request->setLocale('hu_HU');
  117.         }
  118.         $placeholder('breadcrumbCategory')->set($category);
  119.         return $this->detail($request$category$wishListService$generator);
  120.     }
  121.     /**
  122.      * @param Request $request
  123.      * @param CategoryLinkGenerator $generator
  124.      * @return Response
  125.      * @Route("/{path}~c{category}/share-search-result", name="shareSearchResultRedirect", methods={"GET"}, requirements={"path"=".*?", "category"="\d+"})
  126.      */
  127.     public function shareSearchResultRedirect(Request $requestCategoryLinkGenerator $generator): Response
  128.     {
  129.         $category CoreShopCategory::getById($request->get('category'));
  130.         if ($category instanceof CoreShopCategory) {
  131.             return $this->redirect($generator->generate($this->defaultCategory) . '/share-search-result'301);
  132.         }
  133.         throw $this->createNotFoundException('Page not found!');
  134.     }
  135.     /**
  136.      * @param Request $request
  137.      * @return Response
  138.      * @Route("/{path}-c{category}/share-search-result", name="shareSearchResult", methods={"GET"}, requirements={"path"=".*?", "category"="\d+"})
  139.      */
  140.     public function shareSearchResult(Request $request): Response
  141.     {
  142.         $filter $request->getSession()->get("watchesfilter");
  143.         $currentSearch = new searchHistory();
  144.         if (isset($filter["category"])) {
  145.             $currentSearch->setCategory($filter["category"]);
  146.         } else {
  147.             return new Response();
  148.         }
  149.         if (isset($filter["filterData"])) {
  150.             $currentSearch->setFilterFromArray($filter["filterData"]);
  151.         } else {
  152.             return new Response();
  153.         }
  154.         $searchHistory searchHistory::findCategoryFilter($currentSearch->getCategory(), $currentSearch->getFilter());
  155.         if ($searchHistory and $searchHistory->getId()) {
  156.             $res sprintf("?filter=%s", (string)$searchHistory->getId());
  157.         } else {
  158.             $currentSearch->generateUuid();
  159.             $currentSearch->save();
  160.             $res sprintf("?filter=%s", (string)$currentSearch->getId());
  161.         }
  162.         return new Response($res);
  163.     }
  164.     public function detail(Request $requestCategoryInterface $category nullWishListService $wishListService nullCategoryLinkGenerator $generator null): Response
  165.     {
  166.         $this->denyAccessUnlessGranted('CORESHOP_CATEGORY_SHOW');
  167.         $listModeDefault $this->getConfigurationService()->getForStore('system.category.list.mode');
  168.         $gridPerPageAllowed $this->getConfigurationService()->getForStore('system.category.grid.per_page');
  169.         $gridPerPageDefault $this->getConfigurationService()->getForStore('system.category.grid.per_page.default');
  170.         $listPerPageAllowed $this->getConfigurationService()->getForStore('system.category.list.per_page');
  171.         $listPerPageDefault $this->getConfigurationService()->getForStore('system.category.list.per_page.default');
  172.         $displaySubCategories $this->getConfigurationService()->getForStore('system.category.list.include_subcategories');
  173.         $variantMode $this->getConfigurationService()->getForStore('system.category.variant_mode');
  174.         $page = (int)$this->getParameterFromRequest($request'page'1) ?: 1;
  175.         $type $this->getParameterFromRequest($request'type'$listModeDefault);
  176.         $defaultPerPage $type === 'list' $listPerPageDefault $gridPerPageDefault;
  177.         $allowedPerPage $type === 'list' $listPerPageAllowed $gridPerPageAllowed;
  178.         $perPage = (int)$this->getParameterFromRequest($request'perPage'$defaultPerPage) ?: 15;
  179.         $this->validateCategory($request$category);
  180.         $viewParameters = [];
  181.         $filterData = [];
  182.         $session $request->getSession();
  183.         if ($request->isMethod(Request::METHOD_POST) && $filter $request->get(self::FILTER_ID)) {
  184.             unset($filter['_token']);
  185.             $listing = new CoreShopProduct\Listing();
  186.             $listing->setLimit(1);
  187.             $listing->setOrderKey('wholesalePrice');
  188.             $listing->filterByCategories($category);
  189.             $min $listing->setOrder(Criteria::ASC)->current()->getWholesalePrice() / 100;
  190.             $max $listing->setOrder(Criteria::DESC)->current()->getWholesalePrice() / 100;
  191.             if (empty($filter['search'])) {
  192.                 unset($filter['search']);
  193.             } else {
  194.                 $filter['search'] = trim(strip_tags($filter['search']));
  195.             }
  196.             $minValue $min;
  197.             if (!empty($filter['price']['min'])) {
  198.                 $minValue = (int)$filter['price']['min'];
  199.                 if ($minValue $min || $minValue $max) {
  200.                     unset($filter['price']['min']);
  201.                 } else {
  202.                     $filter['price']['min'] = $minValue;
  203.                 }
  204.             } else {
  205.                 unset($filter['price']['min']);
  206.             }
  207.             if (!empty($filter['price']['max'])) {
  208.                 $maxValue = (int)$filter['price']['max'];
  209.                 if ($maxValue $min || $maxValue $max) {
  210.                     unset($filter['price']['max']);
  211.                 } elseif ($maxValue $minValue) {
  212.                     $filter['price']['max'] = $minValue;
  213.                 } else {
  214.                     $filter['price']['max'] = $maxValue;
  215.                 }
  216.             } else {
  217.                 unset($filter['price']['max']);
  218.             }
  219.             if (!empty($filter['price']['outlet']) && filter_var($filter['price']['outlet'], FILTER_VALIDATE_BOOLEAN)) {
  220.                 $filter['price']['outlet'] = true;
  221.             } else {
  222.                 unset($filter['price']['outlet']);
  223.             }
  224.             if ($session->has(self::FILTER_ID) && !$filter) {
  225.                 $session->remove(self::FILTER_ID);
  226.             }
  227.             if ($filter) {
  228.                 $session->set(self::FILTER_ID, ['category' => $category->getId(), 'filterData' => $filter]);
  229.             }
  230.             return $this->redirect($generator->generate($category));
  231.         }
  232.         if ($request->get('filter')) {
  233.             try {
  234.                 $filter $request->get('filter');
  235.                 if (filter_var($filterFILTER_VALIDATE_INT) !== false) {
  236.                     $searchHistory searchHistory::getById($filter);
  237.                     if ($searchHistory and $searchHistory->getId()) {
  238.                         $session->set(self::FILTER_ID, ['category' => $searchHistory->getCategory(), 'filterData' => $searchHistory->getFilter()]);
  239.                         return $this->redirect($generator->generate($category));
  240.                     }
  241.                 }
  242.                 $searchHistory searchHistory::getByUuId($filter);
  243.                 if ($searchHistory and $searchHistory->getId()) {
  244.                     $session->set(self::FILTER_ID, ['category' => $searchHistory->getCategory(), 'filterData' => $searchHistory->getFilter()]);
  245.                     return $this->redirect($generator->generate($category));
  246.                 }
  247.             } catch (Exception $e) {
  248.             }
  249.         }
  250.         if ($session->has(self::FILTER_ID)) {
  251.             $sessionFilter $session->get(self::FILTER_ID);
  252.             if (!empty($sessionFilter['category']) &&
  253.                 !empty($sessionFilter['filterData']) &&
  254.                 $sessionFilter['category'] === $category->getId() &&
  255.                 count($sessionFilter['filterData'])
  256.             ) {
  257.                 $filterData $sessionFilter['filterData'];
  258.             } else {
  259.                 $session->remove(self::FILTER_ID);
  260.             }
  261.         }
  262.         if ($request->get('reset-filter')) {
  263.             $session->remove(self::FILTER_ID);
  264.             $filterData = [];
  265.             if (!$request->isXmlHttpRequest()) {
  266.                 return $this->redirect($generator->generate($category));
  267.             }
  268.         }
  269.         $form $this->container->get('form.factory')->createNamed(self::FILTER_IDWatchesFilterType::class, $filterData, [
  270.             'category' => $category
  271.         ]);
  272.         $filteredList $this->get(FilteredListingFactoryInterface::class)->createList($category->getFilter(), $request->request);
  273.         $filteredList->setLocale($request->getLocale());
  274.         $filteredList->setVariantMode($variantMode ?: ListingInterface::VARIANT_MODE_HIDE);
  275.         $filteredList->addCondition(new LikeCondition('stores''both'sprintf('%1$s%2$s%1$s'','$this->getContext()->getStore()->getId())), 'stores');
  276.         $filteredList->addCondition(new LikeCondition('parentCategoryIds''both', (string)$category->getId()), 'parentCategoryIds');
  277.         $filteredList->addSeikoFilterConditions($filterData$this->allowedFilters$this->filterintervals);
  278.         $defaultSortKey $this->defaultSortName '_' $this->defaultSortDirection;
  279.         $sort $this->getParameterFromRequest($request'sort'$defaultSortKey);
  280.         $sortParsed $this->parseSorting($sort);
  281.         if ($sortParsed['name'] == 'creationDate') {
  282.             $filteredList->addOrder(new SimpleOrder('newsfromdate'$sortParsed['direction']));
  283.             $filteredList->addOrder(new SimpleOrder('name'$sortParsed['direction']));
  284.             $filteredList->addOrder(new SimpleOrder('creationDate'$sortParsed['direction']));
  285.         } elseif ($sortParsed['name'] == 'collection') {
  286.             $filteredList->addOrder(new SimpleOrder('collection'$sortParsed['direction']));
  287.             $filteredList->addOrder(new SimpleOrder('name'$sortParsed['direction']));
  288.             $filteredList->addOrder(new SimpleOrder('creationDate'$sortParsed['direction']));
  289.         } else {
  290.             $filteredList->addOrder(new SimpleOrder($sortParsed['name'], $sortParsed['direction']));
  291.             $filteredList->addOrder(new SimpleOrder('name'$sortParsed['direction']));
  292.         }
  293.         $currentFilter $this->get(FilterProcessorInterface::class)->processConditions($category->getFilter(), $filteredList$request->query);
  294.         $preparedConditions $this->get(FilterProcessorInterface::class)->prepareConditionsForRendering($category->getFilter(), $filteredList$currentFilter);
  295.         $paginator $this->getPaginator()->paginate($filteredList$page$perPage);
  296.         $viewParameters['list'] = $filteredList;
  297.         $viewParameters['filter'] = $category->getFilter();
  298.         $viewParameters['currentFilter'] = $currentFilter;
  299.         $viewParameters['paginator'] = $paginator;
  300.         $viewParameters['conditions'] = $preparedConditions;
  301.         $viewParameters['category'] = $category;
  302.         $viewParameters['page'] = $page;
  303.         $viewParameters['perPage'] = $perPage;
  304.         $viewParameters['type'] = $type;
  305.         $viewParameters['perPageAllowed'] = $allowedPerPage;
  306.         $viewParameters['sort'] = $sort;
  307.         $viewParameters['sortDirection'] = $sortParsed['direction'];
  308.         $viewParameters['validSortElements'] = $this->validSortProperties;
  309.         $viewParameters['filterForm'] = $form->createView();
  310.         $viewParameters['filterData'] = $filterData;
  311.         $viewParameters['resetFilter'] = uniqid(Carbon::now()->getTimestamp());
  312.         $viewParameters['filterlink'] = true;
  313.         if ($filterData) {
  314.             $viewParameters['filterlink'] = true;
  315.             $session->set('filterLinkData'true);
  316.         }
  317.         $productList = new CoreShopProduct\Listing();
  318.         $productList->setGroupBy('brand');
  319.         $products $productList->load();
  320.         $viewParameters['categoriesTab'] = [];
  321.         foreach ($products as $product) {
  322.             $categ CoreShopCategory::getByWorkingName($product->getBrand(), 1);
  323.             if ($categ instanceof CoreShopCategory) {
  324.                 $name $categ->getWorkingName();
  325.                 if (in_array(mb_strtoupper($name), array_map(function($e) { return mb_strtoupper($e); }, $this->parameterBag->get('app.categories.tab')))) {
  326.                     $viewParameters['categoriesTab'][$name] = [
  327.                         'path' => $generator->generate($categ),
  328.                         'name' => Text::toCamelCase($categ->getWorkingName())
  329.                     ];
  330.                 }
  331.             }
  332.         }
  333.         $wishlist = [];
  334.         $this->get(TrackerInterface::class)->trackProductImpression([
  335.             'itemlist' => $paginator->getItems(),
  336.             'item_list_name' => $category->getName(),
  337.             'item_list_id' => $category->getId()
  338.         ]);
  339.         $request->getSession()->set('ga4_select_item', [
  340.             'item_list_name' => $category->getName(),
  341.             'item_list_id' => $category->getId()
  342.         ]);
  343.         foreach ($paginator as $product) {
  344.             $wishlist[$product->getId()] = $wishListService->hasItem($product);
  345.         }
  346.         $viewParameters['wishlist'] = $wishlist;
  347.         $this->get(SEOPresentationInterface::class)->updateSeoMetadata($category);
  348.         if ($request->isXmlHttpRequest()) {
  349.             return new JsonResponse([
  350.                 'success' => true,
  351.                 'filterLink' => $viewParameters['filterlink'],
  352.                 'filters' => $this->renderView($this->templateConfigurator->findTemplate('Category/_filter.html'), $viewParameters),
  353.                 'products' => $this->renderView($this->templateConfigurator->findTemplate('Category/_productlist.html'), $viewParameters)
  354.             ]);
  355.         }
  356.         return $this->render($this->templateConfigurator->findTemplate('Category/index.html'), $viewParameters);
  357.     }
  358.     public function setAllowedFilters(array $filters): void
  359.     {
  360.         $this->allowedFilters $filters;
  361.     }
  362.     public function setFilterIntervals(array $filterintervals): void
  363.     {
  364.         $this->filterintervals $filterintervals;
  365.     }
  366. }