src/Controller/DeliveryProgramController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Services\DeliveryProgramService;
  4. use App\Tools\IndexHelper;
  5. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  6. use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
  7. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\DefaultMysql;
  8. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
  9. use Pimcore\Config;
  10. use Pimcore\Model\DataObject\FilterDefinition;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. class DeliveryProgramController extends AbstractController
  15. {
  16.     protected const MAX_CACHE_TRIES 3;
  17.     /**
  18.      * @param Request $request
  19.      * @param DeliveryProgramService $deliveryProgramService
  20.      * @param Factory $factory
  21.      * @param ListHelper $listHelper
  22.      * @return JsonResponse|Response
  23.      * @throws \Exception
  24.      */
  25.     public function overviewAction(Request $requestDeliveryProgramService $deliveryProgramServiceFactory $factoryListHelper $listHelper)
  26.     {
  27.         $result = [];
  28.         if ($this->editmode) {
  29.             return $this->render('deliveryProgram/overview.html.twig', ['result' => $result]);
  30.         }
  31.         $language $request->getLocale();
  32.         $country $this->getDocumentEditable('select''deliveryCountry')->getData() ?: $language;
  33.         $params array_merge($request->query->all(), $request->request->all());
  34.         // check for filterDefinition
  35.         $filterDefinition $this->getDocumentEditable('relation''filterDefinition')->getElement();
  36.         if (!$filterDefinition instanceof FilterDefinition) {
  37.             $filterDefinition Config::getWebsiteConfig()->deliveryProgramFallbackFilterdefinition;
  38.         }
  39.         $filterDefinitionId $filterDefinition?->getId();
  40.         $filterParams array_filter($params, static function ($value$key) {
  41.             return !in_array($key, ['ajax''baseUrl''noCache''debug']) && (!is_array($value) || array_filter($value));
  42.         }, ARRAY_FILTER_USE_BOTH);
  43.         $filterService $factory->getFilterService();
  44.         if (!empty($filterParams) || $request->get('noCache'false)) {
  45.             $products = [];
  46.             $productList $factory->getIndexService()->getProductListForCurrentTenant();
  47.             $productList->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
  48.             $productList->addCondition(IndexHelper::INDEX_O_CLASS_ID ' = "Product"');
  49.             $listHelper->setupProductList($filterDefinition$productList$filterParams$filterServicetrue);
  50.             if ($productList instanceof DefaultMysql) {
  51.                 $products $productList->getProducts();
  52.             }
  53.             $json $deliveryProgramService->productToJson($products$language$country);
  54.             $json $deliveryProgramService->refactorJsonStructure($json);
  55.             $result json_decode($jsontrue512JSON_THROW_ON_ERROR);
  56.             $returnArray = [
  57.                 'result' => $result,
  58.                 'filterDefinition' => $filterDefinition,
  59.                 'filterService' => $filterService,
  60.                 'productListing' => $productList,
  61.                 'currentFilter' => $filterParams['currentFilter']
  62.             ];
  63.             if ($request->isXmlHttpRequest() && $request->get('ajax')) {
  64.                 return $this->json([
  65.                     'success' => true,
  66.                     'html' => $this->renderView('deliveryProgram/table.html.twig'$returnArray)
  67.                 ]);
  68.             }
  69.             return $this->render('deliveryProgram/overview.html.twig'$returnArray);
  70.         }
  71.         $try 1;
  72.         $cacheFile DeliveryProgramService::CACHE_FILE_DIR "deliveryProgram-$filterDefinitionId-$language-$country.json";
  73.         while (!file_exists($cacheFile) && $try <= self::MAX_CACHE_TRIES) {
  74.             // if not, generate new json and check again
  75.             $deliveryProgramService->buildCacheFile($filterDefinition$language$country);
  76.             $try++;
  77.         }
  78.         // check if cache file exists
  79.         if (file_exists($cacheFile)) {
  80.             $json file_get_contents($cacheFile);
  81.             $productList $factory->getIndexService()->getProductListForCurrentTenant();
  82.             $productList->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
  83.             $productList->addCondition(IndexHelper::INDEX_O_CLASS_ID ' = "Product"');
  84.             $listHelper->setupProductList($filterDefinition$productList$params$filterServicetrue);
  85.             $returnArray = [
  86.                 'result' => json_decode($jsontrue512JSON_THROW_ON_ERROR),
  87.                 'filterDefinition' => $filterDefinition,
  88.                 'filterService' => $filterService,
  89.                 'productListing' => $productList,
  90.                 'currentFilter' => $params['currentFilter']
  91.             ];
  92.             if ($request->get('ajax')) {
  93.                 return $this->json([
  94.                     'success' => true,
  95.                     'html' => $this->renderView('deliveryProgram/table.html.twig'$returnArray)
  96.                 ]);
  97.             }
  98.             return $this->render('deliveryProgram/overview.html.twig'$returnArray);
  99.         }
  100.         return $this->render('deliveryProgram/overview.html.twig', ['result' => $result]);
  101.     }
  102. }