/** * @param ListProduct[] $listProducts * @param ShopContextInterface $context * @return Category[] indexed by product id */ public function getList($listProducts, ShopContextInterface $context) { $ids = array_map(function (ListProduct $product) { return $product->getId(); }, $listProducts); //select all seo category ids, indexed by product id $ids = $this->getCategoryIds($ids, $context); //now select all category data for the selected ids $categories = $this->categoryService->getList($ids, $context); $result = []; foreach ($ids as $productId => $categoryId) { if (!isset($categories[$categoryId])) { continue; } $result[$productId] = $categories[$categoryId]; } return $result; }
/** * Generates the facet for the \Shopware\Bundle\SearchBundle\Facet;\Category class. * Displays how many products are assigned to the children categories. * * The handler use the category ids of the \Shopware\Bundle\SearchBundle\Condition\Category. * If no \Shopware\Bundle\SearchBundle\Condition\Category is set, the handler uses as default the id 1. * * @param FacetInterface|Facet\CategoryFacet $facet * @param Criteria $criteria * @param ShopContextInterface $context * @return TreeFacetResult */ public function generateFacet(FacetInterface $facet, Criteria $criteria, ShopContextInterface $context) { $ids = $this->getCategoryIds($criteria, $context); $categories = $this->categoryService->getList($ids, $context); $active = []; if ($criteria->hasCondition('category')) { /**@var $condition CategoryCondition*/ $condition = $criteria->getCondition('category'); $active = $condition->getCategoryIds(); } return $this->createTreeFacet($categories, $facet, $active); }
/** * Returns the category tree from the root until the category * with the provided id. Also loads siblings for elements in the * category path. * * @param int $id Id of the category to load * @return array Tree of categories */ public function sGetCategories($id) { $pathIds = $this->getCategoryPath($id); $grouped = $this->getCategoryIdsWithParent($pathIds); $ids = array_merge($pathIds, array_keys($grouped)); $context = $this->contextService->getShopContext(); $categories = $this->categoryService->getList($ids, $context); unset($grouped[$this->baseId]); $tree = $this->buildTree($grouped, $this->baseId); $result = $this->assignCategoriesToTree($categories, $tree, $pathIds, $this->getChildrenCountOfCategories($ids)); return $result; }
/** * {@inheritdoc} */ public function hydrate(array $elasticResult, ProductNumberSearchResult $result, Criteria $criteria, ShopContextInterface $context) { if (!isset($elasticResult['aggregations'])) { return; } if (!isset($elasticResult['aggregations']['agg_category'])) { return; } $data = $elasticResult['aggregations']['agg_category']['buckets']; $ids = $this->getCategoryIds($criteria, $data); $categories = $this->categoryService->getList($ids, $context); $active = []; if ($criteria->hasCondition('category')) { /**@var $condition CategoryCondition*/ $condition = $criteria->getCondition('category'); $active = $condition->getCategoryIds(); } $criteriaPart = $this->createTreeFacet($categories, $active); $result->addFacet($criteriaPart); }
/** * @inheritdoc */ public function getList(array $numbers, Struct\ProductContextInterface $context) { $products = $this->productGateway->getList($numbers, $context); $covers = $this->mediaService->getCovers($products, $context); $graduatedPrices = $this->graduatedPricesService->getList($products, $context); $cheapestPrices = $this->cheapestPriceService->getList($products, $context); $voteAverages = $this->voteService->getAverages($products, $context); $categories = $this->categoryService->getProductsCategories($products, $context); $result = []; foreach ($numbers as $number) { if (!array_key_exists($number, $products)) { continue; } $product = $products[$number]; if (isset($covers[$number])) { $product->setCover($covers[$number]); } if (isset($graduatedPrices[$number])) { $product->setPriceRules($graduatedPrices[$number]); } if (isset($cheapestPrices[$number])) { $product->setCheapestPriceRule($cheapestPrices[$number]); } if (isset($voteAverages[$number])) { $product->setVoteAverage($voteAverages[$number]); } if (isset($categories[$number])) { $product->setCategories($categories[$number]); } $product->addAttribute('marketing', $this->marketingService->getProductAttribute($product)); $this->priceCalculationService->calculateProduct($product, $context); if ($this->isProductValid($product, $context)) { $result[$number] = $product; } } return $result; }