<?php
namespace App\Controller;
use App\Services\DeliveryProgramService;
use App\Tools\IndexHelper;
use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\DefaultMysql;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
use Pimcore\Config;
use Pimcore\Model\DataObject\FilterDefinition;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class DeliveryProgramController extends AbstractController
{
protected const MAX_CACHE_TRIES = 3;
/**
* @param Request $request
* @param DeliveryProgramService $deliveryProgramService
* @param Factory $factory
* @param ListHelper $listHelper
* @return JsonResponse|Response
* @throws \Exception
*/
public function overviewAction(Request $request, DeliveryProgramService $deliveryProgramService, Factory $factory, ListHelper $listHelper)
{
$result = [];
if ($this->editmode) {
return $this->render('deliveryProgram/overview.html.twig', ['result' => $result]);
}
$language = $request->getLocale();
$country = $this->getDocumentEditable('select', 'deliveryCountry')->getData() ?: $language;
$params = array_merge($request->query->all(), $request->request->all());
// check for filterDefinition
$filterDefinition = $this->getDocumentEditable('relation', 'filterDefinition')->getElement();
if (!$filterDefinition instanceof FilterDefinition) {
$filterDefinition = Config::getWebsiteConfig()->deliveryProgramFallbackFilterdefinition;
}
$filterDefinitionId = $filterDefinition?->getId();
$filterParams = array_filter($params, static function ($value, $key) {
return !in_array($key, ['ajax', 'baseUrl', 'noCache', 'debug']) && (!is_array($value) || array_filter($value));
}, ARRAY_FILTER_USE_BOTH);
$filterService = $factory->getFilterService();
if (!empty($filterParams) || $request->get('noCache', false)) {
$products = [];
$productList = $factory->getIndexService()->getProductListForCurrentTenant();
$productList->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
$productList->addCondition(IndexHelper::INDEX_O_CLASS_ID . ' = "Product"');
$listHelper->setupProductList($filterDefinition, $productList, $filterParams, $filterService, true);
if ($productList instanceof DefaultMysql) {
$products = $productList->getProducts();
}
$json = $deliveryProgramService->productToJson($products, $language, $country);
$json = $deliveryProgramService->refactorJsonStructure($json);
$result = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
$returnArray = [
'result' => $result,
'filterDefinition' => $filterDefinition,
'filterService' => $filterService,
'productListing' => $productList,
'currentFilter' => $filterParams['currentFilter']
];
if ($request->isXmlHttpRequest() && $request->get('ajax')) {
return $this->json([
'success' => true,
'html' => $this->renderView('deliveryProgram/table.html.twig', $returnArray)
]);
}
return $this->render('deliveryProgram/overview.html.twig', $returnArray);
}
$try = 1;
$cacheFile = DeliveryProgramService::CACHE_FILE_DIR . "deliveryProgram-$filterDefinitionId-$language-$country.json";
while (!file_exists($cacheFile) && $try <= self::MAX_CACHE_TRIES) {
// if not, generate new json and check again
$deliveryProgramService->buildCacheFile($filterDefinition, $language, $country);
$try++;
}
// check if cache file exists
if (file_exists($cacheFile)) {
$json = file_get_contents($cacheFile);
$productList = $factory->getIndexService()->getProductListForCurrentTenant();
$productList->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
$productList->addCondition(IndexHelper::INDEX_O_CLASS_ID . ' = "Product"');
$listHelper->setupProductList($filterDefinition, $productList, $params, $filterService, true);
$returnArray = [
'result' => json_decode($json, true, 512, JSON_THROW_ON_ERROR),
'filterDefinition' => $filterDefinition,
'filterService' => $filterService,
'productListing' => $productList,
'currentFilter' => $params['currentFilter']
];
if ($request->get('ajax')) {
return $this->json([
'success' => true,
'html' => $this->renderView('deliveryProgram/table.html.twig', $returnArray)
]);
}
return $this->render('deliveryProgram/overview.html.twig', $returnArray);
}
return $this->render('deliveryProgram/overview.html.twig', ['result' => $result]);
}
}