src/Controller/ShopController.php line 100

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Pimcore\Controller\FrontendController;
  4. use App\Ecommerce\Tool\RecentlyViewedProducts;
  5. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  6. use Pimcore\Mail;
  7. use Pimcore\Model\DataObject\AvailabilityCountry;
  8. use Pimcore\Model\DataObject;
  9. use Pimcore\Http\RequestHelper;
  10. use Pimcore\Model\Search\Backend\Data;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use OutputDataConfigToolkitBundle\Service;
  13. use Carbon\Carbon;
  14. use Zend\Paginator\Paginator;
  15. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  16. // New way (using constructor injection)
  17. use Symfony\Component\DependencyInjection\ContainerInterface;
  18. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
  19. use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
  20. use App\Model\DataObject\CategoryAlcoholType;
  21. use Knp\Component\Pager\PaginatorInterface;
  22. use Pimcore\Twig\Extension\Templating\Placeholder;
  23. // class ShopController extends \Website\Controller\Action
  24. //class ShopController extends FrontendController
  25. class ShopController extends Action
  26. {
  27.    
  28.     public function onKernelController(FilterControllerEvent $event)
  29.     {
  30.         $this->view->preview $event->getRequest()->get('pimcore_preview');
  31.         parent::onKernelController($event);
  32.         $this->view->category DataObject\CategoryAlcoholType::getById($event->getRequest()->get('category'));
  33.     }
  34.     /**
  35.      * show product landing
  36.      */
  37.     public function brandListAction(Request $request)
  38.     {
  39.         //Set the layout and CSS Class
  40.         $params = [];
  41.         $params['language'] = $this->language;
  42.         $params['CssClass'] = "brand-page";
  43.         $params['locale'] = strtolower($request->getLocale());
  44.         $params['params'] = $request->request->all();
  45.         $params['preview'] = $request->get('pimcore_preview',null);
  46.         //$this->layout()->setLayout('product');
  47.         //$this->enableLayout();
  48.         //Get All the BrandVariety 
  49.         
  50.         //$brandvariety->load();
  51.         // Set Us as default country
  52.         $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  53.         if(isset($this->country)){
  54.             $availableCountry $this->country;
  55.         }else{
  56.             $availableCountry $defaultCountry;
  57.             $params['country']  = $defaultCountry;
  58.         }
  59.         //List all brands
  60.         $filter = array();
  61.         $brands = new DataObject\CategoryAlcoholType\Listing();        
  62.         $params['brands'] = $brands;
  63.         $brands->setOrderKey("AlcoholType");
  64.         $brands->setOrder("ASC");
  65.         foreach ($brands as $brand) {
  66.             $brandvariety_local = new DataObject\BrandExtension\Listing();            
  67. //            $brandvariety_local->setCondition(" Category like '%," . $brand->getId() . ",%'");
  68.             if (count($brandvariety_local) > 0) {
  69.                 $brandname $brand->getAlcoholType();
  70.                 if (!empty($brandname)) {
  71.                     $firstCharacter strtoupper(substr($brandname01));
  72.                     $brandsSorted[$firstCharacter][] = $brand;
  73.                     if (!in_array($firstCharacter$filter)) {
  74.                         $filter[] = $firstCharacter;                        
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.         
  80.         sort($filter);
  81.         $params['filter'] = $filter;
  82.     $params['brandsSorted'] = $brandsSorted;
  83.         return $this->render('Shop/brandList.html.twig'$params);
  84.     }
  85.     /**
  86.      * show product landing
  87.      * @param Request $request
  88.      * @param ListHelper $listHelper
  89.      */
  90.     public function productLandingAction(Request $request,ListHelper $listHelper)
  91.     {        
  92.         $params = [];
  93.         $params['CssClass'] = "landing-page";
  94.         $params['locale'] = strtolower($request->getLocale());
  95.         $params['params'] = $request->request->all();
  96.         $params['preview'] = $request->get('pimcore_preview',null);
  97.         //$this->layout()->setLayout('product');
  98.         // Set Us as default country
  99.         $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  100.         if(isset($this->country)){
  101.             $availableCountry $this->country;
  102.         }else{
  103.             $availableCountry $defaultCountry;
  104.             $params['country'] = $defaultCountry;
  105.         }
  106.         $filterDefinition \Pimcore\Model\DataObject\FilterDefinition::getByPath("/filter-definitions/default"); // \Pimcore\Config::getWebsiteConfig()->fallbackFilterdefinition;
  107.         $params['filterDefinitionObject'] = $filterDefinition;
  108.         // create product list
  109.         $products =Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();
  110.         //$products->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
  111.         //$products->addRelationCondition('CountryAvailabilityList', "dest IN (" . $availableCountry->getId() . ")");
  112.         
  113.         $params['products'] = $products;
  114.         $params =  @array_merge($params,$request->query->all());
  115.         // create and init filter service
  116.         $filterService Factory::getInstance()->getFilterService();
  117.         $listHelper->setupProductList($filterDefinition$products$params,  $filterServicetrue);
  118.         $params['filterService'] = $filterService;
  119.         $params['valuesIndex'] = $this->getValueIndex($filterDefinition$products);
  120.         $params['subCategories'] = CategoryAlcoholType::getTopLevelCategories();       
  121.         return $this->render('Shop/productLanding.html.twig',$params);
  122. //        $this->enableLayout();
  123.     }
  124.     /**
  125.      * get product value indexing
  126.      * @return  array
  127.      */
  128.     private function getValueIndex($filterDefinitionObject$products){
  129.         $valuesIndex = array();
  130.         foreach ($filterDefinitionObject->getFilters() as $filter) {
  131.             $products->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);           
  132.             $rawValues $products->getGroupByValues("parentCategoryids"true);                   
  133.             foreach($rawValues as $v) {
  134.                 $values[$v['value']] = array('value' => $v['value'], "count" => $v['count']);
  135.             }
  136.             // resort values
  137.             
  138.             if ($values) {
  139.               foreach($values as $entry)
  140.               {
  141.                 $ids explode(",",$entry['value']);
  142.                   foreach ($ids as $id) {
  143.                     if (!empty($id)) {
  144.                       if (array_key_exists($id$valuesIndex)) {
  145.                         $valuesIndex$id ] += $entry['count'] ;
  146.                       } else {
  147.                         $valuesIndex$id ] = $entry['count'] ;
  148.                       }
  149.                     }
  150.                   } 
  151.               }
  152.             }
  153.         } 
  154.         return $valuesIndex;
  155.     }
  156.     /**
  157.      * show product list
  158.      */
  159.     public function listAction(Request $request,ListHelper $listHelperPaginatorInterface $paginatorPlaceholder $placeholderHelper)
  160.     {          
  161.         //$params = array_merge($request->query->all(), $request->attributes->all());
  162.         
  163.         
  164.         $params['lastlogin'] = '';
  165.         $params['locale'] = strtolower($request->getLocale());
  166.         $params['params'] = $request->request->all();
  167.         $params['preview'] = $request->get('pimcore_preview',null);
  168.         $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  169.         if(isset($this->country)){
  170.             $availableCountry $this->country;
  171.         }else{
  172.             $availableCountry $defaultCountry;
  173.             $params['country'] = $defaultCountry;
  174.         }
  175.         //TODO  We will handle after user login and session 
  176.         $session $request->getSession();
  177.         $authNamespace $session->getBag('espirit');
  178.         if ($authNamespace && $authNamespace->has('customeraccount')) {
  179.             $orders = new DataObject\OnlineShopOrder\Listing();
  180.             $orders->setCondition(" customer__id = '" $authNamespace->get('customeraccount')->getId() . "'");
  181.             $orders->setOrderKey("orderdate",false);
  182.             $orders->setOrder("desc");
  183.             $orders->setLimit(1);
  184.             $orders->load();
  185.             if (count($orders) > 0) {
  186.                 foreach ($orders as $order) {break;}
  187.                 $lastlogin $order->getOrderDate();
  188.                 $params['lastlogin'] = $lastlogin->getTimestamp();
  189.         } else {
  190.                 $lastlogin Carbon::now();
  191.                 $params['lastlogin'] = $lastlogin->getTimestamp();
  192.             }
  193.         }
  194.         //END TODO
  195.         //$this->layout()->setLayout('product');
  196.         $params['CssClass'] = "sub-category-page";
  197.         $params["parentCategoryIds"] = $request->get('category');
  198.         $params =  array_merge($params,$request->query->all());
  199.         
  200.         //$category = \Website\ShopCategory::getById($params['category']);
  201.         $category CategoryAlcoholType::getById($request->get('category'));
  202.         $params['category'] = $category;
  203.         if ($request->get("Brand")) {
  204.             $brand DataObject\Brand::getById($request->get('Brand'));
  205.             if ($brand) {
  206.                 $params['BrandName'] = $brand->getBrandName();
  207.             }
  208.         }
  209.         // load current filter
  210.         if($category) {
  211.             $filterDefinition $category->getFilterdefinition();
  212.         }
  213.         if($request->get("filterdefinition") instanceof \Pimcore\Model\DataObject\FilterDefinition) {
  214.             $filterDefinition $request->get("filterdefinition");
  215.             
  216.         }
  217.         if(empty($filterDefinition)) {
  218.             $filterDefinition \Pimcore\Config::getWebsiteConfig()->get('fallbackFilterdefinition');
  219.         }
  220.         
  221.         $params['filterDefinitionObject'] = $filterDefinition;
  222.         
  223.         // create product list
  224.         $products Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();
  225.         //$products->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
  226.         //$products->addCondition("is_default = 1");      
  227.        // $products->addRelationCondition('CountryAvailabilityList', "dest IN (" . $availableCountry->getId() . ")");    
  228.         
  229.         //search query
  230.         $query $request->get("search");
  231.         
  232.         if ($query) {
  233.             $query preg_replace('/[^A-Za-z0-9\-\ ]/'''$query);
  234.             //$products->addCondition("SearchData LIKE " . $products->quote("%" . $query . "%"));
  235.             $products->addCondition("MATCH (`searchData`) AGAINST (" $products->quote($query) . ")");
  236.             $params['search'] = $query;
  237.         }
  238.         // echo "<pre>"; print_r($products); die;
  239.         
  240.         $params['products'] = $products;
  241.         
  242.         // create and init filter service
  243.         $filterService Factory::getInstance()->getFilterService();
  244.         $listHelper->setupProductList($filterDefinition$products$params,  $filterServicetrue);
  245.         $params['filterService'] = $filterService;
  246.         $params['filterDefinition'] = $filterDefinition;
  247.         // init pagination
  248.         $paginator $paginator->paginate(
  249.             $products,
  250.             $request->get('page'1),
  251.             12
  252.         );
  253.         $params['paginator']  = $paginator;
  254.         $params['paginationVariables']  = $paginator->getPaginationData();;
  255.        // $this->enableLayout();
  256.         //breadcrumbs
  257.     
  258.         if($category) {
  259.             $parentCategories $category->getParentCategoryList(null$this->document);
  260.             $parentCategories[] = $category;
  261.             foreach($parentCategories as $parentCategory) {
  262.                 $placeholderHelper->__invoke('addBreadcrumb')->append([
  263.                     'parentId' => "category-" $parentCategory->getParentId(),
  264.                     'id' => "category-" $parentCategory->getId(),
  265.                     'url' => $parentCategory->getDetailUrl(["document" => $this->document]),
  266.                     'label' => $parentCategory->getName()
  267.                 ]);
  268.                
  269.             }
  270.             
  271.             //$headTitleHelper = \Pimcore::getContainer()->get('pimcore.templating.view_helper.head_title');
  272.             //$headTitleHelper($category->getName());
  273.         }
  274.         return $this->render('Shop/list.html.twig'$params);
  275.     }
  276.     /**
  277.      * show product detail page
  278.      * @throws Zend_Controller_Router_Exception
  279.      */
  280.     public function detailAction(Request $requestRequestHelper $requestHelper) {
  281.         //Set the product layout
  282.         //$this->layout()->setLayout('product');
  283.         $params = [];
  284.         $params['CssClass'] = "detail-page";
  285.         $params['locale'] = strtolower($request->getLocale());
  286.         $params['params'] = $request->request->all();
  287.         $params['preview'] = $request->get('pimcore_preview',null);
  288.         // Set Us as default country
  289.         
  290.         $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  291.         if(isset($this->country)){
  292.             $availableCountry $this->country;
  293.         }else{
  294.             $availableCountry $defaultCountry;
  295.             //$this->view->country = $defaultCountry;
  296.             $params['country'] = $defaultCountry;
  297.         }
  298.         //$this->enableLayout();
  299.         // load product
  300.         $product \App\Model\DataObject\BrandExtension::getById($request->get("product"));
  301.         if(!$product || (!$product->isActive() && !$requestHelper->isFrontendRequestByAdmin($request))) {
  302.             return $this->forward('error', ['error']);
  303.             //throw new Zend_Controller_Router_Exception("die gewünschte Seite existiert nicht mehr");
  304.         } else {
  305.             $params['product'] = $product;
  306.             
  307.             $categories $product->getCategory();//Pimcore\Model\Object\CategoryAlcoholType::getById($this->getParam("category"));
  308.             if ($categories) foreach ($categories as $category) {break;}
  309.             // ...
  310.             $params['specificationOutputChannel'] = Service::getOutputDataConfig($product"productdetail_specification");
  311.             $params['hasSpec'] = false;
  312.             
  313.             foreach($params['specificationOutputChannel'] as $x) {
  314.                 if($x->getLabeledValue($product)) {
  315.                     $params['hasSpec'] = true;
  316.                     break;
  317.                 }
  318.             }
  319.             //recently viewed products
  320.             $recently = new RecentlyViewedProductsFactory::getInstance()->getEnvironment(), function($id) {
  321.                 return DataObject\BrandExtension::getById($id);
  322.             });
  323.             /*
  324.             $sizeVariants = $product->getSizeVariants();
  325.             if(empty($sizeVariants)) {
  326.                 $linkProduct = $product;
  327.             } else {
  328.                 $tmp = array_values($sizeVariants);
  329.                 $linkProduct = array_shift($tmp);
  330.             }
  331.             $this->view->recentlyViewed = $recently->addProduct( $linkProduct )->getProducts(4);
  332.             */
  333.             
  334.             $filterdefinition null;
  335.             if($category) {
  336.                 $category $category->getObject();
  337.                 $filterdefinition $category->getFilterdefinition();
  338.             }
  339.             if(empty($filterdefinition)) {
  340.                 $filterdefinition \Pimcore\Config::getWebsiteConfig()->fallbackFilterdefinition;
  341.             }
  342.             $params['similarProducts'] = $this->getSimilarProducts($product$filterdefinition);
  343.             //breadcrumbs
  344.             $category $product->getFirstCategory();
  345.             $container \Pimcore::getKernel()->getContainer();
  346.             // $placeholder = $container->get('pimcore.templating.view_helper.placeholder');
  347.             // if($category) {
  348.             //     $parentCategories = $category->getParentCategoryList(null, $this->document);
  349.             //     $parentCategories[] = $category;
  350.             //     foreach($parentCategories as $index => $parentCategory) {
  351.             //         $placeholder('addBreadcrumb')->append([
  352.             //             'parentId' => "category-" . $parentCategory->getParentId()
  353.             //             , 'id' => "category-" . $parentCategory->getId()
  354.             //             , 'url' => $parentCategory->getDetailUrl(["document" => $this->document])
  355.             //             , 'label' => $parentCategory->getName()
  356.             //         ]);
  357.             //     }
  358.             // }
  359.             // $placeholder('addBreadcrumb')->append([
  360.             //     'parentId' => $category ? "category-" . $category->getParentId() : ""
  361.             //     , 'id' => "product-" . $product->getId()
  362.             //     , 'url' => $product->getDetailUrl(["document" => $this->document])
  363.             //     , 'label' => $product->getName()
  364.             // ]);
  365.             
  366.             // $headTitle = $container->get('pimcore.templating.view_helper.head_title');
  367.             // $headTitle($product->getName());
  368.             
  369.             
  370.             //$trackingManager = Factory::getInstance()->getTrackingManager();
  371.             //$trackingManager->trackProductView($product);
  372.             return $this->render('Shop/detail.html.twig',$params);
  373.         }
  374.     }
  375.     private function getSimilarProducts(DataObject\BrandExtension $product\Pimcore\Model\DataObject\FilterDefinition $filterDefinition null) {
  376.         if($filterDefinition) {
  377.             // Set Us as default country
  378.             $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  379.             if(isset($this->country)){
  380.                 $availableCountry $this->country;
  381.             }else{
  382.                 $availableCountry $defaultCountry;
  383.             }
  384.             $productList Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();;
  385.             $productList->setVariantMode(ProductListInterface::VARIANT_MODE_INCLUDE_PARENT_OBJECT);
  386.             $productList->addRelationCondition('CountryAvailabilityList'"dest IN (" $availableCountry->getId() . ")");
  387.             $similarityFields $filterDefinition->getSimilarityFields();
  388.             if($similarityFields) {
  389.                 $statement $productList->buildSimularityOrderBy($filterDefinition->getSimilarityFields(), $product->getId());
  390.             }
  391.             if(!empty($statement)) {
  392.                 $productList->setLimit(4);
  393.                 $productList->setOrder("ASC");
  394.                 $productList->addCondition("o_virtualProductId != " $product->internalGetBaseProduct()->getId(), "o_id");
  395.                 if($filterDefinition->getCrossSellingCategory()) {
  396.                     $productList->setCategory($filterDefinition->getCrossSellingCategory());
  397.                 }
  398.                 $productList->setOrderKey($statement);
  399.                 return $productList->load();
  400.             }
  401.         }
  402.         return array();
  403.     }
  404.     public function productCellAction(Request $request) {
  405.         if($request->get("type") == "object") {
  406.             $this->view->product Pimcore\Model\Object\Product::getById($request->get("id"));
  407.             $this->view->col $request->get("editmode") ? 12 3;
  408.             $this->view->view $this->view;
  409.         }
  410.         $this->renderScript('/product/list/product.php');
  411.     }
  412.     public function searchAction(Request $request) {
  413.         // Set Us as default country
  414.         $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  415.         if(isset($this->country)){
  416.             $availableCountry $this->country;
  417.         }else{
  418.             $availableCountry $defaultCountry;
  419.             $this->view->country $defaultCountry;
  420.         }
  421.         // $this->enableLayout();
  422.         $session $this->get('session');
  423.         $authNamespace $session->getBag('espirit');  
  424.         if ($authNamespace && $authNamespace->has('customeraccount')) {
  425.             $orders = new DataObject\OnlineShopOrder\Listing();
  426.             $orders->setCondition(" customer__id = '" $authNamespace->get('customeraccount')->getId() . "'");
  427.             $orders->setOrderKey("orderdate",false);
  428.             $orders->setOrder("desc");
  429.             $orders->setLimit(1);
  430.             $orders->load();
  431.             if (count($orders) > 0) {
  432.                 foreach ($orders as $order) {break;}
  433.                 $lastlogin $order->getOrderDate();
  434.                 $this->view->lastlogin $lastlogin->getTimestamp();
  435.             } else {
  436.                 $lastlogin Carbon::now();
  437.                 $this->view->lastlogin $lastlogin->getTimestamp();
  438.             }
  439.         }
  440.         
  441.       //** $this->layout()->setLayout('product');
  442.         $searchstr $request->get('q');
  443.         if (!$searchstr || empty($searchstr)) return;
  444.         $searcherList = new Data\Listing();
  445.         $db \Pimcore\Db::get();
  446.         $condition[] = " `subtype` = 'BrandExtension'";
  447.         $condition[] = " `type` = 'object' ";
  448.         $condition[] = "( MATCH (`data`,`properties`) AGAINST (" $db->quote($searchstr) . ") AND `data` LIKE " $db->quote("%" $availableCountry->getFullPath() . "%") . ")";
  449.         //$condition[] = "( `data` LIKE " . $db->quote("%" . $searchstr . "%") . " AND `data` LIKE " . $db->quote("%" . $availableCountry->getFullPath() . "%"). " )";
  450.         $searcherList->setLimit(100);
  451.         if (count($condition) > 0) {
  452.             $condition implode(" AND "$condition);
  453.             $searcherList->setCondition($condition);
  454.         }
  455.         
  456.         //$searcherList->setOrderKey( " MATCH (`data`,`properties`) AGAINST (" . $db->quote($searchstr) . ")",false);
  457.         //$searcherList->setOrder("desc");
  458.         $hits $searcherList->load();
  459.         $list=array();
  460.         $idlist "0";
  461.         $this->view->searchresults $hits;
  462.     }
  463.     
  464.     /*
  465.     public function searchAction() {
  466.         $this->view->hideNav = true;
  467.         $productList = \OnlineShop\Framework\Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();;
  468.         $productList->setVariantMode(\OnlineShop\Framework\IndexService\ProductList\IProductList::VARIANT_MODE_INCLUDE_PARENT_OBJECT);
  469.         if($this->getParam("term")) {
  470.             foreach(explode(" ", $this->getParam("term")) as $term) {
  471.                 $productList->addQueryCondition($term, "search");
  472.             }
  473.         }
  474.         $params = $this->getAllParams();
  475.         if(empty($filterDefinition)) {
  476.             $filterDefinition = \Pimcore\Config::getWebsiteConfig()->searchFilterdefinition;
  477.         }
  478.         $this->view->filterDefinitionObject = $filterDefinition;
  479.         // create and init filter service
  480.         $filterService = \OnlineShop\Framework\Factory::getInstance()->getFilterService($this->view);
  481.         \OnlineShop\Framework\FilterService\Helper::setupProductList($filterDefinition, $productList, $params, $this->view, $filterService, true);
  482.         $this->view->filterService = $filterService;
  483.         $this->view->products = $productList;
  484.         // init pagination
  485.         $paginator = Zend_Paginator::factory( $productList );
  486.         $paginator->setCurrentPageNumber( $this->getParam('page') );
  487.         $paginator->setItemCountPerPage( $filterDefinition->getPageLimit() );
  488.         $paginator->setPageRange(10);
  489.         $this->view->paginator = $paginator;
  490.         $this->enableLayout();
  491.         //breadcrumbs
  492.         $this->view->placeholder('addBreadcrumb')->append([
  493.             'parentId' => $this->document->getId()
  494.             , 'id' => "search-result"
  495.             , 'label' => $this->view->translate("shop.search-result", $this->view->escape($this->getParam("term")))
  496.         ]);
  497.         $this->view->headTitle( $this->view->translate("shop.search-result", $this->view->escape($this->getParam("term"))) );
  498.     }
  499.     */
  500. }