10 use Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory;
33 private $productAttributeCollectionFactory;
38 private $generatorResolver;
45 CollectionFactory $productAttributeCollectionFactory,
48 $this->productAttributeCollectionFactory = $productAttributeCollectionFactory;
49 $this->generatorResolver = $generatorResolver
61 $requests[
'catalog_view_container'] =
63 $requests[
'quick_search_container'] =
65 $requests[
'advanced_search_container'] = $this->generateAdvancedSearchRequest();
77 private function generateRequest($attributeType, $container, $useFulltext)
80 foreach ($this->getSearchableAttributes() as
$attribute) {
82 if (!in_array(
$attribute->getAttributeCode(), [
'price',
'category_ids'],
true)) {
83 $queryName =
$attribute->getAttributeCode() .
'_query';
84 $request[
'queries'][$container][
'queryReference'][] = [
92 'filterReference' => [
106 if (!
$attribute->getIsSearchable() || in_array(
$attribute->getAttributeCode(), [
'price',
'sku'],
true)) {
121 protected function getSearchableAttributes()
124 $productAttributes = $this->productAttributeCollectionFactory->create();
125 $productAttributes->addFieldToFilter(
126 [
'is_searchable',
'is_visible_in_advanced_search',
'is_filterable',
'is_filterable_in_search'],
130 return $productAttributes;
139 private function generateAdvancedSearchRequest()
142 foreach ($this->getSearchableAttributes() as
$attribute) {
144 if (!
$attribute->getIsVisibleInAdvancedSearch()) {
147 if (in_array(
$attribute->getAttributeCode(), [
'price',
'sku'])) {
151 $queryName =
$attribute->getAttributeCode() .
'_query';
152 $request[
'queries'][
'advanced_search_container'][
'queryReference'][] = [
161 if (
$attribute->getFrontendInput() ===
'multiselect') {
164 'name' => $queryName,
166 'filterReference' => [
168 'ref' => $filterName,
172 $request[
'filters'][$filterName] = [
174 'name' => $filterName,
176 'value' =>
'$' .
$attribute->getAttributeCode() .
'$',
180 'name' => $queryName,
181 'type' =>
'matchQuery',
182 'value' =>
'$' .
$attribute->getAttributeCode() .
'$',
186 'boost' =>
$attribute->getSearchWeight() ?: 1,
197 'name' => $queryName,
199 'filterReference' => [
201 'ref' => $filterName,
205 $request[
'filters'][$filterName] = [
207 'name' => $filterName,
209 'from' =>
'$' .
$attribute->getAttributeCode() .
'.from$',
210 'to' =>
'$' .
$attribute->getAttributeCode() .
'.to$',
216 'name' => $queryName,
218 'filterReference' => [
220 'ref' => $filterName,
224 $request[
'filters'][$filterName] = [
226 'name' => $filterName,
228 'value' =>
'$' .
$attribute->getAttributeCode() .
'$',
247 if ($useFulltext &&
$attribute->getFrontendInput() !==
'price') {
248 $request[
'queries'][
'search'][
'match'][] = [
250 'boost' =>
$attribute->getSearchWeight() ?: 1,
__construct(CollectionFactory $productAttributeCollectionFactory, GeneratorResolver $generatorResolver=null)
const IS_FILTERABLE_IN_SEARCH