requestBuilder = $requestBuilder; $this->searchEngine = $searchEngine; $this->temporaryStorageFactory = $temporaryStorageFactory; if ($searchResultFactory === null) { $this->searchResultFactory = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\Search\SearchResultFactory::class); } parent::__construct( $entityFactory, $logger, $fetchStrategy, $eventManager, $eavConfig, $resource, $eavEntityFactory, $resourceHelper, $universalFactory, $storeManager, $moduleManager, $catalogProductFlatState, $scopeConfig, $productOptionFactory, $catalogUrl, $localeDate, $customerSession, $dateTime, $groupManagement, $connection, $productLimitationFactory, $metadataPool ); } /** * Add not indexable fields to search * * @param array $fields * @return $this * @throws \Magento\Framework\Exception\LocalizedException */ public function addFieldsToFilter($fields) { if ($fields) { $this->filters = array_merge($this->filters, $fields); } return $this; } /** * @inheritdoc */ protected function _renderFiltersBefore() { if ($this->filters) { foreach ($this->filters as $attributes) { foreach ($attributes as $attributeCode => $attributeValue) { $attributeCode = $this->getAttributeCode($attributeCode); $this->addAttributeToSearch($attributeCode, $attributeValue); } } $searchCriteria = $this->getSearchCriteriaBuilder()->create(); $searchCriteria->setRequestName('advanced_search_container'); try { $searchResult = $this->getSearch()->search($searchCriteria); } catch (EmptyRequestDataException $e) { /** @var \Magento\Framework\Api\Search\SearchResultInterface $searchResult */ $searchResult = $this->searchResultFactory->create()->setItems([]); } catch (NonExistingRequestNameException $e) { $this->_logger->error($e->getMessage()); throw new LocalizedException( __('An error occurred. For details, see the error log.') ); } $temporaryStorage = $this->temporaryStorageFactory->create(); $table = $temporaryStorage->storeApiDocuments($searchResult->getItems()); $this->getSelect()->joinInner( [ 'search_result' => $table->getName(), ], 'e.entity_id = search_result.' . TemporaryStorage::FIELD_ENTITY_ID, [] ); } parent::_renderFiltersBefore(); } /** * Get attribute code. * * @param string $attributeCode * @return string */ private function getAttributeCode($attributeCode) { if (is_numeric($attributeCode)) { $attributeCode = $this->_eavConfig->getAttribute(Product::ENTITY, $attributeCode) ->getAttributeCode(); } return $attributeCode; } /** * Create a filter and add it to the SearchCriteriaBuilder. * * @param string $attributeCode * @param array|string $attributeValue * @return void */ private function addAttributeToSearch($attributeCode, $attributeValue) { if (isset($attributeValue['from']) || isset($attributeValue['to'])) { $this->addRangeAttributeToSearch($attributeCode, $attributeValue); } elseif (!is_array($attributeValue)) { $this->getFilterBuilder()->setField($attributeCode)->setValue($attributeValue); $this->getSearchCriteriaBuilder()->addFilter($this->getFilterBuilder()->create()); } elseif (isset($attributeValue['like'])) { $this->getFilterBuilder()->setField($attributeCode)->setValue($attributeValue['like']); $this->getSearchCriteriaBuilder()->addFilter($this->getFilterBuilder()->create()); } elseif (isset($attributeValue['in'])) { $this->getFilterBuilder()->setField($attributeCode)->setValue($attributeValue['in']); $this->getSearchCriteriaBuilder()->addFilter($this->getFilterBuilder()->create()); } elseif (isset($attributeValue['in_set'])) { $this->getFilterBuilder()->setField($attributeCode)->setValue($attributeValue['in_set']); $this->getSearchCriteriaBuilder()->addFilter($this->getFilterBuilder()->create()); } } /** * Add attributes that have a range (from,to) to the SearchCriteriaBuilder. * * @param string $attributeCode * @param array|string $attributeValue * @return void */ private function addRangeAttributeToSearch($attributeCode, $attributeValue) { if (isset($attributeValue['from']) && '' !== $attributeValue['from']) { $this->getFilterBuilder()->setField("{$attributeCode}.from")->setValue($attributeValue['from']); $this->getSearchCriteriaBuilder()->addFilter($this->getFilterBuilder()->create()); } if (isset($attributeValue['to']) && '' !== $attributeValue['to']) { $this->getFilterBuilder()->setField("{$attributeCode}.to")->setValue($attributeValue['to']); $this->getSearchCriteriaBuilder()->addFilter($this->getFilterBuilder()->create()); } } /** * Get search. * * @return \Magento\Search\Api\SearchInterface */ private function getSearch() { if (null === $this->search) { $this->search = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Search\Api\SearchInterface::class); } return $this->search; } /** * Get search criteria builder. * * @return SearchCriteriaBuilder */ private function getSearchCriteriaBuilder() { if (null === $this->searchCriteriaBuilder) { $this->searchCriteriaBuilder = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\Search\SearchCriteriaBuilder::class); } return $this->searchCriteriaBuilder; } /** * Get filter builder. * * @return FilterBuilder */ private function getFilterBuilder() { if (null === $this->filterBuilder) { $this->filterBuilder = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\FilterBuilder::class); } return $this->filterBuilder; } }