src/Develey/MautnerBundle/Controller/ProductController.php line 22

Open in your IDE?
  1. <?php
  2. /**
  3.  * @author      Borche Glafche <borche.glafhce@snk.de>
  4.  * @copyright   Copyright (c) 2019 shoene neue kinder GmbH (www.snk.de)
  5.  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  6.  */
  7. namespace Develey\MautnerBundle\Controller;
  8. use CoreBundle\Controller\Traits\ProductRedirectTrait;
  9. use CoreBundle\Helper\ProductVariants;
  10. use Pimcore\Bundle\{
  11.     EcommerceFrameworkBundle\IndexService\ProductList\IProductList
  12. };
  13. use Pimcore\Model\{
  14.     DataObject,
  15.     DataObject\ProductFood
  16. };
  17. use Symfony\Component\{
  18.     HttpFoundation\Request
  19. };
  20. class ProductController extends \CoreBundle\Controller\ProductController
  21. {
  22.     public function showByArticleNumberAction(Request $request)
  23.     {
  24.         $product = \CoreBundle\Helper\CoreBundleHelper::getProductByArticleNumber($request->get("articlenumber"), $this);
  25.         if (!$product) {
  26.             throw $this->createNotFoundException();
  27.         }
  28.         if($request->get("name") != $product->getUrlTitle()){
  29.             return $this->redirectToRoute("shopHandlerProductDetailMautner", ["articlenumber" => $request->get("articlenumber"), "name" => $product->getUrlTitle()]);
  30.         }
  31.         $productCategoryId $request->get("productCategoryId");
  32.         /**
  33.          * @var array $productArticleNumbers Format [articleNumber => productName]
  34.          */
  35.         if ($productCategoryId) {
  36.             $productArticleNumbers $this->getProductArticleNumbersFromCategoryId($productCategoryId);
  37.         } else {
  38.             $siblingProducts $this->getSiblingProducts($product);
  39.             $productArticleNumbers $this->getProductArticleNumbersFromProductList($siblingProducts);
  40.         }
  41.         $showReferencePrice $isProductFood = ($product instanceof ProductFood);
  42.         $isProductFood = ($product instanceof ProductFood);
  43.         $prevProduct null;
  44.         $nextProduct null;
  45.         //no need to have previous and next links when there is only one product
  46.         if($productArticleNumbers && sizeof($productArticleNumbers) > 1){
  47.             list($prevProduct$nextProduct) = $this->getPrevAndNextProducts($product$productArticleNumbers);
  48.         }
  49.         // Get the variants for a given product
  50.         $productVariants = new ProductVariants();
  51.         $productVariants->get($product);
  52.         $this->view->language $request->get("language");
  53.         $this->view->product $product;
  54.         $this->view->variants $productVariants->variants;
  55.         $this->view->showReferencePrice $showReferencePrice;
  56.         $this->view->isProductFood $isProductFood;
  57.         $this->view->prevProduct $prevProduct;
  58.         $this->view->nextProduct $nextProduct;
  59.         $this->view->productCategoryId $productCategoryId;
  60.         $this->view->highlightedProductId $productVariants->highlightedProductId;
  61.         $this->view->seoTitle $product->getSeoTitle();
  62.         $this->view->seoDescription $product->getSeoDescription();
  63.         return $this->render('Product/showByArticleNumber.html.twig'$this->view->getAllParameters());
  64.     }
  65.     /**
  66.      * @param string $productCategoryId
  67.      *
  68.      * @return array Format [articleNumber => productName] | null
  69.      */
  70.     public function getProductArticleNumbersFromCategoryId($productCategoryId)
  71.     {
  72.         $productCategory = \CoreBundle\Model\DefaultProductCategory::getProductCategoryById($productCategoryId$this);
  73.         $products = \CoreBundle\Helper\CoreBundleHelper::getCoreProductList($this->view->applicationChannel->getPath() . $this->view->applicationChannel->getKey());
  74.         $products->setCategory(\CoreBundle\Model\DefaultProductCategory::getProductCategoryById($productCategory->getId(),
  75.             $this));
  76.         $products->setVariantMode(IProductList::VARIANT_MODE_HIDE);
  77.         $products->load();
  78.         return $products->count() > $this->getProductArticleNumbersFromProductList($products) : null;
  79.     }
  80.     /**
  81.      * @param DataObject\ProductFood $products
  82.      *
  83.      * @return array Format [articleNumber => productName]
  84.      */
  85.     public function getProductArticleNumbersFromProductList($products)
  86.     {
  87.         foreach ($products as $product) {
  88.             /**
  89.              * @var DataObject\ProductFood $product
  90.              */
  91.             if ($product->getShowOnlyAtFoodservice()) {
  92.                 // Do not show this article in "Mautner" shop. It's only for Mautner-Foodservice.
  93.                 continue;
  94.             }
  95.             $productsArray[$product->getArticleNumber()] = $product->getName();
  96.         }
  97.         ksort($productsArray);
  98.         return $productsArray;
  99.     }
  100.     /**
  101.      * @param array  $hash
  102.      * @param string $productArticleNumber
  103.      *
  104.      * @return bool|string
  105.      */
  106.     public function getPreviousProductArticleNumber($hash = [], $productArticleNumber)
  107.     {
  108.         $keys array_keys($hash);
  109.         $foundIndex array_search($productArticleNumber$keys);
  110.         if ($foundIndex === false) {
  111.             return false;
  112.         } else {
  113.             if ($foundIndex === 0) {
  114.                 $keys array_reverse(array_keys($hash));
  115.                 return $keys[0];
  116.             }
  117.         }
  118.         return $keys[$foundIndex 1];
  119.     }
  120.     /**
  121.      * @param array  $hash
  122.      * @param string $productArticleNumber
  123.      *
  124.      * @return bool|string
  125.      */
  126.     public function getNextProductArticleNumber($hash = [], $productArticleNumber)
  127.     {
  128.         $keys array_reverse(array_keys($hash));
  129.         $foundIndex array_search($productArticleNumber$keys);
  130.         if ($foundIndex === false) {
  131.             return false;
  132.         } else {
  133.             if ($foundIndex === 0) {
  134.                 $keys array_keys($hash);
  135.                 return $keys[0];
  136.             }
  137.         }
  138.         return $keys[$foundIndex 1];
  139.     }
  140.     /**
  141.      * @param array $productsArray
  142.      * @param  DataObject\ProductFood $product
  143.      *
  144.      * @return DataObject\ProductFood $product
  145.      */
  146.     public function getPrevProduct($productsArray$product)
  147.     {
  148.         $prevProduct = \CoreBundle\Helper\CoreBundleHelper::getProductByArticleNumber(
  149.             $this->getPreviousProductArticleNumber(
  150.                 $productsArray,
  151.                 $product->getArticleNumber()),
  152.             $this,
  153.             true
  154.         );
  155.         return $prevProduct;
  156.     }
  157.     /**
  158.      * @param  array $productsArray
  159.      * @param  DataObject\ProductFood $product
  160.      *
  161.      * @return $nextProduct DataObject\ProductFood
  162.      */
  163.     public function getNextProduct($productsArray$product)
  164.     {
  165.         $nextProduct = \CoreBundle\Helper\CoreBundleHelper::getProductByArticleNumber(
  166.             $this->getNextProductArticleNumber(
  167.                 $productsArray,
  168.                 $product->getArticleNumber()),
  169.             $this,
  170.             true
  171.         );
  172.         return $nextProduct;
  173.     }
  174.     /**
  175.      * @param DataObject\ProductFood $product
  176.      *
  177.      * @return $siblingProducts DataObject\ProductFood[]
  178.      */
  179.     public function getSiblingProducts($product)
  180.     {
  181.         if ($product->isVariant()) {
  182.             $siblingProducts $product->getParent()->getParent()->getChildren();
  183.         } else {
  184.             $siblingProducts $product->getParent()->getChildren();
  185.         }
  186.         return $siblingProducts;
  187.     }
  188.     /**
  189.      * @param DataObject\ProductFood $product
  190.      * @param $productsArray[]
  191.      *
  192.      * @return DataObject\ProductFood[]
  193.      */
  194.     public function getPrevAndNextProducts($product$productsArray): array
  195.     {
  196.         if ($product->isVariant()) {
  197.             $prevProduct $this->getPrevProduct($productsArray$product->getParent());
  198.             $nextProduct $this->getNextProduct($productsArray$product->getParent());
  199.         } else {
  200.             $prevProduct $this->getPrevProduct($productsArray$product);
  201.             $nextProduct $this->getNextProduct($productsArray$product);
  202.         }
  203.         return [$prevProduct$nextProduct];
  204.     }
  205. }