Example #1
0
 /**
  * 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()]);
 }
Example #2
0
 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());
 }
Example #3
0
 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);
 }
Example #4
0
 /**
  * @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;
 }
Example #11
0
 /**
  * @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;
 }