<?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,
]);
}
}