src/Controller/CatalogController.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Func;
  4. use stdClass;
  5. use App\DTO\AppDTO;
  6. use App\Entity\Cat;
  7. use App\Entity\Page;
  8. use App\Entity\Prod;
  9. use App\Entity\Photo;
  10. use App\Entity\Catpage;
  11. use App\Service\Utils\Bc;
  12. use App\Service\Cart\Cart;
  13. use RecursiveArrayIterator;
  14. use App\Service\Filter\Chars;
  15. use App\Service\Filter\Prods;
  16. use App\Model\Cat as ModelCat;
  17. use App\Service\Filter\Filter;
  18. use RecursiveIteratorIterator;
  19. use App\Model\Cart as ModelCart;
  20. use App\Model\Prod as ModelProd;
  21. use App\Repository\CatRepository;
  22. use App\Repository\PageRepository;
  23. use App\Repository\ProdRepository;
  24. use App\Repository\PhotoRepository;
  25. use App\Repository\CatpageRepository;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Symfony\Contracts\Cache\CacheInterface;
  28. use Doctrine\ORM\Tools\Pagination\Paginator;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use App\Service\Paginator as ServicePaginator;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. use Symfony\Component\HttpFoundation\RequestStack;
  34. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  35. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  36. /** @package App\Controller */
  37. class CatalogController extends AbstractASController
  38. {
  39.     private CacheInterface $Cache;
  40.     private EntityManagerInterface $em;
  41.     protected AppDTO $app;
  42.     protected ModelProd $ModelProd;
  43.     protected Cart $Cart;
  44.     protected ModelCart $ModelCart;
  45.     // Repositories
  46.     protected CatRepository $Cats;
  47.     protected ProdRepository $Prods;
  48.     protected PageRepository $Pages;
  49.     protected CatpageRepository $Catpages;
  50.     protected PhotoRepository $Photos;
  51.     public function __construct(CacheInterface $CacheEntityManagerInterface $emAppDTO $appModelProd $ModelProdCart $CartModelCart $ModelCartRequestStack $requestStack)
  52.     {
  53.         $this->requestStack $requestStack;
  54.         $this->Cache $Cache;
  55.         $this->em $em;
  56.         $this->app $app;
  57.         $this->ModelProd $ModelProd;
  58.         $this->ModelCart $ModelCart;
  59.         $this->Cart $Cart;
  60.         $this->Cats $this->em->getRepository(Cat::class);
  61.         $this->Prods $this->em->getRepository(Prod::class);
  62.         $this->Pages $this->em->getRepository(Page::class);
  63.         $this->Catpages $this->em->getRepository(Catpage::class);
  64.         $this->Photos $this->em->getRepository(Photo::class);
  65.     }
  66.     #[Route('/catalog'name'app_catalog')]
  67.     public function index(): Response
  68.     {
  69.         return $this->redirectToRoute('home');
  70.     }
  71.     #[Route(path'/catalog/cat-{cat_id}-{cat_intname}'name'prod_list_cat_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  72.     #[Route(path'/catalog/cat-{cat_id}-{cat_intname}/filter-{filters}'name'prod_list_cat_filte_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  73.     #[Route(path'/catalog/{spec}/cat-{cat_id}-{cat_intname}/filter-{filters}'name'prod_list_cat_spec_filter_no_locale'defaults: ['_locale' => '%app.default_lang%'], requirements: ['spec' => 'new|action|pop|onsale|mix|search'])]
  74.     #[Route(path'/catalog/{spec}/cat-{cat_id}-{cat_intname}'name'prod_list_cat_spec_no_locale'defaults: ['_locale' => '%app.default_lang%'], requirements: ['spec' => 'new|action|pop|onsale|mix|search'])]
  75.     #[Route(path'/catalog/{spec}'name'prod_list_spec_no_locale'defaults: ['_locale' => '%app.default_lang%'], requirements: ['spec' => 'new|action|pop|onsale|mix|search'])]
  76.     #[Route(path'/{_locale}/catalog/cat-{cat_id}-{cat_intname}'name'prod_list_cat'requirements: ['_locale' => '%app.langs%'])]
  77.     #[Route(path'/{_locale}/catalog/cat-{cat_id}-{cat_intname}/filter-{filters}'name'prod_list_cat_filter'requirements: ['_locale' => '%app.langs%'])]
  78.     #[Route(path'/{_locale}/catalog/{spec}/cat-{cat_id}-{cat_intname}/filter-{filters}'name'prod_list_cat_spec_filter'requirements: ['_locale' => '%app.langs%''spec' => 'new|action|pop|onsale|mix|search'])]
  79.     #[Route(path'/{_locale}/catalog/{spec}/cat-{cat_id}-{cat_intname}'name'prod_list_cat_spec'requirements: ['_locale' => '%app.langs%''spec' => 'new|action|pop|onsale|mix|search'])]
  80.     #[Route(path'/{_locale}/catalog/{spec}'name'prod_list_spec'requirements: ['_locale' => '%app.langs%''spec' => 'new|action|pop|onsale|mix|search'])]
  81.     public function prodList(Request $requestSessionInterface $sessionModelCat $ModelCatProds $ModelProdint $cat_id 0string $cat_intname ''string $spec ''string $filters ''): Response
  82.     {
  83.         if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  84.             $bc = ["/" => $this->app->labels->get('home')];
  85.         } else {
  86.             $bc = ["/" $request->getLocale() . "/" => $this->app->labels->get('home')];
  87.         }
  88.         switch ($spec) {
  89.             case 'new':
  90.                 $bctype '/new';
  91.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  92.                     $bc["/catalog/new"] = $this->app->labels->get('main-mobile-buttons-1');
  93.                 } else {
  94.                     $bc["/" $request->getLocale() . "/catalog/new"] = $this->app->labels->get('main-mobile-buttons-1');
  95.                 }
  96.                 break;
  97.             case 'action':
  98.                 $bctype '/action';
  99.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  100.                     $bc["/catalog/action"] = $this->app->labels->get('main-mobile-buttons-2');
  101.                 } else {
  102.                     $bc["/" $request->getLocale() . "/catalog/action"] = $this->app->labels->get('main-mobile-buttons-2');
  103.                 }
  104.                 break;
  105.             case 'pop':
  106.                 $bctype '/pop';
  107.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  108.                     $bc["/catalog/pop"] = $this->app->labels->get('main-mobile-buttons-4');
  109.                 } else {
  110.                     $bc["/" $request->getLocale() . "/catalog/pop"] = $this->app->labels->get('main-mobile-buttons-4');
  111.                 }
  112.                 
  113.                 break;
  114.             case 'mix':
  115.                 $bctype '/mix';
  116.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  117.                     $bc["/catalog/mix"] = $this->app->labels->get('main-mobile-buttons-3');
  118.                 } else {
  119.                     $bc["/" $request->getLocale() . "/catalog/mix"] = $this->app->labels->get('main-mobile-buttons-3');
  120.                 }
  121.                 break;
  122.             case 'onsale':
  123.                 $bctype '/onsale';
  124.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  125.                     $bc["/catalog/onsale"] = $this->app->labels->get('catalog-bc-sale');
  126.                 } else {
  127.                     $bc["/" $request->getLocale() . "/catalog/onsale"] = $this->app->labels->get('catalog-bc-sale');
  128.                 }                
  129.                 break;
  130.             case 'search':
  131.                 $bctype '/search';
  132.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  133.                     $bc["/catalog/search?q=" $request->get('q')] = $this->app->labels->get('catalog-bc-1') . ": \"" $request->get('q') . "\"";
  134.                 } else {
  135.                     $bc["/" $request->getLocale() . "/catalog/search?q=" $request->get('q')] = $this->app->labels->get('catalog-bc-1') . ": \"" $request->get('q') . "\"";
  136.                 }                
  137.                 break;
  138.             case '':
  139.                 $bctype '';
  140.                 break;
  141.         }
  142.         $bcc = [];
  143.         $is_filter 0;
  144.         $noindex 0;
  145.         $catpage null;
  146.         $showcont 1;
  147.         if ($request->get('filter')) {
  148.             return $this->redirect($this->_makeFilterUrl($request$spec));
  149.         }
  150.         if ($request->get('results') && $request->get('results') != $session->get('results')) {
  151.             $session->set('results'$request->get('results'));
  152.         }
  153.         if ($request->get('view') === 'list' || $request->get('view') === 'grid') {
  154.             setcookie("view_mode"$_GET['view'], time() + 86400 365'/');
  155.         }
  156.         $results $session->get('results') ?? 30;
  157.         $start = (int) $request->query->get('start');
  158.         $view_mode $request->get('view') ?? $request->cookies->get('view_mode') ?? 'list';
  159.         $prods $ModelProd->getProds($cat_id$spec$request->get('q'''));
  160.         if ($spec) {
  161.             $page $this->Pages->findOneBy(['intname' => 'catalog/' $spec]);
  162.         } else {
  163.             $page $this->Pages->findOneBy(['intname' => 'catalog']);
  164.         }
  165.         if (!$page) {
  166.             $page = new Page();
  167.         }
  168.         if ($cat_id) {
  169.             $cat_row $row $this->Cats->find($cat_id);
  170.             if (!$row->isVisible() || $row->getIntname() != $cat_intname) {
  171.                 throw $this->createNotFoundException('Page not found');
  172.             }
  173.             $page->setName($row->getName());
  174.             $page->setCont($row->getCont());
  175.             $page->setCont2($row->getCont2());
  176.             $page->setTitle(!empty($row->getTitle()) ? $row->getTitle() : Func::mess_from_tmp($this->app->templates->get('cat_title'), array("name" => $row->getName())));
  177.             $page->setName($row->getName());
  178.             $page->setH1($row->getH1() ? $row->getH1() : $row->getName());
  179.             $page->setKw($row->getKw());
  180.             $page->setDescr(!empty($row->getDescr()) ? $row->getDescr() : Func::mess_from_tmp($this->app->templates->get('cat_desc'), array("name" => $row->getName())));
  181.             // if ($charval) {
  182.             //     $Charval = new Model_Charval($charval);
  183.             //     $charval_row = $Charval->get($charval);
  184.             //     $view->page->title = $charval_row->value.". ".$view->page->title;
  185.             //     $view->page->h1 = $charval_row->value.". ".$view->page->h1;
  186.             //     $view->page->kw = $charval_row->value.", ".$view->page->kw;
  187.             //     $url->g['filter'] = 1;
  188.             //     $url->g['char'.$char] = array("0" => $charval);
  189.             // }
  190.             $tree array_reverse($ModelCat->get_cat_tree_up($cat_id));
  191.             $bctype $spec '/' $spec '';
  192.             foreach ($tree as $k => $v) {
  193.                 $cat_row $this->Cats->find($v['id']);
  194.                 $searchq '';
  195.                 if ($request->query->get('q')) {
  196.                     $searchq '?q=' $request->query->get('q');
  197.                 }
  198.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  199.                     $bc["/catalog" $bctype "/cat-" $cat_row->getId() . "-" $cat_row->getIntname() . $searchq] = $cat_row->getName();
  200.                 } else {
  201.                     $bc["/" $request->getLocale() . "/catalog" $bctype "/cat-" $cat_row->getId() . "-" $cat_row->getIntname() . $searchq] = $cat_row->getName();
  202.                 }                
  203.                 $relatives $this->Cats->findBy(['cat' => $cat_row->getCat(), 'visible' => 1]);                
  204.                 foreach ($relatives as $k => $v) {
  205.                     if (!isset($bcc["/" $request->getLocale() . "/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()])) {
  206.                         if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  207.                             $bcc["/catalog" $bctype "/cat-" $cat_row->getId() . "-" $cat_row->getIntname()] = [];
  208.                         } else {
  209.                             $bcc["/" $request->getLocale() . "/catalog" $bctype "/cat-" $cat_row->getId() . "-" $cat_row->getIntname()] = [];
  210.                         }
  211.                     }
  212.                     if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  213.                         $bcc["/catalog" $bctype "/cat-" $cat_row->getId() . "-" $cat_row->getIntname()]["/" $request->getLocale() . "/catalog/cat-" $v->getId() . "-" $v->getIntname()] = $v->getName();
  214.                     } else {
  215.                         $bcc["/" $request->getLocale() . "/catalog" $bctype "/cat-" $cat_row->getId() . "-" $cat_row->getIntname()]["/" $request->getLocale() . "/catalog/cat-" $v->getId() . "-" $v->getIntname()] = $v->getName();
  216.                     }
  217.                 }
  218.             }
  219.         }
  220.         if ($filters) {
  221.             $is_filter 1;
  222.             $sale 0;
  223.             preg_match_all("/char(\d+)\-([\d_]+)/"$filters$m);
  224.             $chars = [];
  225.             if (preg_match("/sale-(\w+)/"$filters$m2)) {
  226.                 $sale $m2[1];
  227.             }
  228.             foreach ($m[1] as $k => $v) {
  229.                 if (preg_match("/_/"$m[2][$k])) {
  230.                     preg_match_all("/(\d+)/"$m[2][$k], $mm);
  231.                     $chars[$v] = $mm[0];
  232.                 } else {
  233.                     $chars[$v][] = $m[2][$k];
  234.                 }
  235.             }
  236.             $catpage $this->Catpages->findOneBy(['intname' => str_replace("/".$request->getLocale()."/""/"$request->getPathInfo())]);
  237.             if ($catpage) {
  238.                 $is_catpage 1;
  239.                 $page->setName($catpage->getName());
  240.                 $page->setTitle($catpage->getTitle());
  241.                 $page->setH1($catpage->getH1());
  242.                 $page->setKw($catpage->getKw());
  243.                 $page->setDescr($catpage->getDescr());
  244.                 $page->setCont($catpage->getCont());
  245.                 $page->setCont2($catpage->getCont2());
  246.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  247.                     $bc["/" $catpage->getIntname()] = $catpage->getName();
  248.                 } else {
  249.                     $bc["/" $request->getLocale() . "/" $catpage->getIntname()] = $catpage->getName();
  250.                 }                
  251.             }
  252.             $chars['sale'] = $sale;
  253.             $prods $this->Prods->filter($prods$chars);
  254.         }
  255.         if ($request->get('order') == 'prior') {
  256.             uasort($prods'\App\Repository\ProdRepository::sortArrayByPriorDesc');
  257.         } elseif ($request->get('order') == 'changed' || (empty($request->get('order')) && $spec == 'new')) {
  258.             uasort($prods'\App\Repository\ProdRepository::sortArrayByChangedAsc');
  259.         } elseif ($request->get('order') && $request->get('desc_asc') == 'asc') {
  260.             uasort($prods'\App\Repository\ProdRepository::sortArrayByPriceAsc');
  261.         } elseif ($request->get('order') && $request->get('desc_asc') == 'desc') {
  262.             uasort($prods'\App\Repository\ProdRepository::sortArrayByPriceDesc');
  263.         } else {
  264.             uasort($prods'\App\Repository\ProdRepository::sortArrayBySkidkaDesc');
  265.         }
  266.         $cnt count($prods);
  267.         $show_prods = [];
  268.         $k 1;
  269.         $i 1;
  270.         $prodstable = ['cat' => ($cat_id $page->getName() : ''), 'cnt' => count($prods), 'minprice' => (count($prods) ? 999999999 0), 'maxprice' => 0'avgprice' => 0];
  271.         foreach ($prods as $prod) {
  272.             if ($start != && $i++ <= $start) continue;
  273.             if ($k <= $results) {
  274.                 // $prod->prices = $this->ModelProd->getPrices($prod);
  275.                 // $prod->photos = $this->Photos->findBy(['type' => 'prod', 'par' => $prod->getId()]);
  276.                 $show_prods[] = $prod;
  277.             }
  278.             $k++;
  279.             (($prod['price'] > 0) && ($prodstable['minprice'] > $prod['price'])) ? $prodstable['minprice'] = round($prod['price']) : false;
  280.             (($prod['price'] > 0) && ($prodstable['maxprice'] < $prod['price'])) ? $prodstable['maxprice'] = round($prod['price']) : false;
  281.             $prodstable['avgprice'] += $prod['price'];
  282.         }
  283.         if ($prodstable['cnt']) {
  284.             $prodstable['avgprice'] = round($prodstable['avgprice'] / $prodstable['cnt'], 2);
  285.         } else {
  286.             $prodstable['avgprice'] = 0;
  287.         }
  288.         if ($start) {
  289.             $page = new Page();
  290.             if (isset($row) && $row) {
  291.                 $page->setTitle(Func::mess_from_tmp($this->app->templates->get('cat_page_title'), array("page" => round($start $results) + 1"name" => $row->getName())));
  292.                 $page->setDescr(Func::mess_from_tmp($this->app->templates->get('cat_page_descr'), array("page" => round($start $results) + 1"name" => $row->getName())));
  293.             } else {
  294.                 $page->setTitle(Func::mess_from_tmp($this->app->templates->get('cat_page_title'), array("page" => round($start $results) + 1"name" => "")));
  295.                 $page->setDescr(Func::mess_from_tmp($this->app->templates->get('cat_page_descr'), array("page" => round($start $results) + 1"name" => "")));
  296.             }
  297.             
  298.             $page->setCont('');
  299.             $page->setCont2('');
  300.             $showcont 0;
  301.         }
  302.         /* For SEO. Indexing */        
  303.         $route $request->get('_route');
  304.         $canonical '';
  305.         if ($request->get('start')) {
  306.             $canonical "https://".$request->getHost().$request->getPathInfo()."?start=".$request->get('start');
  307.         } else {
  308.             $canonical "https://".$request->getHost().$request->getPathInfo();
  309.         }
  310.         
  311.         if ($request->get('start', -1) == || $request->get('start') == || $request->get('start') == 'x') {            
  312.             if ($spec && isset($row)) {
  313.                 return $this->redirectToRoute($request->get('_route'), ['cat_id' => $row->getId(), "cat_intname" => $row->getIntname(), "spec" => $spec], 301);
  314.             } elseif (isset($row)) {
  315.                 return $this->redirectToRoute($request->get('_route'), ['cat_id' => $row->getId(), "cat_intname" => $row->getIntname()], 301);
  316.             }
  317.         }
  318.         if ($start && count($show_prods) == 0) {
  319.             $this->createNotFoundException();
  320.         }
  321.         if (!empty($spec)) {
  322.             $noindex 1;
  323.         }
  324.         if ($is_filter || strpos($request->getUri(), 'filter') !== false) {
  325.             if ($catpage) {
  326.                 $noindex 0;
  327.             } else {
  328.                 $noindex 1;
  329.             }
  330.         }
  331.         if (count($request->query->all()) > 1) {
  332.             $noindex 1;
  333.         }
  334.         if (!empty($request->query->all()) && $start 30 != 0) {
  335.             $noindex 1;
  336.         }
  337.         if (!empty($request->get('results'))) {
  338.             $noindex 1;
  339.         }
  340.         if (!empty($request->get('view'))) {
  341.             $noindex 1;
  342.         }
  343.         /* End For SEO */
  344.         // Render Subcats
  345.         $subcat_list_rendered '';
  346.         if (empty($spec)) {
  347.             $cats $this->Cats->findBy(['visible' => 1'cat' => $cat_id], ["prior" => "desc""name" => "asc"]);
  348.             if (count($cats)) {
  349.                 $subcat_list_rendered $this->render('catalog/subcat-list.html.twig', [
  350.                     'cats' => $cats,
  351.                 ]);
  352.             }
  353.         }
  354.         // Ids in Cart
  355.         $cartids = [];
  356.         foreach ($this->Cart->getCart() as $k => $v) {
  357.             $cartids[] = $v['id'];
  358.         }
  359.         $cat $this->Cats->find($cat_id);
  360.         if ($request->get('test')) {
  361.             foreach ($show_prods as $k => $v) {
  362.                 echo $v['id']."-".$v['price']."<br>";
  363.             }
  364.         }
  365.         
  366.         if ($start) {
  367.             if ($cat) {
  368.                 $cat->setCont('');
  369.             }
  370.             
  371.             $showcont 0;
  372.         }
  373.         
  374.         $show_prods $this->Prods->prodArrayToEntity($show_prods);        
  375.         
  376.         if ($request->get('order') == 'prior') {
  377.             uasort($show_prods'\App\Repository\ProdRepository::sortByPriorDesc');
  378.         } elseif ($request->get('order') == 'changed' || (empty($request->get('order')) && $spec == 'new')) {
  379.             uasort($show_prods'\App\Repository\ProdRepository::sortByChangedAsc');
  380.         } elseif ($request->get('order') && $request->get('desc_asc') == 'asc') {
  381.             uasort($show_prods'\App\Repository\ProdRepository::sortByPriceAsc');
  382.         } elseif ($request->get('order') && $request->get('desc_asc') == 'desc') {                        
  383.             uasort($show_prods'\App\Repository\ProdRepository::sortByPriceDesc');            
  384.         } else {
  385.             uasort($show_prods'\App\Repository\ProdRepository::sortBySkidkaDesc');
  386.         }
  387.         foreach ($show_prods as $k => $v) {
  388.             $show_prods[$k]->setPrices($this->ModelProd->getPrices($v));
  389.         }
  390.         return $this->render('catalog/list.html.twig', [
  391.             'subcat_list_rendered' => $subcat_list_rendered,
  392.             'spec' => $spec,
  393.             'cat_id' => $cat_id,
  394.             'cat_intname' => $cat_intname,
  395.             'filters' => $filters,
  396.             'prods' => $show_prods,
  397.             'noindex' => $noindex,
  398.             'cat' => $cat,
  399.             'results' => $results,
  400.             'view_mode' => $view_mode,
  401.             'page' => $page,
  402.             'cartids' => $cartids,
  403.             'paginator' => new ServicePaginator($request->attributes->get('_route'), $cnt$results$start),
  404.             'bc' => $bc,
  405.             'bcc' => $bcc,
  406.             'canonical' => $canonical,
  407.             'showcont' => $showcont,
  408.             'prodstable' => $prodstable,
  409.             'cart_items' => $this->ModelCart->getCart(),
  410.         ]);
  411.     }
  412.     #[Route('/catalog/prod-{prod_id}'name'prod_cont_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  413.     #[Route('/{_locale}/catalog/prod-{prod_id}'name'prod_cont'requirements: ['_locale' => '%app.langs%'])]
  414.     public function prodCont(Request $requestModelCat $ModelCatint $prod_id 0): Response
  415.     {
  416.         if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  417.             $bc = ["/" => $this->app->labels->get('home')];
  418.         } else {
  419.             $bc = ["/" $request->getLocale() . "/" => $this->app->labels->get('home')];
  420.         }
  421.         
  422.         $bcc = [];
  423.         $prod $this->Prods->find($prod_id);
  424.         if (!$prod) {
  425.             throw $this->createNotFoundException('Page not found');
  426.         }
  427.         if ($prod) {
  428.             $prod->setPrices($this->ModelProd->getPrices($prod));
  429.         }
  430.         $photos $this->Photos->findBy(['type' => 'prod''par' => $prod->getId()]);
  431.         $cat_id $prod->getCat();
  432.         $tree array_reverse($ModelCat->get_cat_tree_up($cat_id));
  433.         foreach ($tree as $k => $v) {
  434.             $cat_row $this->Cats->find($v['id']);
  435.             $searchq '';
  436.             if ($request->query->get('q')) {
  437.                 $searchq '?q=' $request->query->get('q');
  438.             }
  439.             $relatives $this->Cats->findBy(['cat' => $cat_row->getCat(), 'visible' => 1]);
  440.             if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  441.                 $bc["/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()] = $cat_row->getName();
  442.             } else {
  443.                 $bc["/" $request->getLocale() . "/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()] = $cat_row->getName();
  444.             }
  445.             foreach ($relatives as $k => $v) {
  446.                 if (!isset($bcc["/" $request->getLocale() . "/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()])) {
  447.                     if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  448.                         $bcc["/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()] = [];
  449.                     } else {
  450.                         $bcc["/" $request->getLocale() . "/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()] = [];
  451.                     }                    
  452.                 }
  453.                 if ($request->getLocale() == $this->getParameter('app.default_lang')) {
  454.                     $bcc["/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()]["/catalog/cat-" $v->getId() . "-" $v->getIntname()] = $v->getName();
  455.                 } else {
  456.                     $bcc["/" $request->getLocale() . "/catalog/cat-" $cat_row->getId() . "-" $cat_row->getIntname()]["/" $request->getLocale() . "/catalog/cat-" $v->getId() . "-" $v->getIntname()] = $v->getName();
  457.                 }                    
  458.             }
  459.         }
  460.         $prod_chars $this->Prods->getprodchars($prod_id);
  461.         $prod_childs $this->Prods->getprodchilds($prod_id);
  462.         //TODO. Alex. SEO
  463.         $page = new Page();
  464.         $page->setTitle(Func::mess_from_tmp($this->app->templates->get('prod_title'), array("name" => $prod->getName())));
  465.         $page->setDescr(Func::mess_from_tmp($this->app->templates->get('prod_descr'), array("name" => $prod->getName())));
  466.         $page->setCont('');
  467.         $page->setCont2('');
  468.         return $this->render('catalog/cont.html.twig', [
  469.             'page' => $page,
  470.             'prod' => $prod,
  471.             'photos' => $photos,
  472.             'bc' => $bc,
  473.             'bcc' => $bcc,
  474.             'chars' => $prod_chars,
  475.             'childs' => $prod_childs,
  476.             'cart_items' => $this->ModelCart->getCart(),
  477.         ]);
  478.     }
  479.     #[Route('/catalog/prod/ajax/{prod_id}'name'prod_ajax_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  480.     #[Route('/{_locale}/catalog/prod/ajax/{prod_id}'name'prod_ajax'requirements: ['_locale' => '%app.langs%'])]
  481.     public function prodAjaxCont(Request $requestint $prod_id 0): Response
  482.     {
  483.         $prod $this->Prods->find($prod_id);
  484.         if ($prod) {
  485.             $prod->setPrices($this->ModelProd->getPrices($prod));
  486.         }
  487.         $photos $this->Photos->findBy(['type' => 'prod''par' => $prod->getId()]);
  488.         $photosarray = [];
  489.         foreach ($photos as $photo) {
  490.             $obj = new stdClass();
  491.             $obj->id $photo->getId();
  492.             $photosarray[] = $obj;
  493.         }
  494.         $newprod = [
  495.             'name' => $prod->getName(),
  496.             'labels' => $this->render('catalog/block/prod-labels.html.twig', [
  497.                 'prodone' => $prod,
  498.             ])->getContent(),
  499.             'price' => $this->render('catalog/block/prod-price.html.twig', [
  500.                 'prodone' => $prod,
  501.             ])->getContent(),
  502.             'inpack' => $this->render('catalog/block/prod-inpack.html.twig', [
  503.                 'prodone' => $prod,
  504.             ])->getContent(),
  505.             'weight' => $this->render('catalog/block/prod-weight.html.twig', [
  506.                 'prodone' => $prod,
  507.             ])->getContent(),
  508.             'form' => $this->render('catalog/block/prod-form.html.twig', [
  509.                 'prodone' => $prod,
  510.             ])->getContent(),
  511.             'wishlist' => $this->render('catalog/block/prod-wishlist.html.twig', [
  512.                 'prodone' => $prod,
  513.             ])->getContent(),
  514.             'photos' => $photosarray,
  515.         ];
  516.         return $this->render('catalog/ajax.html.twig', [
  517.             'prod' => json_encode($newprod),
  518.         ]);
  519.     }
  520.     #[Route(path'/catalog/getnum/{cat_id}'name'getnum_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  521.     #[Route(path'/catalog/{spec}/getnum/{cat_id}'name'getnum_spec_no_locale'defaults: ['_locale' => '%app.default_lang%'], requirements: ['spec' => 'new|action|pop|onsale|mix|search'])]
  522.     #[Route(path'/{_locale}/catalog/getnum/{cat_id}'name'getnum'requirements: ['_locale' => '%app.langs%'])]
  523.     #[Route(path'/{_locale}/catalog/{spec}/getnum/{cat_id}'name'getnum_spec'requirements: ['_locale' => '%app.langs%''spec' => 'new|action|pop|onsale|mix|search'])]
  524.     public function getNum(Request $requestProds $ModelProdChars $ModelCharint $cat_id 0string $spec ''): Response
  525.     {
  526.         $result = [];
  527.         $prods $ModelProd->getProds($cat_id$spec);
  528.         $chars $ModelChar->getChars($cat_id);
  529.         $charvals $ModelChar->getCharVals($cat_id);
  530.         $get_chars $ModelProd->getchars($request->query->all());
  531.         //$result = array("num" => count($ModelProd->filter($request->query->all(), $prods)));
  532.         $prods_filtered $this->Prods->filter($prods$get_chars);
  533.         $result = array("num" => count($prods_filtered));
  534.         foreach ($chars as $k => $char) {
  535.             foreach ($charvals[$char->getId()] as $k => $cv) {
  536.                 $result['prodcount'][$cv->getId()] = $ModelProd->prodcount($prods$get_chars$char->getId(), $cv->getId());
  537.             }
  538.             $result['prodcount']['action'] = $ModelProd->prodcount($prods$get_chars'action'1);
  539.             $result['prodcount']['new'] = $ModelProd->prodcount($prods$get_chars'new'1);
  540.             $result['prodcount']['pop'] = $ModelProd->prodcount($prods$get_chars'pop'1);
  541.             $result['prodcount']['mix'] = $ModelProd->prodcount($prods$get_chars'mix'1);
  542.         }
  543.         if (is_array($get_chars)) {
  544.             $result['chars'] = array_keys($get_chars);
  545.             $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($get_chars));
  546.             foreach ($it as $v) {
  547.                 $result['charvals'][] = $v;
  548.             }
  549.         } else {
  550.             $result['charvals'] = array();
  551.             $result['chars'] = array();
  552.         }
  553.         return $this->json($result);
  554.     }
  555.     private function _makeFilterUrl(Request $requeststring $spec): string
  556.     {
  557.         $url_redir $request->getPathInfo() . Filter::generate_url($request->query->all());
  558.         return $url_redir;
  559.     }
  560. }