6
6
7
7
namespace Magento \CatalogSearch \Model \ResourceModel \Advanced ;
8
8
9
+ use Magento \Catalog \Model \Category ;
9
10
use Magento \Catalog \Model \Product ;
11
+ use Magento \Catalog \Model \ResourceModel \Product \Collection \ProductLimitationFactory ;
12
+ use Magento \CatalogSearch \Model \ResourceModel \Advanced ;
10
13
use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \DefaultFilterStrategyApplyChecker ;
11
14
use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \DefaultFilterStrategyApplyCheckerInterface ;
15
+ use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchCriteriaResolverFactory ;
12
16
use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchCriteriaResolverInterface ;
17
+ use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchResultApplierFactory ;
13
18
use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchResultApplierInterface ;
14
- use Magento \Framework \Search \EngineResolverInterface ;
15
- use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \TotalRecordsResolverInterface ;
16
19
use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \TotalRecordsResolverFactory ;
20
+ use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \TotalRecordsResolverInterface ;
21
+ use Magento \Eav \Model \Entity \Attribute \AbstractAttribute ;
17
22
use Magento \Framework \Api \FilterBuilder ;
18
- use Magento \Framework \DB \Select ;
19
23
use Magento \Framework \Api \Search \SearchCriteriaBuilder ;
20
24
use Magento \Framework \Api \Search \SearchResultFactory ;
25
+ use Magento \Framework \Api \Search \SearchResultInterface ;
26
+ use Magento \Framework \App \ObjectManager ;
27
+ use Magento \Framework \DB \Select ;
21
28
use Magento \Framework \EntityManager \MetadataPool ;
22
29
use Magento \Framework \Exception \LocalizedException ;
30
+ use Magento \Framework \Search \EngineResolverInterface ;
23
31
use Magento \Framework \Search \Request \EmptyRequestDataException ;
24
32
use Magento \Framework \Search \Request \NonExistingRequestNameException ;
25
- use Magento \Catalog \Model \ResourceModel \Product \Collection \ProductLimitationFactory ;
26
- use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchCriteriaResolverFactory ;
27
- use Magento \CatalogSearch \Model \ResourceModel \Fulltext \Collection \SearchResultApplierFactory ;
28
- use Magento \Framework \App \ObjectManager ;
29
- use Magento \Framework \Api \Search \SearchResultInterface ;
30
33
31
34
/**
32
35
* Advanced search collection
@@ -106,6 +109,11 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
106
109
*/
107
110
private $ defaultFilterStrategyApplyChecker ;
108
111
112
+ /**
113
+ * @var Advanced
114
+ */
115
+ private $ advancedSearchResource ;
116
+
109
117
/**
110
118
* Collection constructor
111
119
*
@@ -141,6 +149,7 @@ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
141
149
* @param TotalRecordsResolverFactory|null $totalRecordsResolverFactory
142
150
* @param EngineResolverInterface|null $engineResolver
143
151
* @param DefaultFilterStrategyApplyCheckerInterface|null $defaultFilterStrategyApplyChecker
152
+ * @param Advanced|null $advancedSearchResource
144
153
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
145
154
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
146
155
*/
@@ -176,7 +185,8 @@ public function __construct(
176
185
SearchResultApplierFactory $ searchResultApplierFactory = null ,
177
186
TotalRecordsResolverFactory $ totalRecordsResolverFactory = null ,
178
187
EngineResolverInterface $ engineResolver = null ,
179
- DefaultFilterStrategyApplyCheckerInterface $ defaultFilterStrategyApplyChecker = null
188
+ DefaultFilterStrategyApplyCheckerInterface $ defaultFilterStrategyApplyChecker = null ,
189
+ Advanced $ advancedSearchResource = null
180
190
) {
181
191
$ this ->searchRequestName = $ searchRequestName ;
182
192
if ($ searchResultFactory === null ) {
@@ -193,6 +203,8 @@ public function __construct(
193
203
->get (EngineResolverInterface::class);
194
204
$ this ->defaultFilterStrategyApplyChecker = $ defaultFilterStrategyApplyChecker ?: ObjectManager::getInstance ()
195
205
->get (DefaultFilterStrategyApplyChecker::class);
206
+ $ this ->advancedSearchResource = $ advancedSearchResource ?: ObjectManager::getInstance ()
207
+ ->get (Advanced::class);
196
208
parent ::__construct (
197
209
$ entityFactory ,
198
210
$ logger ,
@@ -258,14 +270,14 @@ public function setOrder($attribute, $dir = Select::SQL_DESC)
258
270
*/
259
271
public function addCategoryFilter (\Magento \Catalog \Model \Category $ category )
260
272
{
273
+ $ this ->setAttributeFilterData (Category::ENTITY , 'category_ids ' , $ category ->getId ());
261
274
/**
262
275
* This changes need in backward compatible reasons for support dynamic improved algorithm
263
276
* for price aggregation process.
264
277
*/
265
278
if ($ this ->defaultFilterStrategyApplyChecker ->isApplicable ()) {
266
279
parent ::addCategoryFilter ($ category );
267
280
} else {
268
- $ this ->addFieldToFilter ('category_ids ' , $ category ->getId ());
269
281
$ this ->_productLimitationPrice ();
270
282
}
271
283
@@ -278,14 +290,13 @@ public function addCategoryFilter(\Magento\Catalog\Model\Category $category)
278
290
*/
279
291
public function setVisibility ($ visibility )
280
292
{
293
+ $ this ->setAttributeFilterData (Product::ENTITY , 'visibility ' , $ visibility );
281
294
/**
282
295
* This changes need in backward compatible reasons for support dynamic improved algorithm
283
296
* for price aggregation process.
284
297
*/
285
298
if ($ this ->defaultFilterStrategyApplyChecker ->isApplicable ()) {
286
299
parent ::setVisibility ($ visibility );
287
- } else {
288
- $ this ->addFieldToFilter ('visibility ' , $ visibility );
289
300
}
290
301
291
302
return $ this ;
@@ -306,6 +317,25 @@ private function setSearchOrder($field, $direction)
306
317
$ this ->searchOrders [$ field ] = $ direction ;
307
318
}
308
319
320
+ /**
321
+ * Prepare attribute data to filter.
322
+ *
323
+ * @param string $entityType
324
+ * @param string $attributeCode
325
+ * @param mixed $condition
326
+ * @return $this
327
+ */
328
+ private function setAttributeFilterData (string $ entityType , string $ attributeCode , $ condition ): self
329
+ {
330
+ /** @var AbstractAttribute $attribute */
331
+ $ attribute = $ this ->_eavConfig ->getAttribute ($ entityType , $ attributeCode );
332
+ $ table = $ attribute ->getBackend ()->getTable ();
333
+ $ condition = $ this ->advancedSearchResource ->prepareCondition ($ attribute , $ condition );
334
+ $ this ->addFieldsToFilter ([$ table => [$ attributeCode => $ condition ]]);
335
+
336
+ return $ this ;
337
+ }
338
+
309
339
/**
310
340
* @inheritdoc
311
341
*/
@@ -377,7 +407,7 @@ public function _loadEntities($printQuery = false, $logQuery = false)
377
407
$ query = $ this ->getSelect ();
378
408
$ rows = $ this ->_fetchAll ($ query );
379
409
} catch (\Exception $ e ) {
380
- $ this ->printLogQuery (false , true , $ query );
410
+ $ this ->printLogQuery (false , true , $ query ?? null );
381
411
throw $ e ;
382
412
}
383
413
0 commit comments