/** * Traces the search result into the s_statistic_search * * @param Criteria $criteria * @param ProductNumberSearchResult $result * @param Shop $shop */ public function logResult(Criteria $criteria, ProductNumberSearchResult $result, Shop $shop) { if (!$criteria->hasCondition('search')) { return; } /* @var $condition SearchTermCondition */ $condition = $criteria->getCondition('search'); $now = new \DateTime(); $this->connection->insert('s_statistics_search', ['datum' => $now->format('Y-m-d H:i:s'), 'searchterm' => $condition->getTerm(), 'results' => $result->getTotalCount(), 'shop_id' => $shop->getId()]); }
public function testConditionOverwrite() { $criteria = new Criteria(); $criteria->addCondition(new CategoryCondition(array(1))); $condition = new CategoryCondition(array(3)); $criteria->addCondition($condition); $this->assertCount(1, $criteria->getConditions()); $condition = $criteria->getCondition($condition->getName()); $this->assertInstanceOf('Shopware\\Bundle\\SearchBundle\\Condition\\CategoryCondition', $condition); $this->assertEquals(array(3), $condition->getCategoryIds()); }
private function searchBlog(Criteria $criteria, Struct\ProductContextInterface $context) { /**@var $condition SearchTermCondition*/ $condition = $criteria->getCondition('search'); $query = $this->createMultiMatchQuery($condition); $search = new Search(); $search->addQuery($query); $search->setFrom(0)->setSize(5); $index = $this->indexFactory->createShopIndex($context->getShop()); $params = ['index' => $index->getName(), 'type' => 'blog', 'body' => $search->toArray()]; $raw = $this->client->search($params); return $this->createBlogStructs($raw); }
/** * @param Criteria $criteria * @param $data * @return array */ private function getActiveValues(Criteria $criteria, $data) { $actives = ['min' => $data['min'], 'max' => $data['max']]; /** @var SalesCondition $condition */ if (!($condition = $criteria->getCondition('swag_es_product_sales'))) { return $actives; } if ($condition->getMin()) { $actives['min'] = $condition->getMin(); } if ($condition->getMax()) { $actives['max'] = $condition->getMax(); } return $actives; }
/** * Extends the query criteria query to generate enough data for the servicees * * @param FacetInterface $facet * @param Criteria $criteria * @param Struct\ShopContextInterface $context * @return null|FacetResultInterface|FacetResultInterface[] */ public function generateFacet(FacetInterface $facet, Criteria $criteria, Struct\ShopContextInterface $context) { $activeOptions = array(); $productVariantCondition = $criteria->getCondition('swag-variant-filter-product-variant'); if ($productVariantCondition && $productVariantCondition instanceof ProductVariantCondition) { $activeOptions = $productVariantCondition->getProductVariantIds(ProductVariantCondition::FORMAT_FLAT); } $queryCriteria = clone $criteria; $queryCriteria->resetConditions(); $query = $this->queryBuilderFactory->createQuery($queryCriteria, $context); $query->select('configuratorOptionRelations.option_id')->innerJoin('product', 's_articles_details', 'variantFilterDetails', 'variantFilterDetails.articleID = product.id')->innerJoin('variantFilterDetails', 's_article_configurator_option_relations', 'configuratorOptionRelations', 'configuratorOptionRelations.article_id = variantFilterDetails.id')->groupBy('configuratorOptionRelations.option_id'); $ids = (array) $query->execute()->fetchAll(\PDO::FETCH_COLUMN); $filterConditions = $this->productVariantService->getFilterConditions($ids, $activeOptions); if (!$filterConditions) { return null; } return new ProductVariantFacetResult($filterConditions, $this->snippetNamespace->get('FilterHeadlineVariants', 'Variantfilter')); }
/** * @param Criteria $criteria * @param float $min * @param float $max * @return RangeFacetResult */ private function createFacet(Criteria $criteria, $min, $max) { $activeMin = $min; $activeMax = $max; /**@var $condition PriceCondition */ if ($condition = $criteria->getCondition('price')) { $activeMin = $condition->getMinPrice(); $activeMax = $condition->getMaxPrice(); } $label = $this->snippetManager->getNamespace('frontend/listing/facet_labels')->get('price', 'Price'); if (!($minFieldName = $this->queryAliasMapper->getShortAlias('priceMin'))) { $minFieldName = 'priceMin'; } if (!($maxFieldName = $this->queryAliasMapper->getShortAlias('priceMax'))) { $maxFieldName = 'priceMax'; } return new RangeFacetResult('price', $criteria->hasCondition('price'), $label, (double) $min, (double) $max, (double) $activeMin, (double) $activeMax, $minFieldName, $maxFieldName, [], 'frontend/listing/filter/facet-currency-range.tpl'); }
/** * @param Criteria $criteria * @param $manufacturers * @return array */ private function createListItems(Criteria $criteria, $manufacturers) { $actives = []; /**@var $condition ManufacturerCondition*/ if ($condition = $criteria->getCondition('manufacturer')) { $actives = $condition->getManufacturerIds(); } $items = []; /**@var $manufacturer Manufacturer */ foreach ($manufacturers as $manufacturer) { $items[] = new ValueListItem($manufacturer->getId(), $manufacturer->getName(), in_array($manufacturer->getId(), $actives)); } return $items; }
/** * @param QueryBuilder $query * @param ProductAttributeFacet $facet * @param Criteria $criteria * @return null|RangeFacetResult */ private function createRangeFacetResult(QueryBuilder $query, ProductAttributeFacet $facet, Criteria $criteria) { $sqlField = 'productAttribute.' . $facet->getField(); $query->select(['MIN(' . $sqlField . ') as minValues', 'MAX(' . $sqlField . ') as maxValues']); /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */ $statement = $query->execute(); $result = $statement->fetch(\PDO::FETCH_ASSOC); if (empty($result)) { return null; } $activeMin = $result['minValues']; $activeMax = $result['maxValues']; /**@var $condition ProductAttributeCondition*/ if ($condition = $criteria->getCondition($facet->getName())) { $data = $condition->getValue(); $activeMin = $data['min']; $activeMax = $data['max']; } return new RangeFacetResult($facet->getName(), $criteria->hasCondition($facet->getName()), $facet->getLabel(), $result['minValues'], $result['maxValues'], $activeMin, $activeMax, 'min' . $facet->getFormFieldName(), 'max' . $facet->getFormFieldName()); }
/** * Generates the facet data for the passed query, criteria and context object. * * @param FacetInterface|VoteAverageFacet $facet * @param Criteria $criteria * @param Struct\ShopContextInterface $context * @return \Shopware\Bundle\SearchBundle\FacetResult\RadioFacetResult|null */ public function generateFacet(FacetInterface $facet, Criteria $criteria, Struct\ShopContextInterface $context) { $queryCriteria = clone $criteria; $queryCriteria->resetConditions(); $queryCriteria->resetSorting(); $query = $this->queryBuilderFactory->createQuery($queryCriteria, $context); $query->resetQueryPart('orderBy'); $query->resetQueryPart('groupBy'); if (!$query->hasState(VoteAverageCondition::STATE_INCLUDES_VOTE_TABLE)) { $query->innerJoin('product', 's_articles_vote', 'vote', 'vote.articleID = product.id'); } $query->select('COUNT(vote.id) as hasVotes'); /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */ $statement = $query->execute(); $data = $statement->fetch(\PDO::FETCH_COLUMN); if (!$data) { return null; } $activeAverage = null; if ($criteria->hasCondition($facet->getName())) { /**@var $condition VoteAverageCondition*/ $condition = $criteria->getCondition($facet->getName()); $activeAverage = $condition->getAverage(); } $values = [new ValueListItem(1, '', $activeAverage == 1), new ValueListItem(2, '', $activeAverage == 2), new ValueListItem(3, '', $activeAverage == 3), new ValueListItem(4, '', $activeAverage == 4), new ValueListItem(5, '', $activeAverage == 5)]; return new RadioFacetResult($facet->getName(), $criteria->hasCondition($facet->getName()), $this->snippetNamespace->get($facet->getName(), 'Ranking'), $values, $this->fieldName, [], 'frontend/listing/filter/facet-rating.tpl'); }
/** * @param Shop $shop * @param Criteria $criteria * @return int */ private function getActiveCategoryId(Shop $shop, Criteria $criteria) { /**@var $condition CategoryCondition*/ $category = $shop->getCategory()->getId(); if ($condition = $criteria->getCondition('category')) { $category = $condition->getCategoryIds()[0]; } return $category; }
/** * @param FacetInterface|Facet\PriceFacet $facet * @param Criteria $criteria * @param ShopContextInterface $context * @return RangeFacetResult */ public function generateFacet(FacetInterface $facet, Criteria $criteria, ShopContextInterface $context) { $queryCriteria = clone $criteria; $queryCriteria->resetConditions(); $queryCriteria->resetSorting(); $query = $this->queryBuilderFactory->createQuery($queryCriteria, $context); $query->resetQueryPart('orderBy'); $query->resetQueryPart('groupBy'); $selection = $this->priceHelper->getSelection($context); $this->priceHelper->joinPrices($query, $context); $query->select('MIN(' . $selection . ') as cheapest_price'); /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */ $statement = $query->execute(); $min = $statement->fetch(\PDO::FETCH_COLUMN); $query->groupBy('product.id')->orderBy('cheapest_price', 'DESC')->setFirstResult(0)->setMaxResults(1); /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */ $statement = $query->execute(); $max = $statement->fetch(\PDO::FETCH_COLUMN); $activeMin = $min; $activeMax = $max; /**@var $condition PriceCondition */ if ($condition = $criteria->getCondition($facet->getName())) { $activeMin = $condition->getMinPrice(); $activeMax = $condition->getMaxPrice(); } return new RangeFacetResult($facet->getName(), $criteria->hasCondition($facet->getName()), $this->snippetNamespace->get($facet->getName(), 'Price'), (double) $min, (double) $max, (double) $activeMin, (double) $activeMax, $this->minFieldName, $this->maxFieldName, [], 'frontend/listing/filter/facet-currency-range.tpl'); }
/** * @param Criteria $criteria * @return int[] */ private function getActiveIds($criteria) { if (!$criteria->hasCondition('manufacturer')) { return []; } /**@var $condition Condition\ManufacturerCondition*/ $condition = $criteria->getCondition('manufacturer'); return $condition->getManufacturerIds(); }
/** * @param ProductAttributeFacet $criteriaPart * @param $data * @param Criteria $criteria * @return RangeFacetResult */ private function createRangeResult(ProductAttributeFacet $criteriaPart, $data, Criteria $criteria) { $values = array_column($data['buckets'], 'key'); $min = min($values); $max = max($values); $template = $criteriaPart->getTemplate(); if (!$template) { $template = 'frontend/listing/filter/facet-range.tpl'; } $activeMin = $min; $activeMax = $max; /**@var $condition ProductAttributeCondition*/ if ($condition = $criteria->getCondition($criteriaPart->getName())) { $data = $condition->getValue(); $activeMin = $data['min']; $activeMax = $data['max']; } return new RangeFacetResult($criteriaPart->getName(), $criteria->hasCondition($criteriaPart->getName()), $criteriaPart->getLabel(), $min, $max, $activeMin, $activeMax, 'min' . $criteriaPart->getFormFieldName(), 'max' . $criteriaPart->getFormFieldName(), [], $template); }
/** * @param Criteria $criteria * @param ShopContextInterface $context * @return array */ private function getCategoryIds(Criteria $criteria, ShopContextInterface $context) { $queryCriteria = clone $criteria; $queryCriteria->resetConditions(); $queryCriteria->resetSorting(); $queryCriteria->removeBaseCondition('category'); $queryCriteria->removeCondition('category'); $query = $this->queryBuilderFactory->createQuery($queryCriteria, $context); $query->resetQueryPart('orderBy'); $query->resetQueryPart('groupBy'); $query->select(['productCategory.categoryID']); $query->innerJoin('product', 's_articles_categories_ro', 'productCategory', 'productCategory.articleID = product.id'); $query->groupBy('productCategory.categoryID'); if ($criteria->hasCondition('category')) { /**@var $condition CategoryCondition */ $condition = $criteria->getCondition('category'); $parentIds = $condition->getCategoryIds(); } else { $parentIds = [1]; } /**@var $statement \Doctrine\DBAL\Driver\ResultStatement */ $statement = $query->execute(); /**@var $facet Facet\CategoryFacet */ $ids = $statement->fetchAll(\PDO::FETCH_COLUMN); $query = $this->connection->createQueryBuilder(); $query->select(['category.id', 'category.path'])->from('s_categories', 'category')->where('category.parent IN (:parent) OR category.id IN (:parent)')->andWhere('category.id IN (:ids)')->andWhere('category.active = 1')->setParameter(':parent', $parentIds, Connection::PARAM_INT_ARRAY)->setParameter(':ids', $ids, Connection::PARAM_INT_ARRAY); $paths = $query->execute()->fetchAll(\PDO::FETCH_KEY_PAIR); $ids = array_keys($paths); $plain = array_values($paths); if (count($plain) > 0 && strpos($plain[0], '|') !== false) { $rootPath = explode('|', $plain[0]); $rootPath = array_filter(array_unique($rootPath)); $ids = array_merge($ids, $rootPath); return $ids; } return $ids; }
/** * @param Criteria $criteria * @return RadioFacetResult */ private function createFacet(Criteria $criteria) { $activeAverage = null; if ($criteria->hasCondition('vote_average')) { /**@var $condition VoteAverageCondition*/ $condition = $criteria->getCondition('vote_average'); $activeAverage = $condition->getAverage(); } $values = [new ValueListItem(1, '', $activeAverage == 1), new ValueListItem(2, '', $activeAverage == 2), new ValueListItem(3, '', $activeAverage == 3), new ValueListItem(4, '', $activeAverage == 4), new ValueListItem(5, '', $activeAverage == 5)]; $label = $this->snippetManager->getNamespace('frontend/listing/facet_labels')->get('vote_average', 'Ranking'); if (!($fieldName = $this->queryAliasMapper->getShortAlias('rating'))) { $fieldName = 'rating'; } return new RadioFacetResult('vote_average', $criteria->hasCondition('vote_average'), $label, $values, $fieldName, [], 'frontend/listing/filter/facet-rating.tpl'); }
/** * @param Criteria $criteria * @param $data * @return array */ private function getCategoryIds(Criteria $criteria, $data) { $ids = array_column($data, 'key'); if ($criteria->hasCondition('category')) { /**@var $condition CategoryCondition */ $condition = $criteria->getCondition('category'); $parentIds = $condition->getCategoryIds(); } else { $parentIds = [1]; } $query = $this->connection->createQueryBuilder(); $query->select(['category.id', 'category.path'])->from('s_categories', 'category')->where('category.parent IN (:parent) OR category.id IN (:parent)')->andWhere('category.id IN (:ids)')->andWhere('category.active = 1')->setParameter(':parent', $parentIds, Connection::PARAM_INT_ARRAY)->setParameter(':ids', $ids, Connection::PARAM_INT_ARRAY); $paths = $query->execute()->fetchAll(\PDO::FETCH_KEY_PAIR); $ids = array_keys($paths); $plain = array_values($paths); if (count($plain) > 0 && strpos($plain[0], '|') !== false) { $rootPath = explode('|', $plain[0]); $rootPath = array_filter(array_unique($rootPath)); $ids = array_merge($ids, $rootPath); return $ids; } return $ids; }