src/Controller/ProductController.php line 256

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace App\Controller;
  15. use App\Model\Product\Book;
  16. use App\Model\Product\Category;
  17. use App\Services\TMSService;
  18. use Pimcore\Model\DataObject\Discipline;
  19. use App\Model\Product\Course;
  20. use App\Model\Product\Module;
  21. use App\Services\SegmentTrackingHelperService;
  22. use App\Website\LinkGenerator\ProductLinkGenerator;
  23. use App\Website\Navigation\BreadcrumbHelperService;
  24. use Knp\Component\Pager\Pagination\SlidingPagination;
  25. use Knp\Component\Pager\PaginatorInterface;
  26. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  27. use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
  28. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\DefaultMysql;
  29. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ElasticSearch\AbstractElasticSearch;
  30. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
  31. use Pimcore\Config;
  32. use Pimcore\Model\DataObject\AbstractObject;
  33. use Pimcore\Model\DataObject\Concrete;
  34. use Pimcore\Model\DataObject\Data\UrlSlug;
  35. use Pimcore\Model\DataObject\FilterDefinition;
  36. use Pimcore\Model\DataObject\SuperCategory;
  37. use Pimcore\Model\Document;
  38. use Pimcore\Translation\Translator;
  39. use Pimcore\Twig\Extension\Templating\HeadTitle;
  40. use Pimcore\Twig\Extension\Templating\Placeholder;
  41. use Symfony\Component\HttpFoundation\JsonResponse;
  42. use Symfony\Component\HttpFoundation\Request;
  43. use Symfony\Component\HttpFoundation\Response;
  44. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  45. use Symfony\Component\Routing\Annotation\Route;
  46. class ProductController extends BaseController
  47. {
  48.     /**
  49.      * @param Request $request
  50.      * @param AbstractObject $object
  51.      * @param UrlSlug $t
  52.      * @return Response
  53.      */
  54.     public function productDetailSlugAction(Request $requestAbstractObject $objectUrlSlug $urlSlug)
  55.     {
  56.         return $this->forward('App\Controller\ProductController::detailAction', ['product' => $object]);
  57.     }
  58.     /**
  59.      * @param Request $request
  60.      * @param AbstractObject $object
  61.      * @param UrlSlug $urlSlug
  62.      * @return Response
  63.      */
  64.     public function disciplineListingSlugAction(Request $requestAbstractObject $objectUrlSlug $urlSlug)
  65.     {
  66.         return $this->forward('App\Controller\ProductController::listingAction', ['category' => $object'query' => $request->query->all(), 'singleDiscipline' => true]);
  67.     }
  68.     /**
  69.      * @Route("/training/{path}{productname}~p{product}", name="shop-detail", defaults={"path"=""}, requirements={"path"=".*?", "productname"="[\w-]+", "product"="\d+"})
  70.      *
  71.      * @param Request $request
  72.      * @param HeadTitle $headTitleHelper
  73.      * @param BreadcrumbHelperService $breadcrumbHelperService
  74.      * @param Factory $ecommerceFactory
  75.      * @param SegmentTrackingHelperService $segmentTrackingHelperService
  76.      * @param Concrete $product built-in parameter conversion, please see https://github.com/pimcore/pimcore/pull/5554
  77.      * @param ProductLinkGenerator $productLinkGenerator
  78.      *
  79.      * @return Response
  80.      *
  81.      * @throws \Exception
  82.      */
  83.     public function detailAction(
  84.         Request $request,
  85.         HeadTitle $headTitleHelper,
  86.         BreadcrumbHelperService $breadcrumbHelperService,
  87.         Factory $ecommerceFactory,
  88.         SegmentTrackingHelperService $segmentTrackingHelperService,
  89.         Concrete $product,
  90.         ProductLinkGenerator $productLinkGenerator,
  91.         TMSService $tmsService
  92.     ) {
  93.         if (!($product && ($product->isPublished() && ($product instanceof Book || $product instanceof Module || $product instanceof Course) || $this->verifyPreviewRequest($request$product)))) {
  94.             throw new NotFoundHttpException('Product not found.');
  95.         }
  96.         //redirect to main url
  97.         $generatorUrl $productLinkGenerator->generate($product);
  98.         if ($generatorUrl != $request->getPathInfo()) {
  99.             $queryString $request->getQueryString();
  100.             return $this->redirect($generatorUrl . ($queryString '?' $queryString ''));
  101.         }
  102.         // $breadcrumbHelperService->enrichProductDetailPage($product);
  103.         $headTitleHelper($product->getOSName());
  104.         $paramBag $this->getAllParameters($request);
  105.         $paramBag['product'] = $product;
  106.         /* commmented temporarily
  107.         //track segments for personalization
  108.         
  109.         */
  110.         if ($product instanceof Book) {
  111.             return $this->render('product/detail_book.html.twig'$paramBag);
  112.         } else if ($product instanceof Module) {
  113.             return $this->render('product/detail_module.html.twig'$paramBag);
  114.         } else if ($product instanceof Course) {
  115.             // $params
  116.             $paramBag['sessions'] = $this->getCourseSessions($product->getCourseID()); //$tmsService->courseSessions($product->getCourseID());
  117.             return $this->render('product/detail_course.html.twig'$paramBag);
  118.         }
  119.     }
  120.     /**
  121.      * @Route("/training/{path}{categoryname}~c{category}", name="shop-category", defaults={"path"=""}, requirements={"path"=".*?", "categoryname"="[\w-]+", "category"="\d+"})
  122.      *
  123.      * @param Request $request
  124.      * @param HeadTitle $headTitleHelper
  125.      * @param BreadcrumbHelperService $breadcrumbHelperService
  126.      * @param Factory $ecommerceFactory
  127.      * @param SegmentTrackingHelperService $segmentTrackingHelperService
  128.      * @param ListHelper $listHelper
  129.      *
  130.      * @return Response
  131.      */
  132.     public function listingAction(Request $requestHeadTitle $headTitleHelperBreadcrumbHelperService $breadcrumbHelperServiceFactory $ecommerceFactorySegmentTrackingHelperService $segmentTrackingHelperServiceListHelper $listHelperPaginatorInterface $paginatorDocument $document, array $query = [])
  133.     {
  134.         $params array_merge($request->query->all(), $request->attributes->all(), $query);
  135.         $params['singleDiscipline'] = isset($params['singleDiscipline']) ? true false;
  136.         $params['sorting'] = isset($params['sorting']) ? true false;
  137.         if ($params['singleDiscipline'] === false) {
  138.             $superCategoryList = new \Pimcore\Model\DataObject\SuperCategory\Listing();
  139.             $superCategoryList->setOrderKey('categoryName');
  140.             $superCategories $superCategoryList->load();
  141.             $i 0;
  142.             $superCatdata = [];
  143.             foreach ($superCategories as $superCat) {
  144.                 $disciplinesList = new \Pimcore\Model\DataObject\Discipline\Listing();
  145.                 $disciplinesList->setCondition("superCategory like '%" $superCat->getId() . ",%'");
  146.                 $superCatId "k_" $superCat->getId();
  147.                 foreach ($disciplinesList as $discipline) {
  148.                     $superCatdata[$superCatId][] = $discipline->getId();
  149.                 }
  150.                 $i++;
  151.             }
  152.             $params['superCatJs'] = $superCatdata;
  153.         }
  154.         $disciplineId NULL;
  155.         $category NULL;
  156.         //needed to make sure category filter filters for active category
  157.         $params['parentCategoryIds'] = $params['category'] ?? null;
  158.         /*
  159.         if(isset($params['category'])) {
  160.             $category = Discipline::getById($params['category'] ?? null);
  161.             $params['category'] = $category;
  162.         }else if(isset($params['category-slug'])) {
  163.             */
  164.         if (isset($params['category'])) {
  165.             $category Discipline::getById($params['category']->getId() ?? null);
  166.             $disciplineId $params['category']->getId();
  167.             $params['category'] = $category;
  168.         }
  169.         if ($category) {
  170.             $headTitleHelper($category->getDisciplineName());
  171.             // $breadcrumbHelperService->enrichCategoryPage($category);
  172.         }
  173.         //setting assortment tenant
  174.         $environment $ecommerceFactory->getEnvironment();
  175.         $environment->setCurrentAssortmentTenant("training");
  176.         $indexService $ecommerceFactory->getIndexService();
  177.         $productListing $indexService->getProductListForCurrentTenant();
  178.         $productListing->setVariantMode(ProductListInterface::VARIANT_MODE_INCLUDE);
  179.         $params['sortingType'] = isset($request->attributes->all()['query']['sorting']) ? $request->attributes->all()['query']['sorting']: null;
  180.         if ($params['sorting']) {
  181.             if ($request->get('sorting') == 'title_asc' || $params['sortingType'] == 'title_asc') {
  182.                 $productListing->setOrderKey("name");
  183.                 $productListing->setOrder("asc");
  184.             }
  185.             if ($request->get('sorting') == 'title_desc' || $params['sortingType'] == 'title_desc') {
  186.                 $productListing->setOrderKey("name");
  187.                 $productListing->setOrder("desc");
  188.             }
  189.             if ($request->get('sorting') == 'discipline_asc' || $params['sortingType'] == 'discipline_asc') {
  190.                 $productListing->setOrderKey("primary_discipline_name");
  191.                 $productListing->setOrder("asc");
  192.             }
  193.             if ($request->get('sorting') == 'discipline_desc' || $params['sortingType'] == 'discipline_desc') {
  194.                 $productListing->setOrderKey("primary_discipline_name");
  195.                 $productListing->setOrder("desc");
  196.             }
  197.         } else {
  198.             $productListing->setOrderKey("name");
  199.             $productListing->setOrder("asc");
  200.         }
  201.         $params['productListing'] = $productListing;
  202.         // load current filter
  203.         if ($category) {
  204.             $filterDefinition $category->getFilterdefinition();
  205.             //track segments for personalization
  206.             /*$segmentTrackingHelperService->trackSegmentsForCategory($category);
  207.             $trackingManager = $ecommerceFactory->getTrackingManager();
  208.             $trackingManager->trackCategoryPageView($category->getName(), null);
  209.             */
  210.         }
  211.         if ($request->get('filterdefinition') instanceof FilterDefinition) {
  212.             $filterDefinition $request->get('filterdefinition');
  213.         }else if($document->getProperty('filter_definition')){
  214.             $filterDefinition $document->getProperty('filter_definition');
  215.         }
  216.         if (empty($filterDefinition)) {
  217.             $filterDefinition Config::getWebsiteConfig()->get('fallbackFilterdefinition');
  218.         }
  219.         $filterService $ecommerceFactory->getFilterService();
  220.         $listHelper->setupProductList($filterDefinition$productListing$params$filterServicetrue);
  221.         $params['filterService'] = $filterService;
  222.         $params['filterDefinition'] = $filterDefinition;
  223.         /** @var SlidingPagination $paginator */
  224.         // init pagination
  225.         $paginator $paginator->paginate(
  226.             $productListing,
  227.             $page $request->get('page') ? $request->get('page'1) : (isset($params['page']) ? $params['page'] : 1),
  228.             $filterDefinition->getPageLimit()
  229.         );
  230.         $params['results'] = $paginator;
  231.         $params['paginationVariables'] = $paginator->getPaginationData();
  232.         $params['showFilters'] = true;
  233.         if ($request->attributes->get('noLayout')) {
  234.             return $this->render('product/listing_content.html.twig'$params);
  235.         }
  236.         // track product impressions
  237.         $trackingManager $ecommerceFactory->getTrackingManager();
  238.         foreach ($paginator as $product) {
  239.             // $trackingManager->trackProductImpression($product, 'grid');
  240.         }
  241.         return $this->render('product/listing.html.twig'$params);
  242.     }
  243.     /**
  244.      * @Route("/training/scheduled", name="shop-scheduled-category", defaults={"path"=""}, requirements={"path"=".*?", "categoryname"="[\w-]+", "category"="\d+"})
  245.      *
  246.      * @param Request $request
  247.      * @param HeadTitle $headTitleHelper
  248.      * @param BreadcrumbHelperService $breadcrumbHelperService
  249.      * @param Factory $ecommerceFactory
  250.      * @param SegmentTrackingHelperService $segmentTrackingHelperService
  251.      * @param ListHelper $listHelper
  252.      *
  253.      * @return Response
  254.      */
  255.     public function listingScheduledAction(Request $request)
  256.     {
  257.         return $this->render('product/scheduled.html.twig');
  258.     }
  259.     /**
  260.      * @param Request $request
  261.      * @param Factory $ecommerceFactory
  262.      *
  263.      * @return Response
  264.      */
  265.     public function productTeaserAction(Request $requestFactory $ecommerceFactory)
  266.     {
  267.         $paramsBag = [];
  268.         if ($request->get('type') == 'object') {
  269.             AbstractObject::setGetInheritedValues(true);
  270.             $product AbstractProduct::getById($request->get('id'));
  271.             $paramsBag['product'] = $product;
  272.             //track product impression
  273.             $trackingManager $ecommerceFactory->getTrackingManager();
  274.             $trackingManager->trackProductImpression($product'teaser');
  275.             return $this->render('product/product_teaser.html.twig'$paramsBag);
  276.         }
  277.         throw new NotFoundHttpException('Product not found.');
  278.     }
  279.     /**
  280.      * @Route("/search", name="search")
  281.      *
  282.      * @param Request $request
  283.      * @param ListHelper $listHelper
  284.      * @param Factory $ecommerceFactory
  285.      * @param ProductLinkGenerator $productLinkGenerator
  286.      * @param Translator $translator
  287.      * @param BreadcrumbHelperService $breadcrumbHelperService
  288.      * @param HeadTitle $headTitleHelper
  289.      * @param Placeholder $placeholder
  290.      *
  291.      * @return Response|JsonResponse
  292.      */
  293.     public function searchAction(Request $requestListHelper $listHelperFactory $ecommerceFactoryProductLinkGenerator $productLinkGeneratorTranslator $translatorBreadcrumbHelperService $breadcrumbHelperServiceHeadTitle $headTitleHelperPlaceholder $placeholderPaginatorInterface $paginator)
  294.     {
  295.         // dummy results for api
  296.         return new JsonResponse(['items' => [
  297.             [
  298.                 'id' => 2910,
  299.                 'title' => 'Advanced Decision Analysis with Portfolio and Project Modeling - ADA',
  300.                 'type' => 'Course',
  301.                 'link' => 'https://petrox1.pimcore.dev/en/training/courses/advanced-decision-analysis-with-portfolio-and-project-modeling---ada~p2910'
  302.             ],
  303.             [
  304.                 'id' => 1168,
  305.                 'title' => 'Applied Water Technology',
  306.                 'type' => 'Book',
  307.                 'link' => 'https://petrox1.pimcore.dev/en/training/books/applied-water-technology~p1168'
  308.             ],
  309.             [
  310.                 'id' => 2500,
  311.                 'title' => 'Amplitude vs Offset Core',
  312.                 'type' => 'Module',
  313.                 'link' => 'https://petrox1.pimcore.dev/en/training/modules/amplitude-vs-offset-core~p2500'
  314.             ]
  315.         ]]);
  316.         $params $request->query->all();
  317.         $environment $ecommerceFactory->getEnvironment();
  318.         $environment->setCurrentAssortmentTenant("ElasticSearch");
  319.         $list \Pimcore\Bundle\EcommerceFrameworkBundle\Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();
  320.         // $list->addCondition("OSName = 'acid'", 'name');
  321.         // $list->addRelationCondition('category', "dest IN (1024,1025,1026)");
  322.         // $list->setOrder("ASC");
  323.         // $list->setOrderKey('name');
  324.         $list->load();
  325.         $indexService $ecommerceFactory->getIndexService();
  326.         $productListing $indexService->getProductListForCurrentTenant();
  327.         $productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
  328.         $term strip_tags($request->get('term'));
  329.         if ($productListing instanceof AbstractElasticSearch) {
  330.             $query = [
  331.                 'function_score' => [
  332.                     'query' => [
  333.                         'multi_match' => [
  334.                             "query" => $term,
  335.                             "type" => "cross_fields",
  336.                             "operator" => "and",
  337.                             "fields" => [
  338.                                 "attributes.name^2",
  339.                             ]
  340.                         ]
  341.                     ],
  342.                     'functions' => [
  343.                         [
  344.                             'filter' => ['match' => ['system.o_classId' => 16]],
  345.                             'weight' => 1
  346.                         ],
  347.                         [
  348.                             'filter' => ['match' => ['system.o_classId' => 17]],
  349.                             'weight' => 2
  350.                         ],
  351.                         [
  352.                             'filter' => ['match' => ['system.o_classId' => 10]],
  353.                             'weight' => 3
  354.                         ]
  355.                     ],
  356.                     'boost_mode' => 'multiply'
  357.                 ]
  358.             ];
  359.             $productListing->addQueryCondition($query'name');
  360.         } else {
  361.             //default mysql search query condition - would also work for elastic search in that way
  362.             $term trim(preg_replace('/\s+/'' '$term));
  363.             if (!empty($term)) {
  364.                 foreach (explode(' '$term) as $t) {
  365.                     $productListing->addQueryCondition($t);
  366.                 }
  367.             }
  368.         }
  369.         if (isset($params['autocomplete'])) {
  370.             $resultset = [];
  371.             $productListing->setLimit(10);
  372.             foreach ($productListing as $product) {
  373.                 $result['href'] = $productLinkGenerator->generateWithMockup($product, []);
  374.                 if ($product instanceof Car) {
  375.                     $result['product'] = $product->getOSName() . ' ' $product->getOSPrice()[0] . ', ' $product->getClassName();
  376.                 } else {
  377.                     $result['product'] = $product->getOSName();
  378.                 }
  379.                 $resultset[] = $result;
  380.             }
  381.             return new JsonResponse([$params$resultset]);
  382.             return $this->json($resultset);
  383.         }
  384.         $filterDefinition $params['filterDefinition'] = Config::getWebsiteConfig()->get('fallbackFilterdefinition');
  385.         // create and init filter service
  386.         $filterService Factory::getInstance()->getFilterService();
  387.         $listHelper->setupProductList($filterDefinition$productListing$params$filterServicetrue);
  388.         $params['filterService'] = $filterService;
  389.         $params['products'] = $productListing;
  390.         // init pagination
  391.         $paginator $paginator->paginate(
  392.             $productListing,
  393.             $request->get('page'1),
  394.             $filterDefinition->getPageLimit()
  395.         );
  396.         $params['results'] = $paginator;
  397.         $params['paginationVariables'] = $paginator->getPaginationData();
  398.         $trackingManager $ecommerceFactory->getTrackingManager();
  399.         foreach ($paginator as $product) {
  400.             $trackingManager->trackProductImpression($product'search-results');
  401.         }
  402.         //breadcrumbs
  403.         $placeholder('addBreadcrumb')->append([
  404.             'parentId' => $this->document->getId(),
  405.             'id' => 'search-result',
  406.             'label' => $translator->trans('shop.search-result', [$term])
  407.         ]);
  408.         $params['language'] = $request->getLocale();
  409.         $params['term'] = $term;
  410.         $breadcrumbHelperService->enrichGenericDynamicPage($translator->trans('shop.search-result', [$term]));
  411.         $headTitleHelper($translator->trans('shop.search-result', [$term]));
  412.         return $this->render('product/search.html.twig'$params);
  413.     }
  414.     public function promoAd()
  415.     {
  416.         $document \Pimcore\Model\Document::getById(282);
  417.         if ($document) {
  418.             $promotitle $document->getEditable('promotitle');
  419.             $promoadimage $document->getEditable('promoadimage');
  420.             $promodescription $document->getEditable('promodescription');
  421.             $promolink $document->getEditable('promolink');
  422.             return ['promotitle' => $promotitle'promoadimage' => $promoadimage'promodescription' => $promodescription'promolink' => $promolink];
  423.         }
  424.     }
  425.     protected function getJsonTMSData()
  426.     {
  427.         // $posterList = file_get_contents($request->getSchemeAndHttpHost().'/tms-session.json');
  428.         // $json = json_decode($posterList, true);
  429.         // return $json;
  430.     }
  431.     /**
  432.      * @Route("/courses/scheduled", name="course-scheduled")
  433.      */
  434.     public function courseScheduledAction(Request $request)
  435.     {   
  436.         $file PIMCORE_PROJECT_ROOT '/public/tms-session.json';
  437.         $posterList file_get_contents($file);
  438.         $json json_decode($posterListtrue);
  439.         return new JsonResponse([ 'courses' => $json ]);
  440.     }
  441.     public function getCourseSessions($courseId=null)
  442.     {
  443.         $sessions = [];
  444.         if($courseId){
  445.             $file PIMCORE_PROJECT_ROOT '/tms-session.json';
  446.             $posterList file_get_contents($file);
  447.             $json json_decode($posterListtrue);
  448.             foreach ($json['sessionData'] as $session) {
  449.                 if($session['CourseID'] == $courseId){
  450.                     $sessions[] = $session;
  451.                 }
  452.             }
  453.         }
  454.         return $sessions;
  455.     }
  456. }