<?php
declare(strict_types=1);
namespace App\Controller\Shop;
use App\Entity\Parameter\Parameter;
use App\Entity\Product\Product;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class ProductController extends ResourceController
{
public function showAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::SHOW);
$resource = $this->findOr404($configuration);
$this->addProductToHistoryAction($request, $resource);
$this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource);
if ($configuration->isHtmlRequest()) {
return $this->render($configuration->getTemplate(ResourceActions::SHOW . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $resource,
$this->metadata->getName() => $resource,
]);
}
return $this->createRestView($configuration, $resource);
}
public function addProductToHistoryAction(Request $request, $product): void
{
$customer = $this->container->get('sylius.context.customer')->getCustomer();
if (null === $product) {
return;
}
$productsVisited = $request->getSession()->get('productsVisited');
if (null !== $customer) {
if ($customer->getProductsVisited() === null && count($productsVisited) > 0) {
$customer->setProductsVisited($productsVisited);
}
$productsVisited = $this->updateProductsVisited($customer->getProductsVisited(), $product->getId());
$customer->setProductsVisited($productsVisited);
$this->manager->persist($customer);
$this->manager->flush();
} else {
//mettre simplement le produit en session
if (!$productsVisited || count($productsVisited) < 1) {
$productsVisited = [];
}
$productsVisited = $this->updateProductsVisited($productsVisited, $product->getId());
}
//mettre le tableau en session
$request->getSession()->set('productsVisited', $productsVisited);
}
public function getCustomerProductsVisitedAction(Request $request)
{
// récupérer les produits visités, et les trier dans l'ordre où ils ont été consultés
$productsIdVisited = $request->getSession()->get('productsVisited');
$productsVisitedSorted = [];
// récupérer le nombre de produits à mettre dans le tableau
$nbProduct = $this->manager->getRepository(Parameter::class)->findByCodeAndChannelCode('nb_product_visited', $_SERVER['SYLIUS_CHANNEL']);
if (!$nbProduct) {
$nbProduct = 8;
}
if ($productsIdVisited && count($productsIdVisited) > 0) {
$productsVisited = $this->manager->getRepository(Product::class)->findProductsVisited($productsIdVisited, (int) $nbProduct);
foreach ($productsIdVisited as $productid) {
foreach ($productsVisited as $product) {
if ($product->getId() === (int) $productid) {
$productsVisitedSorted[] = $product;
}
}
}
}
if (count($productsVisitedSorted) > 0) {
return $this->render('@SyliusShop/Product/_horizontalList.html.twig', ['products' => $productsVisitedSorted, 'header' => 'app.product.products_visited', 'trans' => true]);
}
}
private function updateProductsVisited(?array $productsVisited, int $productId)
{
if (null === $productsVisited) {
$productsVisited = [];
}
//supprimer d'abord l'id du tableau correspondant s'il existe, pour le mettre ensuite en dernière position
if (in_array($productId, $productsVisited)) {
$index = array_search($productId, $productsVisited);
unset($productsVisited[$index]);
}
// on garde que les 15 derniers produits consultés
if (count($productsVisited) > 15) {
array_shift($productsVisited);
}
$productsVisited[] = $productId;
return $productsVisited;
}
}