6
6
namespace Magento \CatalogSearch \Model \ResourceModel \Advanced ;
7
7
8
8
use Magento \Catalog \Model \Product ;
9
+ use Magento \Framework \Api \FilterBuilder ;
10
+ use Magento \Framework \Api \Search \SearchCriteriaBuilder ;
9
11
use Magento \Framework \Search \Adapter \Mysql \TemporaryStorage ;
10
12
11
13
/**
@@ -23,19 +25,24 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
23
25
private $ filters = [];
24
26
25
27
/**
26
- * @var \Magento\CatalogSearch\Model\Advanced\Request\Builder
28
+ * @var \Magento\Search\Api\SearchInterface
27
29
*/
28
- private $ requestBuilder ;
30
+ private $ search ;
29
31
30
32
/**
31
- * @var \Magento\Search\Model\SearchEngine
33
+ * @var \Magento\Framework\ Search\Adapter\Mysql\TemporaryStorageFactory
32
34
*/
33
- private $ searchEngine ;
35
+ private $ temporaryStorageFactory ;
34
36
35
37
/**
36
- * @var \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory
38
+ * @var SearchCriteriaBuilder
37
39
*/
38
- private $ temporaryStorageFactory ;
40
+ private $ searchCriteriaBuilder ;
41
+
42
+ /**
43
+ * @var FilterBuilder
44
+ */
45
+ private $ filterBuilder ;
39
46
40
47
/**
41
48
* Collection constructor.
@@ -59,10 +66,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
59
66
* @param \Magento\Framework\Stdlib\DateTime $dateTime
60
67
* @param \Magento\Customer\Api\GroupManagementInterface $groupManagement
61
68
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitation $productLimitation
62
- * @param \Magento\CatalogSearch\Model\Advanced\Request\Builder $requestBuilder
63
- * @param \Magento\Search\Model\SearchEngine $searchEngine
69
+ * @param \Magento\Search\Api\SearchInterface $search
64
70
* @param \Magento\Framework\Search\Adapter\Mysql\TemporaryStorageFactory $temporaryStorageFactory
65
- * @param \Zend_Db_Adapter_Abstract $connection
71
+ * @param SearchCriteriaBuilder $searchCriteriaBuilder
72
+ * @param FilterBuilder $filterBuilder
73
+ * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
66
74
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
67
75
*/
68
76
public function __construct (
@@ -86,14 +94,16 @@ public function __construct(
86
94
\Magento \Framework \Stdlib \DateTime $ dateTime ,
87
95
\Magento \Customer \Api \GroupManagementInterface $ groupManagement ,
88
96
\Magento \Catalog \Model \ResourceModel \Product \Collection \ProductLimitation $ productLimitation ,
89
- \Magento \CatalogSearch \Model \Advanced \Request \Builder $ requestBuilder ,
90
- \Magento \Search \Model \SearchEngine $ searchEngine ,
97
+ \Magento \Search \Api \SearchInterface $ search ,
91
98
\Magento \Framework \Search \Adapter \Mysql \TemporaryStorageFactory $ temporaryStorageFactory ,
92
- $ connection = null
99
+ SearchCriteriaBuilder $ searchCriteriaBuilder ,
100
+ FilterBuilder $ filterBuilder ,
101
+ \Magento \Framework \DB \Adapter \AdapterInterface $ connection = null
93
102
) {
94
- $ this ->requestBuilder = $ requestBuilder ;
95
- $ this ->searchEngine = $ searchEngine ;
103
+ $ this ->search = $ search ;
96
104
$ this ->temporaryStorageFactory = $ temporaryStorageFactory ;
105
+ $ this ->searchCriteriaBuilder = $ searchCriteriaBuilder ;
106
+ $ this ->filterBuilder = $ filterBuilder ;
97
107
parent ::__construct (
98
108
$ entityFactory ,
99
109
$ logger ,
@@ -140,19 +150,18 @@ public function addFieldsToFilter($fields)
140
150
protected function _renderFiltersBefore ()
141
151
{
142
152
if ($ this ->filters ) {
143
- $ this ->requestBuilder ->bindDimension ('scope ' , $ this ->getStoreId ());
144
- $ this ->requestBuilder ->setRequestName ('advanced_search_container ' );
145
153
foreach ($ this ->filters as $ attributes ) {
146
154
foreach ($ attributes as $ attributeCode => $ attributeValue ) {
147
155
$ attributeCode = $ this ->getAttributeCode ($ attributeCode );
148
- $ this ->requestBuilder -> bindRequestValue ($ attributeCode , $ attributeValue );
156
+ $ this ->addAttributeToSearch ($ attributeCode , $ attributeValue );
149
157
}
150
158
}
151
- $ queryRequest = $ this ->requestBuilder ->create ();
152
- $ queryResponse = $ this ->searchEngine ->search ($ queryRequest );
159
+ $ searchCriteria = $ this ->searchCriteriaBuilder ->create ();
160
+ $ searchCriteria ->setRequestName ('advanced_search_container ' );
161
+ $ searchResult = $ this ->search ->search ($ searchCriteria );
153
162
154
163
$ temporaryStorage = $ this ->temporaryStorageFactory ->create ();
155
- $ table = $ temporaryStorage ->storeDocuments ( $ queryResponse -> getIterator ());
164
+ $ table = $ temporaryStorage ->storeApiDocuments ( $ searchResult -> getItems ());
156
165
157
166
$ this ->getSelect ()->joinInner (
158
167
[
@@ -162,7 +171,7 @@ protected function _renderFiltersBefore()
162
171
[]
163
172
);
164
173
}
165
- return parent ::_renderFiltersBefore ();
174
+ parent ::_renderFiltersBefore ();
166
175
}
167
176
168
177
/**
@@ -178,4 +187,49 @@ private function getAttributeCode($attributeCode)
178
187
179
188
return $ attributeCode ;
180
189
}
190
+
191
+ /**
192
+ * Create a filter and add it to the SearchCriteriaBuilder.
193
+ *
194
+ * @param string $attributeCode
195
+ * @param array|string $attributeValue
196
+ * @return void
197
+ */
198
+ private function addAttributeToSearch ($ attributeCode , $ attributeValue )
199
+ {
200
+ if (isset ($ attributeValue ['from ' ]) || isset ($ attributeValue ['to ' ])) {
201
+ $ this ->addRangeAttributeToSearch ($ attributeCode , $ attributeValue );
202
+ } elseif (!is_array ($ attributeValue )) {
203
+ $ this ->filterBuilder ->setField ($ attributeCode )->setValue ($ attributeValue );
204
+ $ this ->searchCriteriaBuilder ->addFilter ($ this ->filterBuilder ->create ());
205
+ } elseif (isset ($ attributeValue ['like ' ])) {
206
+ $ this ->filterBuilder ->setField ($ attributeCode )->setValue ($ attributeValue ['like ' ]);
207
+ $ this ->searchCriteriaBuilder ->addFilter ($ this ->filterBuilder ->create ());
208
+ } elseif (isset ($ attributeValue ['in ' ])) {
209
+ $ this ->filterBuilder ->setField ($ attributeCode )->setValue ($ attributeValue ['in ' ]);
210
+ $ this ->searchCriteriaBuilder ->addFilter ($ this ->filterBuilder ->create ());
211
+ } elseif (isset ($ attributeValue ['in_set ' ])) {
212
+ $ this ->filterBuilder ->setField ($ attributeCode )->setValue ($ attributeValue ['in_set ' ]);
213
+ $ this ->searchCriteriaBuilder ->addFilter ($ this ->filterBuilder ->create ());
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Add attributes that have a range (from,to) to the SearchCriteriaBuilder.
219
+ *
220
+ * @param string $attributeCode
221
+ * @param array|string $attributeValue
222
+ * @return void
223
+ */
224
+ private function addRangeAttributeToSearch ($ attributeCode , $ attributeValue )
225
+ {
226
+ if (isset ($ attributeValue ['from ' ]) && '' !== $ attributeValue ['from ' ]) {
227
+ $ this ->filterBuilder ->setField ("{$ attributeCode }.from " )->setValue ($ attributeValue ['from ' ]);
228
+ $ this ->searchCriteriaBuilder ->addFilter ($ this ->filterBuilder ->create ());
229
+ }
230
+ if (isset ($ attributeValue ['to ' ]) && '' !== $ attributeValue ['to ' ]) {
231
+ $ this ->filterBuilder ->setField ("{$ attributeCode }.to " )->setValue ($ attributeValue ['to ' ]);
232
+ $ this ->searchCriteriaBuilder ->addFilter ($ this ->filterBuilder ->create ());
233
+ }
234
+ }
181
235
}
0 commit comments