@@ -134,18 +134,21 @@ private function updateAnchorCategoryConditions(array $condition): array
134
134
* Retrieve product collection based on provided conditions
135
135
*
136
136
* @param string $conditions
137
+ * @param bool $usePriceIndex use minimal price from price index to filter by price.
138
+ * If TRUE only enabled products will be returned, as price indexer does not include disabled products
137
139
* @return Collection
138
140
* @throws LocalizedException
139
141
*/
140
- private function getProductCollection (string $ conditions ): Collection
142
+ private function getProductCollection (string $ conditions, bool $ usePriceIndex = true ): Collection
141
143
{
142
144
/** @var $collection Collection */
143
145
$ collection = $ this ->productCollectionFactory ->create ();
146
+ if ($ usePriceIndex && strpos ($ conditions , '"attribute":"price" ' ) !== false ) {
147
+ $ collection ->addMinimalPrice ();
148
+ }
144
149
145
- /** @var Combine $collectionConditions */
146
- $ collectionConditions = $ this ->decodeConditions ($ conditions );
147
- $ collectionConditions ->collectValidatedAttributes ($ collection );
148
- $ this ->sqlBuilder ->attachConditionToCollection ($ collection , $ collectionConditions );
150
+ $ collection = $ this ->applyConditionsToCollection ($ conditions , $ collection );
151
+ $ collection = $ this ->excludeLinkedProducts ($ collection );
149
152
150
153
/**
151
154
* Prevent retrieval of duplicate records. This may occur when multiselect product attribute matches
@@ -156,38 +159,90 @@ private function getProductCollection(string $conditions): Collection
156
159
return $ collection ;
157
160
}
158
161
162
+ /**
163
+ * Retrieve count of all enabled products
164
+ *
165
+ * @param string $conditions
166
+ * @return int number of enabled products
167
+ */
168
+ private function getEnabledCount (string $ conditions ): int
169
+ {
170
+ $ collection = $ this ->getProductCollection ($ conditions , true );
171
+ $ collection ->addAttributeToFilter ('status ' , Status::STATUS_ENABLED );
172
+ return $ collection ->getSize ();
173
+ }
174
+
159
175
/**
160
176
* Retrieve count of all disabled products
161
177
*
162
- * @param Collection $baseCollection
178
+ * @param string $conditions
163
179
* @return int number of disabled products
164
180
*/
165
- private function getDisabledCount (Collection $ baseCollection ): int
181
+ private function getDisabledCount (string $ conditions ): int
166
182
{
167
- /** @var Collection $disabledCollection */
168
- $ disabledCollection = clone $ baseCollection ;
169
- $ disabledCollection ->addAttributeToFilter ('status ' , Status::STATUS_DISABLED );
170
- return $ disabledCollection ->getSize ();
183
+ $ collection = $ this ->getProductCollection ($ conditions , false );
184
+ $ collection ->addAttributeToFilter ('status ' , Status::STATUS_DISABLED );
185
+ return $ collection ->getSize ();
171
186
}
172
187
173
188
/**
174
189
* Retrieve count of all not visible individually products
175
190
*
176
- * @param Collection $baseCollection
191
+ * @param string $conditions
177
192
* @return int number of products not visible individually
178
193
*/
179
- private function getNotVisibleCount (Collection $ baseCollection ): int
194
+ private function getNotVisibleCount (string $ conditions ): int
180
195
{
181
- $ notVisibleCollection = clone $ baseCollection ;
182
- $ notVisibleCollection ->addAttributeToFilter ('status ' , Status::STATUS_ENABLED );
183
- $ notVisibleCollection ->addAttributeToFilter (
196
+ $ collection = $ this -> getProductCollection ( $ conditions , true ) ;
197
+ $ collection ->addAttributeToFilter ('status ' , Status::STATUS_ENABLED );
198
+ $ collection ->addAttributeToFilter (
184
199
'visibility ' ,
185
200
[
186
201
Visibility::VISIBILITY_NOT_VISIBLE ,
187
202
Visibility::VISIBILITY_IN_SEARCH
188
203
]
189
204
);
190
- return $ notVisibleCollection ->getSize ();
205
+ return $ collection ->getSize ();
206
+ }
207
+
208
+ /**
209
+ * Exclude any linked products, e.g. simple products assigned to a configurable, bundle or group
210
+ *
211
+ * @param Collection $collection
212
+ * @return Collection
213
+ */
214
+ private function excludeLinkedProducts (Collection $ collection ): Collection
215
+ {
216
+ $ collection ->getSelect ()
217
+ ->joinLeft (
218
+ ['super_link_table ' => $ collection ->getTable ('catalog_product_super_link ' )],
219
+ 'super_link_table.product_id = e.entity_id ' ,
220
+ ['product_id ' ]
221
+ )
222
+ ->joinLeft (
223
+ ['link_table ' => $ collection ->getTable ('catalog_product_link ' )],
224
+ 'link_table.product_id = e.entity_id ' ,
225
+ ['product_id ' ]
226
+ )
227
+ ->where ('link_table.product_id IS NULL OR super_link_table.product_id IS NULL ' );
228
+ return $ collection ;
229
+ }
230
+
231
+ /**
232
+ * Apply conditions to collection
233
+ *
234
+ * @param string $conditions
235
+ * @param Collection $collection
236
+ * @return Collection
237
+ * @throws LocalizedException
238
+ */
239
+ private function applyConditionsToCollection (string $ conditions , Collection $ collection ): Collection
240
+ {
241
+ /** @var Combine $collectionConditions */
242
+ $ collectionConditions = $ this ->decodeConditions ($ conditions );
243
+ $ collectionConditions ->collectValidatedAttributes ($ collection );
244
+ $ this ->sqlBuilder ->attachConditionToCollection ($ collection , $ collectionConditions );
245
+ return $ collection ;
191
246
}
192
247
193
248
/**
@@ -200,25 +255,12 @@ private function getNotVisibleCount(Collection $baseCollection): int
200
255
*/
201
256
public function getProductTotals (string $ conditions ): array
202
257
{
203
- /** @var Collection $collection */
204
- $ collection = $ this ->getProductCollection ($ conditions );
205
-
206
- // Exclude any linked products, e.g. simple products assigned to a configurable, bundle or group
207
- $ collection ->getSelect ()->joinLeft (
208
- ['super_link_table ' => $ collection ->getTable ('catalog_product_super_link ' )],
209
- 'super_link_table.product_id = e.entity_id ' ,
210
- ['product_id ' ]
211
- )->joinLeft (
212
- ['link_table ' => $ collection ->getTable ('catalog_product_link ' )],
213
- 'link_table.product_id = e.entity_id ' ,
214
- ['product_id ' ]
215
- )->where ('link_table.product_id IS NULL OR super_link_table.product_id IS NULL ' );
216
-
217
- $ disabledCount = $ this ->getDisabledCount ($ collection );
218
- $ notVisibleCount = $ this ->getNotVisibleCount ($ collection );
258
+ $ enabledCount = $ this ->getEnabledCount ($ conditions );
259
+ $ disabledCount = $ this ->getDisabledCount ($ conditions );
260
+ $ notVisibleCount = $ this ->getNotVisibleCount ($ conditions );
219
261
220
262
return [
221
- 'total ' => $ collection -> getSize () ,
263
+ 'total ' => $ enabledCount + $ disabledCount ,
222
264
'disabled ' => $ disabledCount ,
223
265
'notVisible ' => $ notVisibleCount ,
224
266
];
0 commit comments