src/Controller/Front/FrontShoppingController.php line 242

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Controller\Front;
  3. use Acme\SudcmsBundle\Entity\EcoCustomersFavoritesProd;
  4. use Acme\SudcmsBundle\Entity\Pages;
  5. use Acme\SudcmsBundle\Entity\PagesBlocs;
  6. use Acme\SudcmsBundle\Entity\Site;
  7. use Acme\SudcmsBundle\Repository\EcoCategoriesRepository;
  8. use Acme\SudcmsBundle\Repository\EcoCustomersFavoritesProdRepository;
  9. use Acme\SudcmsBundle\Repository\EcoLabelsRepository;
  10. use Acme\SudcmsBundle\Repository\EcoMarksRepository;
  11. use Acme\SudcmsBundle\Repository\EcoProductsLabelsRepository;
  12. use Acme\SudcmsBundle\Repository\EcoProductsReferencesRepository;
  13. use Acme\SudcmsBundle\Repository\EcoProductsRepository;
  14. use Acme\SudcmsBundle\Repository\PagesRepository;
  15. use Acme\SudcmsBundle\Service\OtideaUtils;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Knp\Component\Pager\PaginatorInterface;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpFoundation\Session\Session;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Security\Core\Security;
  25. #[Route(path'/boutique')]
  26. class FrontShoppingController extends AbstractController
  27. {
  28.     private $session;
  29.     private $entityManager;
  30.     private $security;
  31.     private $currentUserConnected;
  32.     private $isThereSlider = array();
  33.     private $isThereGalerie = array();
  34.     private $projectDirectory;
  35.     public function __construct(EntityManagerInterface $entityManagerSecurity $securityOtideaUtils $otideaUtils)
  36.     {
  37.         $this->session = new Session();
  38.         $this->entityManager $entityManager;
  39.         $this->currentUserConnected $otideaUtils->getUserConnected();
  40.         $this->security $security;
  41.         $this->projectDirectory $this->entityManager->getRepository(Site::class)->findOneBy(['id' => CURRENT_SITE_ID])->getProjectDirectory();
  42.         if (!IS_ECOMMERCE) {
  43.             header('Location: ' WEBSITEROOT);
  44.             exit;
  45.         }
  46.     }
  47.     #[Route(path'/produit/{product_name}/{prod_id}'name'front_shopping_fiche'defaults: ['product_name' => null,
  48.         'prod_id' => 0])]
  49.     public function fiche(Request                             $requestEcoProductsRepository $repoProd,
  50.                           EcoProductsReferencesRepository     $repoRefEcoProductsLabelsRepository $repoProdLabels,
  51.                           EcoLabelsRepository                 $repoLabels,
  52.                           EcoCustomersFavoritesProdRepository $favProdRepositoryOtideaUtils $otideaUtils,
  53.                                                               $product_name NULL$prod_id 0): Response
  54.     {
  55.         $product $repoProd->find($prod_id);
  56.         //Récupération des labels du produit
  57.         $labels $repoProdLabels->findBy(['product_id' => $prod_id]);
  58.         $productLabels = [];
  59.         foreach ($labels as $label) {
  60.             $productLabels[] = $repoLabels->findOneBy(['id' => $label->getLabelId()]);
  61.         }
  62.         //Récupération des produits favoris
  63.         if ($this->currentUserConnected != null) {
  64.             $favsProds $favProdRepository->findBy(['customerId' => $this->currentUserConnected->getId()]);
  65.         } else {
  66.             $favsProds null;
  67.         }
  68.         if ($product == null) {
  69.             throw $this->createNotFoundException();
  70.         }
  71.         //Désactive l'accès d'un produit hors ligne
  72.         if (!$product->getProdIsonline()) {
  73.             return $this->redirectToRoute('front_home');
  74.             //Produit archivé (redirection 301)
  75.         }
  76.         if ($this->session->has('displayPopup') && $this->session->get('displayPopup') == 'display-basket-confirmation') {
  77.             $otideaUtils->createPopup([
  78.                     "title" => 'Ajout au panier',
  79.                     "message" => 'Cet article a été ajouté à votre panier.',
  80.                     "btn2" => null]
  81.             );
  82.             $this->session->remove('displayPopup');
  83.         }
  84.         //Produits associés
  85.         $combinations $repoProd->findByProductsCombination($prod_id);
  86.         if ($combinations == NULL) {
  87.             $associateProducts $repoProd->findByAssociate();
  88.         } else {
  89.             $associateProducts $repoProd->findByAssociateCombination($prod_id);
  90.         }
  91.         $categ_id $product->getCategoryId();
  92.         //Paramètres communs aux deux templates
  93.         $params = [
  94.             'product' => $repoProd->find($prod_id),
  95.             'blocks' => $this->getProductsBlocks($prod_id),
  96.             'productLabels' => $productLabels,
  97.             'favsProds' => $favsProds,
  98.             'isThereSlider' => $this->isThereSlider,
  99.             'isThereGalerie' => $this->isThereGalerie,
  100.             'associateProducts' => $associateProducts,
  101.             'catEnCours' => (int)$categ_id,
  102.         ];
  103.         /* dump($repoProd->find($prod_id));
  104.          dump($associateProducts);*/
  105.         //Mode fiche une seule référence
  106.         //        if ($product->getProdType() == 'single') {
  107.         //            $params['reference'] = $repoRef->findOneBy(['product_id' => $prod_id]);
  108.         //            return $this->render('front/front_shopping/product-' . $product->getProdType() . '.html.twig', $params);
  109.         //            //Mode référence bundle
  110.         //        } else
  111.         if ($product->getProdType() == 'bundle') {
  112.             $params['reference'] = $repoRef->findOneBy(['product_id' => $prod_id]);
  113.             $params['bundles'] = $repoProd->findByProductsBundle($prod_id);
  114.             return $this->render('@main-app/front/front_shopping/product-' $product->getProdType() . '.html.twig',
  115.                 $params);
  116.             //Mode référence multiple
  117.         } else {
  118.             $params['references'] = $repoRef->findBy(['product_id' => $prod_id],
  119.                 ['ref_sequence' => 'ASC']);
  120.             return $this->render('@main-app/front/front_shopping/product-multiple.html.twig'$params);
  121.         }
  122.     }
  123.     /**
  124.      * Ajout d'un produit en favoris
  125.      * @param Request $request
  126.      */
  127.     #[Route(path'/axAddProductFavorite'options: ['expose' => true])]
  128.     public function axAddProductFavorite(Request $requestEcoCustomersFavoritesProdRepository $favProdRepository)
  129.     {
  130.         $user $this->security->getUser();
  131.         if ($request->isXmlHttpRequest() && $request->get('reference_id') > 0) {
  132.             //$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'), 'customerId' => $user->getUserIdentifier()]);
  133.             $oldFavProd $favProdRepository->findOneBy(['productId' => $request->get('reference_id'),
  134.                 'customerId' => $this->currentUserConnected->getId()]);
  135.             if ($oldFavProd == null) {
  136.                 $favoriteProduct = new EcoCustomersFavoritesProd;
  137.                 $favoriteProduct->setProductId($request->get('reference_id'));
  138.                 //$favoriteProduct->setCustomerId($user->getUserIdentifier());
  139.                 $favoriteProduct->setCustomerId($this->currentUserConnected->getId());
  140.                 $this->entityManager->persist($favoriteProduct);
  141.                 $this->entityManager->flush();
  142.             }
  143.             return new JsonResponse([
  144.                 'status' => true,
  145.             ]);
  146.         }
  147.         return new JsonResponse([
  148.             'status' => false,
  149.         ]);
  150.     }
  151.     /**
  152.      * Suppression d'un produit des favoris
  153.      * @param Request $request
  154.      */
  155.     #[Route(path'/axRemoveProductFavorite'options: ['expose' => true])]
  156.     public function axRemoveProductFavorite(Request $requestEcoCustomersFavoritesProdRepository $favProdRepository)
  157.     {
  158.         $user $this->security->getUser();
  159.         if ($request->isXmlHttpRequest() && $request->get('reference_id') == 'all') {
  160.             //$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'), 'customerId' => $user->getUserIdentifier()]);
  161.             $oldFavsProds $favProdRepository->findBy(['customerId' => $this->currentUserConnected->getId()]);
  162.             if ($oldFavsProds != null) {
  163.                 foreach ($oldFavsProds as $oldFavProd) {
  164.                     $this->entityManager->remove($oldFavProd);
  165.                 }
  166.                 $this->entityManager->flush();
  167.             }
  168.             return new JsonResponse([
  169.                 'status' => true,
  170.             ]);
  171.         } else if ($request->isXmlHttpRequest() && $request->get('reference_id') > 0) {
  172.             //$oldFavProd = $favProdRepository->findOneBy(['productId' => $request->get('reference_id'), 'customerId' => $user->getUserIdentifier()]);
  173.             $oldFavProd $favProdRepository->findOneBy(['productId' => $request->get('reference_id'),
  174.                 'customerId' => $this->currentUserConnected->getId()]);
  175.             if ($oldFavProd != null) {
  176.                 $this->entityManager->remove($oldFavProd);
  177.                 $this->entityManager->flush();
  178.             }
  179.             return new JsonResponse([
  180.                 'status' => true,
  181.             ]);
  182.         }
  183.         return new JsonResponse([
  184.             'status' => false,
  185.         ]);
  186.     }
  187.     #[Route(path'/')]
  188.     #[Route(path'/{categ_name}')]
  189.     #[Route(path'/{categ_name}/{mark}/{categ_id}')]
  190.     #[Route(path'/{categ_name}/{mark}/{categ_id}/{mark_id}'name'front_shopping_categorie'defaults: ['categ_name' => null,
  191.         'mark' => null,
  192.         'categ_id' => 0,
  193.         'mark_id' => null])]
  194.     public function index(Request                             $requestOtideaUtils $otideaUtils,
  195.                           EcoCustomersFavoritesProdRepository $favProdRepositoryEcoProductsRepository $repoProd,
  196.                           EcoCategoriesRepository             $repoCategsEcoMarksRepository $repoMarksPagesRepository $repo,
  197.                           PaginatorInterface                  $paginator$categ_name null$mark null,
  198.                                                               $categ_id 0$mark_id null): Response
  199.     {
  200.         //Récupération des produits favoris
  201.         if ($this->currentUserConnected != null) {
  202.             $favsProds $favProdRepository->findBy(['customerId' => $this->currentUserConnected->getId()]);
  203.         } else {
  204.             $favsProds null;
  205.         }
  206.         //Désactive l'accès d'une catégorie hors ligne
  207.         if ($categ_id 0) {
  208.             $category $repoCategs->find($categ_id);
  209.             if (!$category->getCategIsonline()) {
  210.                 return $this->redirectToRoute('front_home');
  211.             }
  212.         }
  213.         if ($this->session->has('displayPopup') && $this->session->get('displayPopup') == 'display-basket-confirmation') {
  214.             $otideaUtils->createPopup([
  215.                     "title" => 'Ajout au panier',
  216.                     "message" => 'Cet article a été ajouté à votre panier.',
  217.                     "btn2" => null]
  218.             );
  219.             $this->session->remove('displayPopup');
  220.         }
  221.         //        $categ_id = $request->get('category') ? $request->query->getInt('category') : $categ_id;
  222.         //        $mark_id = $request->get('mark') ? $request->query->getInt('mark') : 0;
  223.         $filter $request->get('filter') ? $request->query->getAlpha('filter') : 0;
  224.         if ($categ_name == "nouveaute") {
  225.             $productsResult $repoProd->findNouveaute();
  226.         } else {
  227.             $productsResult $repoProd->findByProductsByCategorie($categ_id$mark_id$filterCURRENT_SITE_ID);
  228.         }
  229.         $products $paginator->paginate(
  230.             $productsResult// Requête contenant les données à paginer (ici nos articles)
  231.             $request->query->getInt('page'1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
  232.             // Nombre de résultats par page
  233.         );
  234.         $currentPage $repo->findOneBy(['purlInterne' => 'boutique''psite' => CURRENT_SITE_ID]);
  235.         return $this->render('@main-app/front/front_shopping/index.html.twig', [
  236.             'products' => $products,
  237.             'favsProds' => $favsProds,
  238.             'catEnCours' => (int)$categ_id,
  239.             'markEnCours' => $mark_id,
  240.             "page" => $currentPage,
  241.             'filter' => $filter,
  242.             'categsList' => $repoCategs->findByEcoCategories(CURRENT_SITE_ID),
  243.             'marksList' => $repoMarks->findBy([], ['mark' => 'DESC']),
  244.             'category' => $repoCategs->find($categ_id),
  245.             'isThereSlider' => $this->isThereSlider,
  246.             'displayPromoOption' => $this->getProductsPriceType($productsResult'promo'),
  247.             'displaySoldeOption' => $this->getProductsPriceType($productsResult'solde'),
  248.         ]);
  249.     }
  250.     private function getProductsPriceType($products$type)
  251.     {
  252.         $i 0;
  253.         if (is_array($products)) {
  254.             foreach ($products as $prod) {
  255.                 if ($prod['prod_price_type'] == $type) {
  256.                     $i++;
  257.                 }
  258.             }
  259.         }
  260.         return $i true false;
  261.     }
  262.     //'text','picture','text_picture','gallery','embed','html','document','sub_menu','text_slider'
  263.     private function getProductsBlocks($product_id)
  264.     {
  265.         $content '';
  266.         $blocs $this->entityManager->getRepository(PagesBlocs::class)->findByListeBlocsWithMediaProductFiche($product_id,
  267.             'product');
  268.         $blocs $this->translateBlockFields($blocs);
  269.         if (is_array($blocs) && sizeof($blocs) > 0) {
  270.             foreach ($blocs as $bloc) {
  271.                 //                dd($bloc);
  272.                 if ($bloc['bloc_type'] == 'texte_slider') {
  273.                     $this->isThereSlider[] = $bloc['bloc_id'];
  274.                 }
  275.                 if ($bloc['bloc_type'] == 'galerie') {
  276.                     $this->isThereGalerie[] = $bloc['bloc_id'];
  277.                 }
  278.                 $mediasBlocs $this->entityManager->getRepository(Pages::class)->getAllMediasByBloc($blocs);
  279.                 //                $mediasBlocs = $this->translateBlockMediaField($mediasBlocs);
  280.                 //                dd($mediasBlocs);
  281.                 $currentBlocMedias = [];
  282.                 foreach ($mediasBlocs as $media) {
  283.                     if ($bloc['bloc_id'] == $media["id_bloc"]) {
  284.                         $currentBlocMedias[] = $media;
  285.                     }
  286.                 }
  287.                 if ($bloc['bloc_type'] == 'texte_image' && empty($currentBlocMedias)) {
  288.                     $bloc['bloc_type'] = 'texte';
  289.                 }
  290.                 if ($bloc['bloc_type'] == 'texte_slider' && empty($currentBlocMedias)) {
  291.                     $bloc['bloc_type'] = 'texte';
  292.                 }
  293.                 $content .= $this->renderView("front/front_blocks/bloc-" $bloc['bloc_type'] . ".html.twig",
  294.                     [
  295.                         'module' => 'pages',
  296.                         'medias' => $currentBlocMedias,
  297.                         'bloc' => $bloc,
  298.                         "uniqId" => uniqid(),
  299.                     ]
  300.                 );
  301.             }
  302.         }
  303.         return $content;
  304.     }
  305.     private function translateBlockMediaField($medias)
  306.     {
  307.         $translateField = [
  308.             'id' => 'media_id',
  309.             'block_id' => 'id_bloc',
  310.             'prod_media_file' => 'media_fichier',
  311.             'prod_media_link' => 'media_lien',
  312.             'prod_media_type' => 'media_type',
  313.             'prod_media_alt' => 'media_alt',
  314.             'prod_media_isblank' => 'media_is_blank',
  315.             'prod_media_display_alt' => 'media_alt_display',
  316.             'prod_media_sequence' => 'media_ordre',
  317.         ];
  318.         if (is_array($medias) && sizeof($medias)) {
  319.             foreach ($medias as $keyMedia => $media) {
  320.                 foreach ($media as $key => $m) {
  321.                     if (isset($translateField[$key])) {
  322.                         $medias[$keyMedia][$translateField[$key]] = $media[$key];
  323.                     }
  324.                 }
  325.             }
  326.         }
  327.         return $medias;
  328.     }
  329.     private function translateBlockFields($blocs)
  330.     {
  331.         $translateField = [
  332.             'id' => 'bloc_id',
  333.             'prod_block_type' => 'bloc_type',
  334.             'prod_block_text' => 'bloc_texte',
  335.             'prod_block_file' => 'bloc_htmlfile',
  336.             'prod_block_title' => 'bloc_titre',
  337.             'prod_block_subtitle' => 'bloc_sstitre',
  338.             'prod_block_text_picture' => 'bloc_type_texte_image',
  339.             'prod_block_alignment' => 'bloc_alignement',
  340.             'prod_block_embed' => 'bloc_embed',
  341.             'prod_block_margin_top' => 'bloc_margin_top',
  342.             'prod_block_margin_bottom' => 'bloc_margin_bottom',
  343.             'prod_block_multicolumn' => 'bloc_multi_column',
  344.             'prod_block_sequence' => 'bloc_ordre',
  345.         ];
  346.         $translateBlockType = [
  347.             'text' => 'texte',
  348.             'picture' => 'image',
  349.             'text_picture' => 'texte_image',
  350.             'gallery' => 'galerie',
  351.             'embed' => 'embed',
  352.             'html' => 'html',
  353.             'document' => 'document',
  354.             'sub_menu' => 'sub_menu',
  355.             'text_slider' => 'text_slider',
  356.         ];
  357.         if (is_array($blocs) && sizeof($blocs)) {
  358.             foreach ($blocs as $keyBloc => $blocElement) {
  359.                 foreach ($blocElement as $key => $b) {
  360.                     if (isset($translateField[$key])) {
  361.                         if ($key == 'prod_block_type' && isset($translateBlockType[$blocElement[$key]])) {
  362.                             $blocs[$keyBloc][$translateField[$key]] = $translateBlockType[$blocElement[$key]];
  363.                         } elseif ($key == 'prod_block_alignment' && isset($blocElement[$key])) {
  364.                             if ($blocElement[$key] == 'left') {
  365.                                 $blocs[$keyBloc][$translateField[$key]] = 'gauche';
  366.                             } else {
  367.                                 $blocs[$keyBloc][$translateField[$key]] = 'droite';
  368.                             }
  369.                         } else {
  370.                             $blocs[$keyBloc][$translateField[$key]] = $blocElement[$key];
  371.                         }
  372.                     }
  373.                 }
  374.             }
  375.         }
  376.         return $blocs;
  377.     }
  378. }