<?php
/**
* @author Borche Glafche <borche.glafhce@snk.de>
* @copyright Copyright (c) 2019 shoene neue kinder GmbH (www.snk.de)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
namespace Develey\MautnerBundle\Controller;
use CoreBundle\Controller\Traits\ProductRedirectTrait;
use CoreBundle\Helper\ProductVariants;
use Pimcore\Bundle\{
EcommerceFrameworkBundle\IndexService\ProductList\IProductList
};
use Pimcore\Model\{
DataObject,
DataObject\ProductFood
};
use Symfony\Component\{
HttpFoundation\Request
};
class ProductController extends \CoreBundle\Controller\ProductController
{
public function showByArticleNumberAction(Request $request)
{
$product = \CoreBundle\Helper\CoreBundleHelper::getProductByArticleNumber($request->get("articlenumber"), $this);
if (!$product) {
throw $this->createNotFoundException();
}
if($request->get("name") != $product->getUrlTitle()){
return $this->redirectToRoute("shopHandlerProductDetailMautner", ["articlenumber" => $request->get("articlenumber"), "name" => $product->getUrlTitle()]);
}
$productCategoryId = $request->get("productCategoryId");
/**
* @var array $productArticleNumbers Format [articleNumber => productName]
*/
if ($productCategoryId) {
$productArticleNumbers = $this->getProductArticleNumbersFromCategoryId($productCategoryId);
} else {
$siblingProducts = $this->getSiblingProducts($product);
$productArticleNumbers = $this->getProductArticleNumbersFromProductList($siblingProducts);
}
$showReferencePrice = $isProductFood = ($product instanceof ProductFood);
$isProductFood = ($product instanceof ProductFood);
$prevProduct = null;
$nextProduct = null;
//no need to have previous and next links when there is only one product
if($productArticleNumbers && sizeof($productArticleNumbers) > 1){
list($prevProduct, $nextProduct) = $this->getPrevAndNextProducts($product, $productArticleNumbers);
}
// Get the variants for a given product
$productVariants = new ProductVariants();
$productVariants->get($product);
$this->view->language = $request->get("language");
$this->view->product = $product;
$this->view->variants = $productVariants->variants;
$this->view->showReferencePrice = $showReferencePrice;
$this->view->isProductFood = $isProductFood;
$this->view->prevProduct = $prevProduct;
$this->view->nextProduct = $nextProduct;
$this->view->productCategoryId = $productCategoryId;
$this->view->highlightedProductId = $productVariants->highlightedProductId;
$this->view->seoTitle = $product->getSeoTitle();
$this->view->seoDescription = $product->getSeoDescription();
return $this->render('Product/showByArticleNumber.html.twig', $this->view->getAllParameters());
}
/**
* @param string $productCategoryId
*
* @return array Format [articleNumber => productName] | null
*/
public function getProductArticleNumbersFromCategoryId($productCategoryId)
{
$productCategory = \CoreBundle\Model\DefaultProductCategory::getProductCategoryById($productCategoryId, $this);
$products = \CoreBundle\Helper\CoreBundleHelper::getCoreProductList($this->view->applicationChannel->getPath() . $this->view->applicationChannel->getKey());
$products->setCategory(\CoreBundle\Model\DefaultProductCategory::getProductCategoryById($productCategory->getId(),
$this));
$products->setVariantMode(IProductList::VARIANT_MODE_HIDE);
$products->load();
return $products->count() > 0 ? $this->getProductArticleNumbersFromProductList($products) : null;
}
/**
* @param DataObject\ProductFood $products
*
* @return array Format [articleNumber => productName]
*/
public function getProductArticleNumbersFromProductList($products)
{
foreach ($products as $product) {
/**
* @var DataObject\ProductFood $product
*/
if ($product->getShowOnlyAtFoodservice()) {
// Do not show this article in "Mautner" shop. It's only for Mautner-Foodservice.
continue;
}
$productsArray[$product->getArticleNumber()] = $product->getName();
}
ksort($productsArray);
return $productsArray;
}
/**
* @param array $hash
* @param string $productArticleNumber
*
* @return bool|string
*/
public function getPreviousProductArticleNumber($hash = [], $productArticleNumber)
{
$keys = array_keys($hash);
$foundIndex = array_search($productArticleNumber, $keys);
if ($foundIndex === false) {
return false;
} else {
if ($foundIndex === 0) {
$keys = array_reverse(array_keys($hash));
return $keys[0];
}
}
return $keys[$foundIndex - 1];
}
/**
* @param array $hash
* @param string $productArticleNumber
*
* @return bool|string
*/
public function getNextProductArticleNumber($hash = [], $productArticleNumber)
{
$keys = array_reverse(array_keys($hash));
$foundIndex = array_search($productArticleNumber, $keys);
if ($foundIndex === false) {
return false;
} else {
if ($foundIndex === 0) {
$keys = array_keys($hash);
return $keys[0];
}
}
return $keys[$foundIndex - 1];
}
/**
* @param array $productsArray
* @param DataObject\ProductFood $product
*
* @return DataObject\ProductFood $product
*/
public function getPrevProduct($productsArray, $product)
{
$prevProduct = \CoreBundle\Helper\CoreBundleHelper::getProductByArticleNumber(
$this->getPreviousProductArticleNumber(
$productsArray,
$product->getArticleNumber()),
$this,
true
);
return $prevProduct;
}
/**
* @param array $productsArray
* @param DataObject\ProductFood $product
*
* @return $nextProduct DataObject\ProductFood
*/
public function getNextProduct($productsArray, $product)
{
$nextProduct = \CoreBundle\Helper\CoreBundleHelper::getProductByArticleNumber(
$this->getNextProductArticleNumber(
$productsArray,
$product->getArticleNumber()),
$this,
true
);
return $nextProduct;
}
/**
* @param DataObject\ProductFood $product
*
* @return $siblingProducts DataObject\ProductFood[]
*/
public function getSiblingProducts($product)
{
if ($product->isVariant()) {
$siblingProducts = $product->getParent()->getParent()->getChildren();
} else {
$siblingProducts = $product->getParent()->getChildren();
}
return $siblingProducts;
}
/**
* @param DataObject\ProductFood $product
* @param $productsArray[]
*
* @return DataObject\ProductFood[]
*/
public function getPrevAndNextProducts($product, $productsArray): array
{
if ($product->isVariant()) {
$prevProduct = $this->getPrevProduct($productsArray, $product->getParent());
$nextProduct = $this->getNextProduct($productsArray, $product->getParent());
} else {
$prevProduct = $this->getPrevProduct($productsArray, $product);
$nextProduct = $this->getNextProduct($productsArray, $product);
}
return [$prevProduct, $nextProduct];
}
}