src/Controller/ProductController.php line 84

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Services\APEeenheidService;
  4. use App\Website\LinkGenerator\NewsLinkGenerator;
  5. use App\Website\LinkGenerator\ProductLinkGenerator;
  6. use App\Website\Navigation\BreadcrumbHelperService;
  7. use Pimcore\Model\DataObject;
  8. use Pimcore\Model\DataObject\ProductGroup;
  9. use Pimcore\Model\DataObject\ProductSubgroup;
  10. use Pimcore\Model\DataObject\ProductArticle;
  11. use Pimcore\Model\Site;
  12. use Pimcore\Model\WebsiteSetting;
  13. use Pimcore\Twig\Extension\Templating\HeadTitle;
  14. use Pimcore\Twig\Extension\Templating\Placeholder;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Knp\Component\Pager\PaginatorInterface;
  21. class ProductController extends BaseController
  22. {
  23.     /**
  24.      * @var ProductLinkGenerator
  25.      */
  26.     protected $productLinkGenerator;
  27.     protected $productDocument;
  28.     /**
  29.      * ProductExtension constructor.
  30.      *
  31.      * @param ProductLinkGenerator $productLinkGenerator
  32.      */
  33.     public function __construct(ProductLinkGenerator $productLinkGenerator)
  34.     {
  35.         $this->productLinkGenerator $productLinkGenerator;
  36.         $this->productDocument WebsiteSetting::getByName('product_document')->getData();
  37.     }
  38.     /**
  39.      * @param Request $request
  40.      * @return Response
  41.      * @Route ("{_locale}/aanbod", name="aanbod-overview")
  42.      * @throws \Exception
  43.      */
  44.     public function overviewAction(Request $requestPaginatorInterface $paginator)
  45.     {
  46.         $subSiteKey '*';
  47.         $page $request->get('page'1);
  48.         if (Site::isSiteRequest()) {
  49.             $subSiteKey Site::getCurrentSite()->getRootDocument()->getKey();
  50.         }
  51.         $groupList = new DataObject\ProductGroup\Listing();
  52.         $groupList->setOrderKey(['orderList''oms']);
  53.         $groupList->setOrder('asc');
  54.         $groupList->setCondition("visible = :visible", ["visible" => "1"]); // Only visible on website
  55.         // only show required groups
  56.         $groupListGroups = [];
  57.         /** @var \Pimcore\Model\DataObject\ProductGroup $group */
  58.         foreach($groupList as $group){
  59.             $dependencies $group->getDependencies();
  60.             $requiredBy $dependencies->getRequiredBy();
  61.             if(!$requiredBy){
  62.                 $groupListGroups[] = $group;
  63.             }
  64.         }
  65.         $paginator $paginator->paginate(
  66.             $groupListGroups,
  67.             $page,
  68.             24
  69.         );
  70.         return $this->render('product/overview.html.twig', [
  71.             'productcategories' => $paginator,
  72.             'paginationVariables' => $paginator->getPaginationData(),
  73.             'page' => $page
  74.         ]);
  75.     }
  76.     /**
  77.      * @param Request $request
  78.      * @return Response
  79.      * @Route ("{_locale}/no-product-found", name="no_product_found")
  80.      * @throws \Exception
  81.      */
  82.     public function noProductFoundAction(Request $requestPaginatorInterface $paginator)
  83.     {
  84.         $subSiteKey '*';
  85.         $page $request->get('page'1);
  86.         if (Site::isSiteRequest()) {
  87.             $subSiteKey Site::getCurrentSite()->getRootDocument()->getKey();
  88.         }
  89.         $groupList = new DataObject\ProductGroup\Listing();
  90.         $groupList->setOrderKey(['orderList''oms']);
  91.         $groupList->setOrder('asc');
  92.         $groupList->setCondition("visible = :visible", ["visible" => "1"]); // Only visible on website
  93.         // only show required groups
  94.         $groupListGroups = [];
  95.         /** @var \Pimcore\Model\DataObject\ProductGroup $group */
  96.         foreach($groupList as $group){
  97.             $dependencies $group->getDependencies();
  98.             $requiredBy $dependencies->getRequiredBy();
  99.             if(!$requiredBy){
  100.                 $groupListGroups[] = $group;
  101.             }
  102.         }
  103.         $paginator $paginator->paginate(
  104.             $groupListGroups,
  105.             $page,
  106.             24
  107.         );
  108.         return $this->render('product/overview.html.twig', [
  109.             'productcategories' => $paginator,
  110.             'paginationVariables' => $paginator->getPaginationData(),
  111.             'page' => $page
  112.         ]);
  113.     }
  114.     /**
  115.      * @param Request $request
  116.      * @Route("{_locale}/{path}/{key}~g{id}", name="group-overview", defaults={"path"=""}, requirements={"path"=".*?", "key"="[\w-]+", "id"="\d+"})
  117.      *
  118.      * @return Response
  119.      *
  120.      * @throws \Exception
  121.      */
  122.     public function groupoverviewAction(Request $requestPaginatorInterface $paginator)
  123.     {
  124.         $category ProductGroup::getById($request->get('id'));
  125.         // Check if visible
  126.         if(!$category->getVisible()){
  127.             throw new NotFoundHttpException('Not public.');
  128.         }
  129.         $page $request->get('page'1);
  130.         $subSiteKey '*';
  131.         if (Site::isSiteRequest()) {
  132.             $subSiteKey Site::getCurrentSite()->getRootDocument()->getKey();
  133.         }
  134.         // Check if categories are combined
  135.         $dependencies $category->getDependencies();
  136.         $requires $dependencies->getRequires();
  137.         $requiredBy $dependencies->getRequiredBy();
  138.         if($requiredBy){
  139.             // Goto first DataObject
  140.             foreach ($requiredBy as $requireby){
  141.                 if($requireby['type'] == 'object'){
  142.                     $objectId $requireby['id'];
  143.                     $objectData \Pimcore\Model\DataObject::getById($objectId);
  144.                     if($objectData->getClassName() == 'productGroup'){
  145.                         // redirect to RequiredBy Object
  146.                         $redirectUrl $this->productLinkGenerator->generate($objectData, ['document' => $this->productDocument]);
  147.                         return $this->redirect($redirectUrl);
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.         $foundIds = [];
  153.         foreach ($requires as $require){
  154.             if($require['type'] == 'object'){
  155.                 $objectId $require['id'];
  156. //                $objectData = \Pimcore\Model\DataObject::getById($objectId);
  157.                 $foundIds[] = $objectId;
  158.             }
  159.         }
  160.         $subcategoryList = new DataObject\ProductSubgroup\Listing();
  161.         $subcategoryList->setCondition("o_parentId = :groupid", ["groupid" => $request->get('id')]);
  162.         if($foundIds){
  163.             foreach ($foundIds as $foundId){
  164.                 $subcategoryList->addConditionParam("o_parentId = $foundId""""OR");
  165.             }
  166.         }
  167.         $subcategoryList->setOrderKey(['orderList''oms']);
  168. //        $subcategoryList->setOrderKey('oms');
  169.         $subcategoryList->setOrder('asc');
  170.         $subcategoryList->setLimit(1);
  171.         // Goto first in line
  172.         $firstSubCategory $subcategoryList->load();
  173.         if(count($firstSubCategory) > 0){
  174.             $foundSubCategory $firstSubCategory[0];
  175.             $foundCategory $foundSubCategory->getParent();
  176.             $redirectUrl $this->productLinkGenerator->generateSubgroup($foundCategory$foundSubCategory, ['document' => $this->productDocument]);
  177.             return $this->redirect($redirectUrl);
  178.         }else{
  179.             throw new NotFoundHttpException('Product subcategory not found.');
  180.         }
  181. //        $paginator = $paginator->paginate(
  182. //            $subcategoryList,
  183. //            $page,
  184. //            16
  185. //        );
  186. //
  187. //        return $this->render('product/groupoverview.html.twig', [
  188. //            'category' => $category,
  189. //            'productsubcategories' => $paginator,
  190. //            'paginationVariables' => $paginator->getPaginationData(),
  191. //            'page' => $page
  192. //        ]);
  193.     }
  194.     /**
  195.      * @Route("{_locale}/{path}/{gkey}~g{gid}/{key}~sg{id}", name="subgroup-overview", defaults={"path"=""}, requirements={"path"=".*?", "key"="[\w-]+", "id"="\d+"})
  196.      *
  197.      * @param Request $request
  198.      *
  199.      * @return Response
  200.      */
  201.     public function suboverviewAction(Request $requestPaginatorInterface $paginator)
  202.     {
  203.         $subSiteKey '*';
  204.         if (Site::isSiteRequest()) {
  205.             $subSiteKey Site::getCurrentSite()->getRootDocument()->getKey();
  206.         }
  207.         $category ProductGroup::getById($request->get('gid'));
  208.         // Check if visible
  209.         if(!$category->getVisible()){
  210.             throw new NotFoundHttpException('Not public.');
  211.         }
  212.         $subcategory ProductSubgroup::getById($request->get('id'));
  213.         $page $request->get('page'1);
  214.         // Check if categories are combined
  215.         $dependencies $category->getDependencies();
  216.         $requires $dependencies->getRequires();
  217.         $requiredBy $dependencies->getRequiredBy();
  218.         $foundIds = [];
  219.         if($requiredBy){
  220.             // Goto first DataObject
  221.             foreach ($requiredBy as $requireby){
  222.                 if($requireby['type'] == 'object'){
  223.                     $objectId $requireby['id'];
  224.                     $foundIds[] = $objectId;
  225.                 }
  226.             }
  227.         }
  228.         foreach ($requires as $require){
  229.             if($require['type'] == 'object'){
  230.                 $objectId $require['id'];
  231.                 $foundIds[] = $objectId;
  232.             }
  233.         }
  234.         $subcategoryList = new DataObject\ProductSubgroup\Listing();
  235.         $subcategoryList->setCondition("o_parentId = :groupid", ["groupid" => $request->get('gid')]);
  236.         if($foundIds){
  237.             foreach ($foundIds as $foundId){
  238.                 $subcategoryList->addConditionParam("o_parentId = $foundId""""OR");
  239.             }
  240.         }
  241.         $subcategoryList->setOrderKey(['orderList''oms']);
  242.         $subcategoryList->setOrder('asc');
  243.         $subcategoryList $subcategoryList->load();
  244.         if (!($subcategory instanceof ProductSubgroup && ($subcategory->isPublished() || $this->verifyPreviewRequest($request$subcategory)))) {
  245.             throw new NotFoundHttpException('Product subcategory not found.');
  246.         }
  247.         $subSiteKey '*';
  248.         if (Site::isSiteRequest()) {
  249.             $subSiteKey Site::getCurrentSite()->getRootDocument()->getKey();
  250.         }
  251.         // Fetch Merken
  252.         $merkArr = [];
  253.         if(is_numeric$request->get('id') )){
  254.             $classIdProductArticle DataObject\ProductArticle::classId();
  255.             $dbArtciles \Pimcore\Db::get();
  256.             $sqlSelect "SELECT `merk` FROM `object_".$classIdProductArticle."` WHERE `merk` IS NOT NULL AND o_parentId = ".$request->get('id');
  257. //            $sqlSelect = "SELECT `merk` FROM `object_".$classIdProductArticle."` WHERE `merk` IS NOT NULL";
  258.             $dataFound $dbArtciles->fetchAll($sqlSelect);
  259.             $merkenFound array_unique(array_column($dataFound'merk'));
  260.             foreach($merkenFound as $merk){
  261.                 if ($merk === ""){
  262.                    $merk "Overige merken";
  263.                    $merkArr[] = $merk;
  264.                 }else{
  265.                     $merkArr[] = $merk;
  266.                 }
  267.             }
  268.             sort($merkArr);
  269.         }
  270.         // Filter on
  271.         // ($request->get('merken')||$request->get('stock')||$request->get('price'))
  272.         if ($request->isXmlHttpRequest() && $request->get('filteredResults'true)){
  273.             $productList = new DataObject\ProductArticle\Listing();
  274.             $productList->setCondition("o_parentId = :parentId", ["parentId" => $request->get('id')]);
  275.             $productList->setOrderKey(['merk','oms']);
  276.             $productList->setOrder("asc");
  277.             $merken $request->get('merken', []);
  278.             $stocks $request->get('stock', []);
  279.             $price $request->get('price');
  280.             $addExtraCondition '';
  281.             if ($stocks && count($stocks) > 0) {
  282.                 $excludedStocks array_diff([012], $stocks);
  283.                 $stocksItems = [
  284.                     '`stock` <= 0',
  285.                     '(`stock` <= `aantalVerkochtLaatsteMaand` AND (`stock` > 0))',
  286.                     '(`stock` >= `aantalVerkochtLaatsteMaand` AND (`stock` > 0))',
  287.                 ];
  288.                 foreach ($excludedStocks as $excludedStock) {
  289.                     unset($stocksItems[$excludedStock]);
  290.                 }
  291.                 if (count($stocksItems) > 0) {
  292.                     $addExtraCondition .= "AND (" implode(" OR "$stocksItems) . ") ";
  293.                 }
  294.             }
  295.             if ($price) {
  296.                 if ($price[0] === 'up'){
  297.                     $productList->setOrderKey("prijs");
  298.                     $productList->setOrder("desc");
  299.                 }
  300.                 if ($price[0] === 'down'){
  301.                     $productList->setOrderKey("prijs");
  302.                     $productList->setOrder("asc");
  303.                 }
  304.             }
  305.             if ($merken && count($merken) > 0) {
  306.                 $addExtraCondition .= "AND ( `merk` = '"implode("' OR `merk` = '"$merken). "')";
  307.             }
  308.             $productList->setCondition("o_parentId = :parentId $addExtraCondition", ["parentId" => $request->get('id')]);
  309.             $paginator $paginator->paginate(
  310.                 $productList,
  311.                 $page,
  312.                 36
  313.             );
  314.             $result $this->renderView('includes/product/suboverview.html.twig',
  315.                 [
  316.                     'category' => $category,
  317.                     'subcategory' => $subcategory,
  318.                     'productlist' => $paginator,
  319.                     'subcategoryList' => $subcategoryList,
  320.                     'merken' => $merkArr
  321.                 ]
  322.             );
  323.             $pagination $this->renderView('includes/pagination-product-ajax.html.twig',
  324.                 [
  325.                     'paginationVariables' => $paginator->getPaginationData(),
  326.                     'pageselected' => $request->get('page')
  327.                 ]
  328.             );
  329.             if($productList->count()){
  330.                 $respond['products'] = $result;
  331.                 $respond['pagination'] = $pagination;
  332.             }else{
  333.                 $respond['products'] = '<div class="col-md-12">Geen artikels teruggevonden.</div>';
  334.                 $respond['pagination'] = '';
  335.             }
  336.             return new JsonResponse($respond);
  337.         } else {
  338.             $productList = new DataObject\ProductArticle\Listing();
  339.             $productList->setCondition("o_parentId = :parentId", ["parentId" => $request->get('id')]);
  340.             $productList->setOrderKey(['merk','oms']);
  341.             $productList->setOrder("asc");
  342.             $productList->setCondition("o_parentId = :parentId AND `merk` != '' AND `merk` IS NOT NULL AND `stock` != '' AND `stock` IS NOT NULL", ["parentId" => $request->get('id')]);
  343.             $paginator $paginator->paginate(
  344.                 $productList,
  345.                 $page,
  346.                 36
  347.             );
  348.         }
  349.         return $this->render('product/suboverview.html.twig', [
  350.             'category' => $category,
  351.             'subcategory' => $subcategory,
  352.             'productlist' => $paginator,
  353.             'subcategoryList' => $subcategoryList,
  354.             'paginationVariables' => $paginator->getPaginationData(),
  355.             'pageselected' => $page,
  356.             'merken' => $merkArr
  357.         ]);
  358.     }
  359.     /**
  360.      * @Route("{_locale}/{path}/{gkey}~g{gid}/{sgkey}~sg{sgid}/{key}~pi{id}", name="article-detail", defaults={"path"=""}, requirements={"path"=".*?", "key"="[\w-]+", "id"="\d+"})
  361.      *
  362.      * @param Request $request
  363.      *
  364.      * @return Response
  365.      */
  366.     public function detailAction(Request $request)
  367.     {
  368.         $category ProductGroup::getById($request->get('gid'));
  369.         // Check if visible
  370.         if(!$category->getVisible()){
  371.             throw new NotFoundHttpException('Not public.');
  372.         }
  373.         $subcategory ProductSubgroup::getById($request->get('sgid'));
  374.         $productArticle ProductArticle::getById($request->get('id'));
  375.         if (!($category instanceof ProductGroup && ($category->isPublished() || $this->verifyPreviewRequest($request$category)))) {
  376.             throw new NotFoundHttpException('ProductCategory not found.');
  377.         }
  378.         if (!($subcategory instanceof ProductSubgroup && ($subcategory->isPublished() || $this->verifyPreviewRequest($request$subcategory)))) {
  379.             throw new NotFoundHttpException('ProductSubcategory not found.');
  380.         }
  381.         if (!($productArticle instanceof ProductArticle && ($productArticle->isPublished() || $this->verifyPreviewRequest($request$productArticle)))) {
  382.             throw new NotFoundHttpException('ProductArticle not found.');
  383.         }
  384.         $APEeenheidService = new APEeenheidService();
  385.         return $this->render('product/detail.html.twig', [
  386.             'category' => $category,
  387.             'subcategory' => $subcategory,
  388.             'product' => $productArticle,
  389.             'orderByQuantity' => $APEeenheidService->getOrderByFromAPE($productArticle->getAPEeenheid())
  390.         ]);
  391.     }
  392.     /**
  393.      * @Route("{_locale}/product/{code}", name="article-short-code-detail")
  394.      *
  395.      * @param Request $request
  396.      *
  397.      * @return Response
  398.      */
  399.     public function detailShortCodeAction(Request $request)
  400.     {
  401.         if (ProductArticle::getByCode($request->get('code'))->getData() !== []){
  402.             $productArticle ProductArticle::getByCode($request->get('code'))->getData()[0];
  403.             $subcategory $productArticle->getParent();
  404.             $category $subcategory->getParent();
  405.             $shortLink true;
  406.             if (!($category instanceof ProductGroup && ($category->isPublished() || $this->verifyPreviewRequest($request$category)))) {
  407.                 throw new NotFoundHttpException('ProductCategory not found.');
  408.             }
  409.             if (!($subcategory instanceof ProductSubgroup && ($subcategory->isPublished() || $this->verifyPreviewRequest($request$subcategory)))) {
  410.                 throw new NotFoundHttpException('ProductSubcategory not found.');
  411.             }
  412.             if (!($productArticle instanceof ProductArticle && ($productArticle->isPublished() || $this->verifyPreviewRequest($request$productArticle)))) {
  413.                 throw new NotFoundHttpException('ProductArticle not found.');
  414.             }
  415.             $APEeenheidService = new APEeenheidService();
  416.             return $this->render('product/detail.html.twig', [
  417.                 'category' => $category,
  418.                 'shortLink' => $shortLink,
  419.                 'subcategory' => $subcategory,
  420.                 'product' => $productArticle,
  421.                 'orderByQuantity' => $APEeenheidService->getOrderByFromAPE($productArticle->getAPEeenheid())
  422.             ]);
  423.         }
  424.         return $this->redirect('/nl');
  425.     }
  426. }