<?php
namespace App\Controller;
use Pimcore\Controller\FrontendController;
use App\Ecommerce\Tool\RecentlyViewedProducts;
use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
use Pimcore\Mail;
use Pimcore\Model\DataObject\AvailabilityCountry;
use Pimcore\Model\DataObject;
use Pimcore\Http\RequestHelper;
use Pimcore\Model\Search\Backend\Data;
use Symfony\Component\HttpFoundation\Request;
use OutputDataConfigToolkitBundle\Service;
use Carbon\Carbon;
use Zend\Paginator\Paginator;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
// New way (using constructor injection)
use Symfony\Component\DependencyInjection\ContainerInterface;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
use App\Model\DataObject\CategoryAlcoholType;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Twig\Extension\Templating\Placeholder;
// class ShopController extends \Website\Controller\Action
//class ShopController extends FrontendController
class ShopController extends Action
{
public function onKernelController(FilterControllerEvent $event)
{
$this->view->preview = $event->getRequest()->get('pimcore_preview');
parent::onKernelController($event);
$this->view->category = DataObject\CategoryAlcoholType::getById($event->getRequest()->get('category'));
}
/**
* show product landing
*/
public function brandListAction(Request $request)
{
//Set the layout and CSS Class
$params = [];
$params['language'] = $this->language;
$params['CssClass'] = "brand-page";
$params['locale'] = strtolower($request->getLocale());
$params['params'] = $request->request->all();
$params['preview'] = $request->get('pimcore_preview',null);
//$this->layout()->setLayout('product');
//$this->enableLayout();
//Get All the BrandVariety
//$brandvariety->load();
// Set Us as default country
$defaultCountry = DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
if(isset($this->country)){
$availableCountry = $this->country;
}else{
$availableCountry = $defaultCountry;
$params['country'] = $defaultCountry;
}
//List all brands
$filter = array();
$brands = new DataObject\CategoryAlcoholType\Listing();
$params['brands'] = $brands;
$brands->setOrderKey("AlcoholType");
$brands->setOrder("ASC");
foreach ($brands as $brand) {
$brandvariety_local = new DataObject\BrandExtension\Listing();
// $brandvariety_local->setCondition(" Category like '%," . $brand->getId() . ",%'");
if (count($brandvariety_local) > 0) {
$brandname = $brand->getAlcoholType();
if (!empty($brandname)) {
$firstCharacter = strtoupper(substr($brandname, 0, 1));
$brandsSorted[$firstCharacter][] = $brand;
if (!in_array($firstCharacter, $filter)) {
$filter[] = $firstCharacter;
}
}
}
}
sort($filter);
$params['filter'] = $filter;
$params['brandsSorted'] = $brandsSorted;
return $this->render('Shop/brandList.html.twig', $params);
}
/**
* show product landing
* @param Request $request
* @param ListHelper $listHelper
*/
public function productLandingAction(Request $request,ListHelper $listHelper)
{
$params = [];
$params['CssClass'] = "landing-page";
$params['locale'] = strtolower($request->getLocale());
$params['params'] = $request->request->all();
$params['preview'] = $request->get('pimcore_preview',null);
//$this->layout()->setLayout('product');
// Set Us as default country
$defaultCountry = DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
if(isset($this->country)){
$availableCountry = $this->country;
}else{
$availableCountry = $defaultCountry;
$params['country'] = $defaultCountry;
}
$filterDefinition = \Pimcore\Model\DataObject\FilterDefinition::getByPath("/filter-definitions/default"); // \Pimcore\Config::getWebsiteConfig()->fallbackFilterdefinition;
$params['filterDefinitionObject'] = $filterDefinition;
// create product list
$products =Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();
//$products->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
//$products->addRelationCondition('CountryAvailabilityList', "dest IN (" . $availableCountry->getId() . ")");
$params['products'] = $products;
$params = @array_merge($params,$request->query->all());
// create and init filter service
$filterService = Factory::getInstance()->getFilterService();
$listHelper->setupProductList($filterDefinition, $products, $params, $filterService, true);
$params['filterService'] = $filterService;
$params['valuesIndex'] = $this->getValueIndex($filterDefinition, $products);
$params['subCategories'] = CategoryAlcoholType::getTopLevelCategories();
return $this->render('Shop/productLanding.html.twig',$params);
// $this->enableLayout();
}
/**
* get product value indexing
* @return array
*/
private function getValueIndex($filterDefinitionObject, $products){
$valuesIndex = array();
foreach ($filterDefinitionObject->getFilters() as $filter) {
$products->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
$rawValues = $products->getGroupByValues("parentCategoryids", true);
foreach($rawValues as $v) {
$values[$v['value']] = array('value' => $v['value'], "count" => $v['count']);
}
// resort values
if ($values) {
foreach($values as $entry)
{
$ids = explode(",",$entry['value']);
foreach ($ids as $id) {
if (!empty($id)) {
if (array_key_exists($id, $valuesIndex)) {
$valuesIndex[ $id ] += $entry['count'] ;
} else {
$valuesIndex[ $id ] = $entry['count'] ;
}
}
}
}
}
}
return $valuesIndex;
}
/**
* show product list
*/
public function listAction(Request $request,ListHelper $listHelper, PaginatorInterface $paginator, Placeholder $placeholderHelper)
{
//$params = array_merge($request->query->all(), $request->attributes->all());
$params['lastlogin'] = '';
$params['locale'] = strtolower($request->getLocale());
$params['params'] = $request->request->all();
$params['preview'] = $request->get('pimcore_preview',null);
$defaultCountry = DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
if(isset($this->country)){
$availableCountry = $this->country;
}else{
$availableCountry = $defaultCountry;
$params['country'] = $defaultCountry;
}
//TODO We will handle after user login and session
$session = $request->getSession();
$authNamespace = $session->getBag('espirit');
if ($authNamespace && $authNamespace->has('customeraccount')) {
$orders = new DataObject\OnlineShopOrder\Listing();
$orders->setCondition(" customer__id = '" . $authNamespace->get('customeraccount')->getId() . "'");
$orders->setOrderKey("orderdate",false);
$orders->setOrder("desc");
$orders->setLimit(1);
$orders->load();
if (count($orders) > 0) {
foreach ($orders as $order) {break;}
$lastlogin = $order->getOrderDate();
$params['lastlogin'] = $lastlogin->getTimestamp();
} else {
$lastlogin = Carbon::now();
$params['lastlogin'] = $lastlogin->getTimestamp();
}
}
//END TODO
//$this->layout()->setLayout('product');
$params['CssClass'] = "sub-category-page";
$params["parentCategoryIds"] = $request->get('category');
$params = array_merge($params,$request->query->all());
//$category = \Website\ShopCategory::getById($params['category']);
$category = CategoryAlcoholType::getById($request->get('category'));
$params['category'] = $category;
if ($request->get("Brand")) {
$brand = DataObject\Brand::getById($request->get('Brand'));
if ($brand) {
$params['BrandName'] = $brand->getBrandName();
}
}
// load current filter
if($category) {
$filterDefinition = $category->getFilterdefinition();
}
if($request->get("filterdefinition") instanceof \Pimcore\Model\DataObject\FilterDefinition) {
$filterDefinition = $request->get("filterdefinition");
}
if(empty($filterDefinition)) {
$filterDefinition = \Pimcore\Config::getWebsiteConfig()->get('fallbackFilterdefinition');
}
$params['filterDefinitionObject'] = $filterDefinition;
// create product list
$products = Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();
//$products->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
//$products->addCondition("is_default = 1");
// $products->addRelationCondition('CountryAvailabilityList', "dest IN (" . $availableCountry->getId() . ")");
//search query
$query = $request->get("search");
if ($query) {
$query = preg_replace('/[^A-Za-z0-9\-\ ]/', '', $query);
//$products->addCondition("SearchData LIKE " . $products->quote("%" . $query . "%"));
$products->addCondition("MATCH (`searchData`) AGAINST (" . $products->quote($query) . ")");
$params['search'] = $query;
}
// echo "<pre>"; print_r($products); die;
$params['products'] = $products;
// create and init filter service
$filterService = Factory::getInstance()->getFilterService();
$listHelper->setupProductList($filterDefinition, $products, $params, $filterService, true);
$params['filterService'] = $filterService;
$params['filterDefinition'] = $filterDefinition;
// init pagination
$paginator = $paginator->paginate(
$products,
$request->get('page', 1),
12
);
$params['paginator'] = $paginator;
$params['paginationVariables'] = $paginator->getPaginationData();;
// $this->enableLayout();
//breadcrumbs
if($category) {
$parentCategories = $category->getParentCategoryList(null, $this->document);
$parentCategories[] = $category;
foreach($parentCategories as $parentCategory) {
$placeholderHelper->__invoke('addBreadcrumb')->append([
'parentId' => "category-" . $parentCategory->getParentId(),
'id' => "category-" . $parentCategory->getId(),
'url' => $parentCategory->getDetailUrl(["document" => $this->document]),
'label' => $parentCategory->getName()
]);
}
//$headTitleHelper = \Pimcore::getContainer()->get('pimcore.templating.view_helper.head_title');
//$headTitleHelper($category->getName());
}
return $this->render('Shop/list.html.twig', $params);
}
/**
* show product detail page
* @throws Zend_Controller_Router_Exception
*/
public function detailAction(Request $request, RequestHelper $requestHelper) {
//Set the product layout
//$this->layout()->setLayout('product');
$params = [];
$params['CssClass'] = "detail-page";
$params['locale'] = strtolower($request->getLocale());
$params['params'] = $request->request->all();
$params['preview'] = $request->get('pimcore_preview',null);
// Set Us as default country
$defaultCountry = DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
if(isset($this->country)){
$availableCountry = $this->country;
}else{
$availableCountry = $defaultCountry;
//$this->view->country = $defaultCountry;
$params['country'] = $defaultCountry;
}
//$this->enableLayout();
// load product
$product = \App\Model\DataObject\BrandExtension::getById($request->get("product"));
if(!$product || (!$product->isActive() && !$requestHelper->isFrontendRequestByAdmin($request))) {
return $this->forward('error', ['error']);
//throw new Zend_Controller_Router_Exception("die gewünschte Seite existiert nicht mehr");
} else {
$params['product'] = $product;
$categories = $product->getCategory();//Pimcore\Model\Object\CategoryAlcoholType::getById($this->getParam("category"));
if ($categories) foreach ($categories as $category) {break;}
// ...
$params['specificationOutputChannel'] = Service::getOutputDataConfig($product, "productdetail_specification");
$params['hasSpec'] = false;
foreach($params['specificationOutputChannel'] as $x) {
if($x->getLabeledValue($product)) {
$params['hasSpec'] = true;
break;
}
}
//recently viewed products
$recently = new RecentlyViewedProducts( Factory::getInstance()->getEnvironment(), function($id) {
return DataObject\BrandExtension::getById($id);
});
/*
$sizeVariants = $product->getSizeVariants();
if(empty($sizeVariants)) {
$linkProduct = $product;
} else {
$tmp = array_values($sizeVariants);
$linkProduct = array_shift($tmp);
}
$this->view->recentlyViewed = $recently->addProduct( $linkProduct )->getProducts(4);
*/
$filterdefinition = null;
if($category) {
$category = $category->getObject();
$filterdefinition = $category->getFilterdefinition();
}
if(empty($filterdefinition)) {
$filterdefinition = \Pimcore\Config::getWebsiteConfig()->fallbackFilterdefinition;
}
$params['similarProducts'] = $this->getSimilarProducts($product, $filterdefinition);
//breadcrumbs
$category = $product->getFirstCategory();
$container = \Pimcore::getKernel()->getContainer();
// $placeholder = $container->get('pimcore.templating.view_helper.placeholder');
// if($category) {
// $parentCategories = $category->getParentCategoryList(null, $this->document);
// $parentCategories[] = $category;
// foreach($parentCategories as $index => $parentCategory) {
// $placeholder('addBreadcrumb')->append([
// 'parentId' => "category-" . $parentCategory->getParentId()
// , 'id' => "category-" . $parentCategory->getId()
// , 'url' => $parentCategory->getDetailUrl(["document" => $this->document])
// , 'label' => $parentCategory->getName()
// ]);
// }
// }
// $placeholder('addBreadcrumb')->append([
// 'parentId' => $category ? "category-" . $category->getParentId() : ""
// , 'id' => "product-" . $product->getId()
// , 'url' => $product->getDetailUrl(["document" => $this->document])
// , 'label' => $product->getName()
// ]);
// $headTitle = $container->get('pimcore.templating.view_helper.head_title');
// $headTitle($product->getName());
//$trackingManager = Factory::getInstance()->getTrackingManager();
//$trackingManager->trackProductView($product);
return $this->render('Shop/detail.html.twig',$params);
}
}
private function getSimilarProducts(DataObject\BrandExtension $product, \Pimcore\Model\DataObject\FilterDefinition $filterDefinition = null) {
if($filterDefinition) {
// Set Us as default country
$defaultCountry = DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
if(isset($this->country)){
$availableCountry = $this->country;
}else{
$availableCountry = $defaultCountry;
}
$productList = Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();;
$productList->setVariantMode(ProductListInterface::VARIANT_MODE_INCLUDE_PARENT_OBJECT);
$productList->addRelationCondition('CountryAvailabilityList', "dest IN (" . $availableCountry->getId() . ")");
$similarityFields = $filterDefinition->getSimilarityFields();
if($similarityFields) {
$statement = $productList->buildSimularityOrderBy($filterDefinition->getSimilarityFields(), $product->getId());
}
if(!empty($statement)) {
$productList->setLimit(4);
$productList->setOrder("ASC");
$productList->addCondition("o_virtualProductId != " . $product->internalGetBaseProduct()->getId(), "o_id");
if($filterDefinition->getCrossSellingCategory()) {
$productList->setCategory($filterDefinition->getCrossSellingCategory());
}
$productList->setOrderKey($statement);
return $productList->load();
}
}
return array();
}
public function productCellAction(Request $request) {
if($request->get("type") == "object") {
$this->view->product = Pimcore\Model\Object\Product::getById($request->get("id"));
$this->view->col = $request->get("editmode") ? 12 : 3;
$this->view->view = $this->view;
}
$this->renderScript('/product/list/product.php');
}
public function searchAction(Request $request) {
// Set Us as default country
$defaultCountry = DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
if(isset($this->country)){
$availableCountry = $this->country;
}else{
$availableCountry = $defaultCountry;
$this->view->country = $defaultCountry;
}
// $this->enableLayout();
$session = $this->get('session');
$authNamespace = $session->getBag('espirit');
if ($authNamespace && $authNamespace->has('customeraccount')) {
$orders = new DataObject\OnlineShopOrder\Listing();
$orders->setCondition(" customer__id = '" . $authNamespace->get('customeraccount')->getId() . "'");
$orders->setOrderKey("orderdate",false);
$orders->setOrder("desc");
$orders->setLimit(1);
$orders->load();
if (count($orders) > 0) {
foreach ($orders as $order) {break;}
$lastlogin = $order->getOrderDate();
$this->view->lastlogin = $lastlogin->getTimestamp();
} else {
$lastlogin = Carbon::now();
$this->view->lastlogin = $lastlogin->getTimestamp();
}
}
//** $this->layout()->setLayout('product');
$searchstr = $request->get('q');
if (!$searchstr || empty($searchstr)) return;
$searcherList = new Data\Listing();
$db = \Pimcore\Db::get();
$condition[] = " `subtype` = 'BrandExtension'";
$condition[] = " `type` = 'object' ";
$condition[] = "( MATCH (`data`,`properties`) AGAINST (" . $db->quote($searchstr) . ") AND `data` LIKE " . $db->quote("%" . $availableCountry->getFullPath() . "%") . ")";
//$condition[] = "( `data` LIKE " . $db->quote("%" . $searchstr . "%") . " AND `data` LIKE " . $db->quote("%" . $availableCountry->getFullPath() . "%"). " )";
$searcherList->setLimit(100);
if (count($condition) > 0) {
$condition = implode(" AND ", $condition);
$searcherList->setCondition($condition);
}
//$searcherList->setOrderKey( " MATCH (`data`,`properties`) AGAINST (" . $db->quote($searchstr) . ")",false);
//$searcherList->setOrder("desc");
$hits = $searcherList->load();
$list=array();
$idlist = "0";
$this->view->searchresults = $hits;
}
/*
public function searchAction() {
$this->view->hideNav = true;
$productList = \OnlineShop\Framework\Factory::getInstance()->getIndexService()->getProductListForCurrentTenant();;
$productList->setVariantMode(\OnlineShop\Framework\IndexService\ProductList\IProductList::VARIANT_MODE_INCLUDE_PARENT_OBJECT);
if($this->getParam("term")) {
foreach(explode(" ", $this->getParam("term")) as $term) {
$productList->addQueryCondition($term, "search");
}
}
$params = $this->getAllParams();
if(empty($filterDefinition)) {
$filterDefinition = \Pimcore\Config::getWebsiteConfig()->searchFilterdefinition;
}
$this->view->filterDefinitionObject = $filterDefinition;
// create and init filter service
$filterService = \OnlineShop\Framework\Factory::getInstance()->getFilterService($this->view);
\OnlineShop\Framework\FilterService\Helper::setupProductList($filterDefinition, $productList, $params, $this->view, $filterService, true);
$this->view->filterService = $filterService;
$this->view->products = $productList;
// init pagination
$paginator = Zend_Paginator::factory( $productList );
$paginator->setCurrentPageNumber( $this->getParam('page') );
$paginator->setItemCountPerPage( $filterDefinition->getPageLimit() );
$paginator->setPageRange(10);
$this->view->paginator = $paginator;
$this->enableLayout();
//breadcrumbs
$this->view->placeholder('addBreadcrumb')->append([
'parentId' => $this->document->getId()
, 'id' => "search-result"
, 'label' => $this->view->translate("shop.search-result", $this->view->escape($this->getParam("term")))
]);
$this->view->headTitle( $this->view->translate("shop.search-result", $this->view->escape($this->getParam("term"))) );
}
*/
}