- <?php
- /**
-  * Created by Elements.at New Media Solutions GmbH
-  *
-  */
- namespace App\Controller;
- use App\Twig\ConfigHelper;
- use Pimcore\Model\DataObject\Product;
- use Symfony\Component\HttpFoundation\JsonResponse;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\Response;
- class ProductController extends AbstractController
- {
-     /**
-      *
-      * @param Request $request
-      *
-      * @return Response
-      */
-     public function categoryAction(Request $request): Response
-     {
-         return $this->renderTemplate('product/category.html.twig');
-     }
-     /**
-      *
-      * @param Request $request
-      *
-      * @return JsonResponse|Response
-      *
-      * @throws \Exception
-      */
-     public function overviewAction(Request $request, ConfigHelper $configHelper): Response
-     {
-         $sortingArray = [
-             "KomatsuPlanierraupen" => "operatingWeight",
-             "KomatsuBaggerlader" => "operatingWeight",
-             "KomatsuIMCHydraulikbagger" => "operatingWeight",
-             "KomatsuHybridHydraulikbagger" => "operatingWeight",
-             "KomatsuKurzheckbagger" => "operatingWeight",
-             "KomatsuAbbruchbagger" => "operatingWeight",
-             "KomatsuSLFHydraulikbagger" => "operatingWeight",
-             "KomatsuMinibagger" => "operatingWeight",
-             "KomatsuMobilbagger" => "enginePower",
-             "KomatsuKompaktMobilbagger" => "operatingWeight",
-             "KomatsuKompaktbagger" => "operatingWeight",
-             "KomatsuMiningbagger" => "operatingWeight",
-             "KomatsuKompaktlader" => "operatingWeight",
-             "KomatsuHydraulikbagger" => "operatingWeight",
-             "KomatsuKompaktradlader" => "bucketCapacity",
-             "KomatsuRadlader" => "bucketCapacity",
-             "KomatsuElektrischeMuldenkipper" => "ratedPayload",
-             "KomatsuMuldenkipper" => "ratedPayload",
-             "KomatsuKnickgelenkteMuldenkipper" => "ratedPayload",
-             "Mitsubishi" => "loadCapacity",
-             "Powerscreen" => "throughput",
-             "PowerscreenTws" => "throughput",
-             "Frd" => "baseMachineWeight",
-             "PalfingerLoaderCrane" => "maxLiftCapacity",
-         ];
-         $siteConfig = $configHelper->getSiteConfig();
-         $categories = $this->getDocumentEditable('relations', 'categories')->getElements();
-         $categoryIds = [];
-         $products = [];
-         $orderKeyBrick = [];
-         $orderKeyBrickCases = [];
-         $orderKeyCategory = [];
-         $orderKeyCategoryCases = [];
-         if ($categories) {
-             $products = new Product\Listing();
-             foreach ($categories as $index => $category) {
-                 $categoryIds[] = $category->getId();
-                 $orderKeyCategoryCases[] = "WHEN category__id = " . $category->getId() . " THEN " . $index;
-                 $brick = $category->getObjectBrick();
-                 if ($brick) {
-                     $products->addObjectbrick($brick);
-                     if (isset($sortingArray[$brick])) {
-                         $orderKeyBrickCases[] = "WHEN " . $brick . "." . $sortingArray[$brick] . " IS NOT NULL THEN CAST(REPLACE(SUBSTRING_INDEX(" . $brick . "." . $sortingArray[$brick] . ", '-', 1), ',', '.') AS DECIMAL(10,2))";
-                         $orderKeyBrickCases[] = "WHEN " . $brick . "." . $sortingArray[$brick] . " IS NULL THEN 1000000";
-                     }
-                 }
-             }
-             if (count($orderKeyCategoryCases)) {
-                 $orderKeyCategory[] = "CASE " . implode(" ", $orderKeyCategoryCases) . " END ASC";
-             }
-             if (count($orderKeyBrickCases)) {
-                 $orderKeyBrick[] = "CASE " . implode(" ", $orderKeyBrickCases) . " END ASC";
-             }
-             $products->addConditionParam("title != '' OR title IS NOT NULL");
-             $products->addConditionParam('category__id IN (' . implode(',', $categoryIds) . ')');
-             if ($siteConfig) {
-                 $products->addConditionParam('config LIKE :config', ['config' => '%,' . $siteConfig->getId() . ',%']);
-             }
-             $brandId = $this->document->getProperty('hasBrand') ? $this->document->getProperty('hasBrand')->getId() : null;
-             if ($brandId != null) {
-                 $products->addConditionParam('brand__id = :brand', value: ['brand' => $brandId]);
-             }
-             if ($request->get('categories', [])) {
-                 $products->addConditionParam('category__id IN (' . implode(',', $request->get('categories', [])) . ')');
-             }
-             if ($request->get('search')) {
-                 $products->addConditionParam('title LIKE :search OR shortText LIKE :search OR description LIKE :search', ['search' => '%' . $request->get('search') . '%']);
-             }
-             if ($request->get('q')) {
-                 $products->addConditionParam('title LIKE :q OR shortText LIKE :q OR description LIKE :q', ['q' => '%' . $request->get('q') . '%']);
-             }
-             $products->setOrderKey(array_merge($orderKeyCategory, $orderKeyBrick, ['title']), false);
-         }
-         $returnArray = [
-             'products' => $products,
-             'categories' => $categories,
-         ];
-         if ($request->isXmlHttpRequest() && $request->get('ajax')) {
-             return $this->json([
-                 'success' => true,
-                 'html' => $this->render('includes/product/product-content.html.twig', $returnArray)->getContent(),
-             ]);
-         }
-         return $this->renderTemplate('product/overview.html.twig', $returnArray);
-     }
-     /**
-      *
-      * @param Request $request
-      *
-      * @return Response
-      */
-     public function detailAction(Request $request, Product $id): Response
-     {
-         $product = $id;
-         return $this->renderTemplate('product/detail.html.twig', [
-             'product' => $product,
-         ]);
-     }
- }
-