src/Controller/Shop/ProductController.php line 31

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Shop;
  4. use App\Entity\Parameter\Parameter;
  5. use App\Entity\Product\Product;
  6. use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
  7. use Sylius\Component\Resource\ResourceActions;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. class ProductController extends ResourceController
  11. {
  12.     public function showAction(Request $request): Response
  13.     {
  14.         $configuration $this->requestConfigurationFactory->create($this->metadata$request);
  15.         $this->isGrantedOr403($configurationResourceActions::SHOW);
  16.         $resource $this->findOr404($configuration);
  17.         $this->addProductToHistoryAction($request$resource);
  18.         $this->eventDispatcher->dispatch(ResourceActions::SHOW$configuration$resource);
  19.         if ($configuration->isHtmlRequest()) {
  20.             return $this->render($configuration->getTemplate(ResourceActions::SHOW '.html'), [
  21.                 'configuration' => $configuration,
  22.                 'metadata' => $this->metadata,
  23.                 'resource' => $resource,
  24.                 $this->metadata->getName() => $resource,
  25.             ]);
  26.         }
  27.         return $this->createRestView($configuration$resource);
  28.     }
  29.     public function addProductToHistoryAction(Request $request$product): void
  30.     {
  31.         $customer $this->container->get('sylius.context.customer')->getCustomer();
  32.         if (null === $product) {
  33.             return;
  34.         }
  35.         $productsVisited $request->getSession()->get('productsVisited');
  36.         if (null !== $customer) {
  37.             if ($customer->getProductsVisited() === null && count($productsVisited) > 0) {
  38.                 $customer->setProductsVisited($productsVisited);
  39.             }
  40.             $productsVisited $this->updateProductsVisited($customer->getProductsVisited(), $product->getId());
  41.             $customer->setProductsVisited($productsVisited);
  42.             $this->manager->persist($customer);
  43.             $this->manager->flush();
  44.         } else {
  45.             //mettre simplement le produit en session
  46.             if (!$productsVisited || count($productsVisited) < 1) {
  47.                 $productsVisited = [];
  48.             }
  49.             $productsVisited $this->updateProductsVisited($productsVisited$product->getId());
  50.         }
  51.         //mettre le tableau en session
  52.         $request->getSession()->set('productsVisited'$productsVisited);
  53.     }
  54.     public function getCustomerProductsVisitedAction(Request $request)
  55.     {
  56.         // récupérer les produits visités, et les trier dans l'ordre où ils ont été consultés
  57.         $productsIdVisited $request->getSession()->get('productsVisited');
  58.         $productsVisitedSorted = [];
  59.         // récupérer le nombre de produits à mettre dans le tableau
  60.         $nbProduct $this->manager->getRepository(Parameter::class)->findByCodeAndChannelCode('nb_product_visited'$_SERVER['SYLIUS_CHANNEL']);
  61.         if (!$nbProduct) {
  62.             $nbProduct 8;
  63.         }
  64.         if ($productsIdVisited && count($productsIdVisited) > 0) {
  65.             $productsVisited $this->manager->getRepository(Product::class)->findProductsVisited($productsIdVisited, (int) $nbProduct);
  66.             foreach ($productsIdVisited as $productid) {
  67.                 foreach ($productsVisited as $product) {
  68.                     if ($product->getId() === (int) $productid) {
  69.                         $productsVisitedSorted[] = $product;
  70.                     }
  71.                 }
  72.             }
  73.         }
  74.         if (count($productsVisitedSorted) > 0) {
  75.             return $this->render('@SyliusShop/Product/_horizontalList.html.twig', ['products' => $productsVisitedSorted'header' => 'app.product.products_visited''trans' => true]);
  76.         }
  77.     }
  78.     private function updateProductsVisited(?array $productsVisitedint $productId)
  79.     {
  80.         if (null === $productsVisited) {
  81.             $productsVisited = [];
  82.         }
  83.         //supprimer d'abord l'id du tableau correspondant s'il existe, pour le mettre ensuite en dernière position
  84.         if (in_array($productId$productsVisited)) {
  85.             $index array_search($productId$productsVisited);
  86.             unset($productsVisited[$index]);
  87.         }
  88.         // on garde que les 15 derniers produits consultés
  89.         if (count($productsVisited) > 15) {
  90.             array_shift($productsVisited);
  91.         }
  92.         $productsVisited[] = $productId;
  93.         return $productsVisited;
  94.     }
  95. }