custom/plugins/econdCrossSelll/src/Storefront/Controller/econdCrossSellController.php line 53

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Ecd\econdCrossSelll\Storefront\Controller;
  3. use Shopware\Core\Content\Product\Exception\ProductNotFoundException;
  4. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  5. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  6. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  7. use Shopware\Core\System\SystemConfig\SystemConfigService;
  8. use Shopware\Storefront\Controller\StorefrontController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  16. class econdCrossSellController extends StorefrontController
  17. {
  18.     public const QUICKVIEW_ROUTE 'frontend.cms.crosssell';
  19.     /**
  20.      * @var SystemConfigService
  21.      */
  22.     private $systemConfigService;
  23.     /**
  24.      * @var SalesChannelRepositoryInterface
  25.      */
  26.     private $productRepository;
  27.     /**
  28.      * econdCrossSelll constructor.
  29.      * @param SalesChannelRepositoryInterface $productRepository
  30.      * @param SystemConfigService $systemConfigService
  31.      */
  32.     public function __construct(
  33.         SystemConfigService $systemConfigService,
  34.         SalesChannelRepositoryInterface $productRepository
  35. )
  36.     {
  37.         $this->systemConfigService $systemConfigService;
  38.         $this->productRepository $productRepository;
  39.     }
  40.     /**
  41.      * @RouteScope(scopes={"storefront"})
  42.      * @Route("/econdacrosssell/", name="frontend.cms.crosssell", options={"seo"=true}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  43.      * @return JsonResponse
  44.      */
  45.     public function index(SalesChannelContext $contextRequest $request) : Response
  46.     {
  47.         
  48.         $ec_datas = (array)json_decode(base64_decode($request->get('ec_data')));
  49.         $cs_responses = [];
  50.         foreach ($ec_datas as $key => $ec_data) {
  51.             $contextPid 'na';
  52.             $ec_data = (array)$ec_data;
  53.             $econdaRecoParams = (array)$ec_data["econdaRecoParams"];
  54.             $location $ec_data['location'];
  55.             $econdaRecoParams['categoryPath'] = $this->createCategoryPath($ec_data['categories']);
  56.             if(isset($ec_data['productid']) && $ec_data['productid'] != "") {
  57.                 $econdaRecoParams['productid'] = $ec_data['productid'];
  58.                 $contextPid $ec_data['productid'];
  59.             }
  60.             $items $this->sendRequestToCrossSell($econdaRecoParams);
  61.             
  62.             if ($items !== false) {
  63.                 $wid $econdaRecoParams["wid"];
  64.                 $products $this->loadProducts($items['items'], $context);
  65.                 $emcsParams $this->generateEmcsParams($location$products$wid,$contextPid$items['items']);
  66.                 $cs_responses['widgetDetails'] = $items['widgetdetails'];
  67.                 $cs_responses['csConfig'] = (array)json_decode(base64_decode($ec_data['csConfig']));
  68.                 $cs_responses['elementType'] = $ec_data['elementType'];
  69.                 $cs_responses['products'] = $products;
  70.                 $cs_responses['emcsParams'] = $emcsParams;
  71.                 return $this->renderStorefront('@Storefront/storefront/block/cms-block-econda-cross-sell.html.twig', [
  72.                     'cs_response' => $cs_responses,
  73.                     'ecFlag' => 'true',
  74.                     'ecmsParams' => $emcsParams
  75.                 ]);
  76.             }else {
  77.                 $cs_responses['failure'] = false;
  78.                 return $this->renderStorefront('@Storefront/storefront/block/cms-block-econda-cross-sell.html.twig', [
  79.                     'cs_response' => $cs_responses,
  80.                     'ecFlag' => 'true'
  81.                 ]);
  82.             }
  83.         }
  84.     }
  85.     public function createCategoryPath($categories)
  86.     {
  87.         $categories = (array)json_decode($categories);
  88.         $categoryPath '';
  89.         $lastCategory end($categories);
  90.         foreach ($categories as $category) {
  91.             if ($lastCategory !== $category) {
  92.                 $categoryPath .= $category '^^';
  93.             }else {
  94.                 $categoryPath .= $category;
  95.             }
  96.         }
  97.         return $categoryPath;
  98.     }
  99.     /**
  100.      * Prepares the URL and sends a server side GET request to the CrossSell servers and returns the response as an array
  101.      *
  102.      * @param $params - values from js sdk
  103.      * @return array
  104.      */
  105.     public function sendRequestToCrossSell($params)
  106.     {
  107.         if (!array_key_exists('aid'$params)) {
  108.             return false;
  109.         }
  110.         $urlParams '';
  111.         $url 'http://widgets.crosssell.info/eps/crosssell/recommendations/' $params['aid'] . '.do?';
  112.         foreach ($params as $key => $param) {
  113.             if ($key == 'data' ||
  114.                 $key == 'currentUrl' ||
  115.                 $key == 'timestamp' ||
  116.                 $key == 'csConfig' ||
  117.                 $key == 'elementType') {
  118.                 continue;
  119.             }
  120.             if (is_array($param) && empty($param)) {
  121.                 continue;
  122.             }
  123.             if ($key == 'widgetdetails') {
  124.                 $urlParams .= $key '=true&';
  125.                 continue;
  126.             }
  127.             if($key == 'categoryPath') {
  128.                 $urlParams .= 'ctxcat.ct=productcategory&ctxcat.pas=' urlencode($param) . '&ctxcat.pdl=%5E%5E&';
  129.                 continue;
  130.             }
  131.             if($key == 'productid' && $param != "") {
  132.                 $urlParams .= 'pid=sku%3A' urlencode($param) . '&';
  133.                 continue;
  134.             } elseif($key == 'productid') {
  135.                 continue;
  136.             }
  137.             $urlParams .= $key '=' urlencode(strval($param)) . '&';
  138.         }
  139.         $urlParams .= 'timestamp=' urlencode(strval($params['timestamp']));
  140.         $url .= $urlParams;
  141.         if(strpos($_SERVER["HTTP_REFERER"],"ec_csdebug=true") ) {
  142.             echo '<p hidden class="csdebug">' urldecode($url) . '</p>';
  143.             echo '<p hidden class="csdebug">' $url '</p>';
  144.         }
  145.         
  146.         $json file_get_contents($url);
  147.         return (array)json_decode($json);
  148.     }
  149.     public function loadProducts($itemsSalesChannelContext $context)
  150.      {
  151.         $productIds = [];
  152.         foreach($items as $item) {
  153.             if (isset($item->uuid)) {
  154.                 array_push($productIds$item->uuid);
  155.             }
  156.             else if (isset($item -> id)) {
  157.                 array_push($productIds$item->id);
  158.             }
  159.         }
  160.         $products $this->productRepository->search(
  161.              (new Criteria$productIds)), $context);
  162.         return $products->getEntities()->getElements();
  163.     }
  164.     /**
  165.      * @param $location string
  166.      * @param $products array
  167.      */
  168.     public function generateEmcsParams($location$products$wid$contextPid$items)
  169.     {
  170.         $ecmsParams = [];
  171.         if($location === '/') {
  172.             $location 'Startseite';
  173.         }
  174.         /**
  175.          * @var $product SalesChannelProductEntity
  176.          */
  177.         foreach ($products as $product){
  178.             $emcs3 $this->getEcPid($product$items);
  179.             $ecmsParams[$product->getId()] =
  180.                 '?emcs0=' $wid .
  181.                 '&emcs1=' $location  .
  182.                 '&emcs2=' $contextPid .
  183.                 '&emcs3=' $emcs3;
  184.         }
  185.         return $ecmsParams;
  186.     }
  187.     public function getEcPid($product$items) {
  188.         foreach($items as $item) {
  189.             if ($item->id == $product->getId()) {
  190.                 if (isset($item->pid) && $item->pid != "") {
  191.                     return $item->pid;
  192.                 } else {
  193.                     return $product->getProductNumber();
  194.                 }
  195.             }
  196.         }
  197.     }
  198. }