src/Controller/DefaultController.php line 197

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Brand;
  4. use App\Entity\Image;
  5. use App\Entity\Product;
  6. use App\Form\AddProductToCartType;
  7. use App\Form\SearchFormType;
  8. use App\Repository\ModelRepository;
  9. use App\Service\Cart\CartService;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Knp\Component\Pager\PaginatorInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. class DefaultController extends AbstractController
  18. {
  19.     #[Route('/'name'home')]
  20.     public function index(EntityManagerInterface $managerRequest $request): Response
  21.     {
  22.         $brands $manager->getRepository(Brand::class)->findAllBrandLogos();
  23.         $recently_added_products $manager->getRepository(Product::class)->findRecentlyAddedProducts();
  24.         //formulaire de recherche multicritère
  25.         $search_form $this->createForm(SearchFormType::class);
  26.         $search_form->handleRequest($request);
  27.         if ($search_form->isSubmitted() && $search_form->isValid()) {
  28.             $formData $search_form->getData();
  29.             $brandId $formData['brand'];
  30.             $modelId $formData['product_model'];
  31.             $keyword $formData['search'];
  32.             if($modelId == null) {
  33.                 $modelId 0;
  34.             }
  35.             if($keyword == null) {
  36.                 $keyword "";
  37.             }
  38.             $request->getSession()->set('search_parameters', [
  39.                 'brandId' => $brandId,
  40.                 'modelId' => $modelId,
  41.                 'keyword' => $keyword,
  42.             ]);
  43.             // Redirection vers la page des résultats de recherche
  44.             return $this->redirectToRoute('search_results');
  45.         }
  46.         return $this->render('default/index.html.twig', [
  47.             'controller_name' => 'DefaultController',
  48.             'brands' => $brands,
  49.             'recently_added_products' => $recently_added_products,
  50.             'form' => $search_form->createView(),
  51.         ]);
  52.     }
  53.     #[Route('/product_details/{id}'name'product_details'requirements: ["id"=>"\d+"])]
  54.     public function productDetails($idEntityManagerInterface $managerRequest $requestCartService $cartService): Response
  55.     {
  56.         $selected_product $manager->getRepository(Product::class)->findProductById($id);
  57.         $images $manager->getRepository(Image::class)->findProductImages($id);
  58.         $item = new Product();
  59.         $form $this->createForm(AddProductToCartType::class, $item, [
  60.             'selected_product' => $selected_product
  61.         ]);
  62.         $form->handleRequest($request);
  63.         //Ajout d'un produit au panier
  64.         if($form->isSubmitted() && $form->isValid()) {
  65.             $data $form->getData();
  66.             $productQuantity $data->getProductQuantity();
  67.             $res $cartService->add($id$productQuantity);
  68.             if($res === false) {
  69.                 return new JsonResponse(['success' => false]);
  70.             } else {
  71.                 return new JsonResponse(['success' => true]);
  72.             }
  73.         }
  74.         return $this->render('default/product_details.html.twig', [
  75.             'controller_name' => 'DefaultController',
  76.             'selected_product' => $selected_product,
  77.             'images' => $images,
  78.             'form' => $form->createView()
  79.         ]);
  80.     }
  81.     #[Route('/search_results'name'search_results')]
  82.     public function searchResults(Request $requestPaginatorInterface $paginatorEntityManagerInterface $manager): Response
  83.     {
  84.         //$tags = $manager->getRepository(Tag::class)->findAll();
  85.         //formulaire de recherche multicritère
  86.         $search_form $this->createForm(SearchFormType::class);
  87.         $search_form->handleRequest($request);
  88.         if ($search_form->isSubmitted() && $search_form->isValid()) {
  89.             $formData $search_form->getData();
  90.             $brandId $formData['brand'];
  91.             $modelId $formData['product_model'];
  92.             $keyword $formData['search'];
  93.             if($modelId == null) {
  94.                 $modelId 0;
  95.             }
  96.             if($keyword == null) {
  97.                 $keyword "";
  98.             }
  99.             $request->getSession()->set('search_parameters', [
  100.                 'brandId' => $brandId,
  101.                 'modelId' => $modelId,
  102.                 'keyword' => $keyword,
  103.             ]);
  104.         }
  105.         // Retrieve the search parameters from the session
  106.         $searchParameters $request->getSession()->get('search_parameters');
  107.         $brandId $searchParameters['brandId'];
  108.         $modelId $searchParameters['modelId'];
  109.         $keyword $searchParameters['keyword'];
  110.         // Retrieve the selected filter from the query parameter
  111.         $filter $request->query->get('filter');
  112.         $queryBuilder $manager->getRepository(Product::class)->search($brandId$modelId$keyword);
  113.         // Retrieve the selected tags from the query parameter
  114. /*        $tagIds = $request->query->get('tags');
  115.         $selectedTags = explode(',', $tagIds);
  116.         $selectedTags = array_map('intval', $selectedTags);
  117.         // Apply the tag filter
  118.         if (count($selectedTags) > 0 && $selectedTags[0] !== 0) {
  119.             $request->getSession()->set('selected_tags', $selectedTags);
  120.             $queryBuilder->innerJoin('p.product_tags', 't');
  121.             $queryBuilder->andWhere('t.id IN (:tagIds)');
  122.             $queryBuilder->setParameter('tagIds', $selectedTags);
  123.         }*/
  124.         if ($filter) {
  125.             switch ($filter) {
  126.                 case 'newest':
  127.                     // Sort by newest products
  128.                     $queryBuilder->orderBy('p.product_added_date''DESC');
  129.                     break;
  130.                 case 'oldest':
  131.                     // Sort by oldest products
  132.                     $queryBuilder->orderBy('p.product_added_date''ASC');
  133.                     break;
  134.                 case 'asc_price':
  135.                     // Sort by cheapest products
  136.                     $queryBuilder->orderBy('p.product_price''ASC');
  137.                     break;
  138.                 case 'desc_price':
  139.                     // Sort by most expensive products
  140.                     $queryBuilder->orderBy('p.product_price''DESC');
  141.                     break;
  142.             }
  143.         }
  144.         $query $queryBuilder->getQuery();
  145.         $pagination $paginator->paginate(
  146.             $query,
  147.             $request->query->getInt('page'1), // Current page number
  148.             12 // Number of items per page
  149.         );
  150.         return $this->render('default/search_results.html.twig', [
  151.             'controller_name' => 'DefaultController',
  152.             'results' => $pagination,
  153.             'keyword'=> $keyword,
  154.             'form' => $search_form->createView(),
  155.         ]);
  156.     }
  157.     #[Route('/brand/{id}'name'brand'requirements: ["id"=>"\d+"])]
  158.     public function searchResultsByBrand(int $idRequest $request){
  159.         $request->getSession()->set('search_parameters', [
  160.             'brandId' => $id,
  161.             'modelId' => 0,
  162.             'keyword' => "",
  163.         ]);
  164.         // Redirection vers la page des résultats de recherche
  165.         return $this->redirectToRoute('search_results');
  166.     }
  167.     #[Route('/keyword'name'keyword')]
  168.     public function searchResultsByKeyword(Request $request){
  169.         $keyword $request->request->get('keyword');
  170.         $request->getSession()->set('search_parameters', [
  171.             'brandId' => 0,
  172.             'modelId' => 0,
  173.             'keyword' => $keyword,
  174.         ]);
  175.         // Redirection vers la page des résultats de recherche
  176.         return $this->redirectToRoute('search_results');
  177.     }
  178.     #[Route('/fetch_models'name'fetch_models')]
  179.     public function fetchModels(Request $requestModelRepository $modelRepository): JsonResponse
  180.     {
  181.         $brandId $request->request->get('brandId');
  182.         $models $modelRepository->findByBrand($brandId);
  183.         $modelChoices = [];
  184.         foreach($models as $model){
  185.             $modelChoices[$model->getModelName()] = $model->getId();
  186.         }
  187.         return new JsonResponse($modelChoices);
  188.     }
  189.     #[Route('/legal_terms'name'legal_terms')]
  190.     public function legalTerms(): Response
  191.     {
  192.         return $this->render('default/legal_terms.html.twig', [
  193.             'controller_name' => 'DefaultController',
  194.         ]);
  195.     }
  196. }