Skip to content

Commit efa9e6d

Browse files
committed
Merge remote-tracking branch 'origin/MC-31432' into 2.4-develop-pr15
2 parents 81837a8 + dd19ffb commit efa9e6d

File tree

3 files changed

+127
-43
lines changed

3 files changed

+127
-43
lines changed

app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,6 +1904,7 @@ protected function _productLimitationJoinPrice()
19041904
* @see \Magento\Catalog\Model\ResourceModel\Product\Collection::_productLimitationJoinPrice()
19051905
* @param bool $joinLeft
19061906
* @return $this
1907+
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
19071908
*/
19081909
protected function _productLimitationPrice($joinLeft = false)
19091910
{
@@ -1922,14 +1923,14 @@ protected function _productLimitationPrice($joinLeft = false)
19221923

19231924
$connection = $this->getConnection();
19241925
$select = $this->getSelect();
1925-
$joinCond = join(
1926-
' AND ',
1927-
[
1928-
'price_index.entity_id = e.entity_id',
1929-
$connection->quoteInto('price_index.website_id = ?', $filters['website_id']),
1930-
$connection->quoteInto('price_index.customer_group_id = ?', $filters['customer_group_id'])
1931-
]
1932-
);
1926+
$joinCondArray = [];
1927+
$joinCondArray[] = 'price_index.entity_id = e.entity_id';
1928+
$joinCondArray[] = $connection->quoteInto('price_index.customer_group_id = ?', $filters['customer_group_id']);
1929+
// Add website condition only if it's different from admin scope
1930+
if (((int) $filters['website_id']) !== Store::DEFAULT_STORE_ID) {
1931+
$joinCondArray[] = $connection->quoteInto('price_index.website_id = ?', $filters['website_id']);
1932+
}
1933+
$joinCond = join(' AND ', $joinCondArray);
19331934

19341935
$fromPart = $select->getPart(\Magento\Framework\DB\Select::FROM);
19351936
if (!isset($fromPart['price_index'])) {

app/code/Magento/CatalogWidget/Model/Rule/Condition/Product.php

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
use Magento\Catalog\Api\Data\ProductInterface;
1313
use Magento\Catalog\Model\ProductCategoryList;
14+
use Magento\Catalog\Model\ResourceModel\Product\Collection;
1415
use Magento\Store\Model\Store;
1516

1617
/**
@@ -122,59 +123,47 @@ protected function _addSpecialAttributes(array &$attributes)
122123
/**
123124
* Add condition to collection
124125
*
125-
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
126+
* @param Collection $collection
126127
* @return $this
127128
*/
128129
public function addToCollection($collection)
129130
{
130131
$attribute = $this->getAttributeObject();
132+
$attributeCode = $attribute->getAttributeCode();
133+
if ($attributeCode !== 'price' || !$collection->getLimitationFilters()->isUsingPriceIndex()) {
134+
if ($collection->isEnabledFlat()) {
135+
if ($attribute->isEnabledInFlat()) {
136+
$alias = array_keys($collection->getSelect()->getPart('from'))[0];
137+
$this->joinedAttributes[$attributeCode] = $alias . '.' . $attributeCode;
138+
} else {
139+
$alias = 'at_' . $attributeCode;
140+
if (!in_array($alias, array_keys($collection->getSelect()->getPart('from')))) {
141+
$collection->joinAttribute($attributeCode, "catalog_product/$attributeCode", 'entity_id');
142+
}
131143

132-
if ($collection->isEnabledFlat()) {
133-
if ($attribute->isEnabledInFlat()) {
134-
$alias = array_keys($collection->getSelect()->getPart('from'))[0];
135-
$this->joinedAttributes[$attribute->getAttributeCode()] = $alias . '.' . $attribute->getAttributeCode();
136-
} else {
137-
$alias = 'at_' . $attribute->getAttributeCode();
138-
if (!in_array($alias, array_keys($collection->getSelect()->getPart('from')))) {
139-
$collection->joinAttribute(
140-
$attribute->getAttributeCode(),
141-
'catalog_product/'.$attribute->getAttributeCode(),
142-
'entity_id'
143-
);
144+
$this->joinedAttributes[$attributeCode] = $alias . '.value';
144145
}
145-
146-
$this->joinedAttributes[$attribute->getAttributeCode()] = $alias . '.value';
146+
} elseif ($attributeCode !== 'category_ids' && !$attribute->isStatic()) {
147+
$this->addAttributeToCollection($attribute, $collection);
148+
$attributes = $this->getRule()->getCollectedAttributes();
149+
$attributes[$attributeCode] = true;
150+
$this->getRule()->setCollectedAttributes($attributes);
147151
}
148-
return $this;
149152
}
150153

151-
if ('category_ids' == $attribute->getAttributeCode() || $attribute->isStatic()) {
152-
return $this;
153-
}
154-
155-
if ($attribute->getBackend() && $attribute->isScopeGlobal()) {
156-
$this->addGlobalAttribute($attribute, $collection);
157-
} else {
158-
$this->addNotGlobalAttribute($attribute, $collection);
159-
}
160-
161-
$attributes = $this->getRule()->getCollectedAttributes();
162-
$attributes[$attribute->getAttributeCode()] = true;
163-
$this->getRule()->setCollectedAttributes($attributes);
164-
165154
return $this;
166155
}
167156

168157
/**
169158
* Adds Attributes that belong to Global Scope
170159
*
171160
* @param \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute
172-
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
161+
* @param Collection $collection
173162
* @return $this
174163
*/
175164
protected function addGlobalAttribute(
176165
\Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute,
177-
\Magento\Catalog\Model\ResourceModel\Product\Collection $collection
166+
Collection $collection
178167
) {
179168
switch ($attribute->getBackendType()) {
180169
case 'decimal':
@@ -207,12 +196,12 @@ protected function addGlobalAttribute(
207196
* Adds Attributes that don't belong to Global Scope
208197
*
209198
* @param \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute
210-
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
199+
* @param Collection $collection
211200
* @return $this
212201
*/
213202
protected function addNotGlobalAttribute(
214203
\Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute,
215-
\Magento\Catalog\Model\ResourceModel\Product\Collection $collection
204+
Collection $collection
216205
) {
217206
$storeId = $this->storeManager->getStore()->getId();
218207
$values = $collection->getAllAttributeValues($attribute);
@@ -255,6 +244,8 @@ public function getMappedSqlField()
255244
$result = parent::getMappedSqlField();
256245
} elseif (isset($this->joinedAttributes[$this->getAttribute()])) {
257246
$result = $this->joinedAttributes[$this->getAttribute()];
247+
} elseif ($this->getAttribute() === 'price') {
248+
$result = 'price_index.min_price';
258249
} elseif ($this->getAttributeObject()->isStatic()) {
259250
$result = $this->getAttributeObject()->getAttributeCode();
260251
} elseif ($this->getValueParsed()) {
@@ -267,11 +258,27 @@ public function getMappedSqlField()
267258
/**
268259
* @inheritdoc
269260
*
270-
* @param \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection
261+
* @param Collection $productCollection
271262
* @return $this
272263
*/
273264
public function collectValidatedAttributes($productCollection)
274265
{
275266
return $this->addToCollection($productCollection);
276267
}
268+
269+
/**
270+
* Add attribute to collection based on scope
271+
*
272+
* @param \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute
273+
* @param Collection $collection
274+
* @return void
275+
*/
276+
private function addAttributeToCollection($attribute, $collection): void
277+
{
278+
if ($attribute->getBackend() && $attribute->isScopeGlobal()) {
279+
$this->addGlobalAttribute($attribute, $collection);
280+
} else {
281+
$this->addNotGlobalAttribute($attribute, $collection);
282+
}
283+
}
277284
}

dev/tests/integration/testsuite/Magento/CatalogWidget/Block/Product/ProductListTest.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,80 @@ public function testCreateAnchorCollection()
256256
"Anchor root category does not contain products of it's children."
257257
);
258258
}
259+
260+
/**
261+
* Test that price rule condition works correctly
262+
*
263+
* @magentoDbIsolation disabled
264+
* @magentoDataFixture Magento/Catalog/_files/category_with_different_price_products.php
265+
* @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
266+
* @param string $operator
267+
* @param int $value
268+
* @param array $matches
269+
* @dataProvider priceFilterDataProvider
270+
*/
271+
public function testPriceFilter(string $operator, int $value, array $matches)
272+
{
273+
$encodedConditions = '^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,
274+
`aggregator`:`all`,`value`:`1`,`new_child`:``^],
275+
`1--1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Product`,
276+
`attribute`:`price`,
277+
`operator`:`' . $operator . '`,`value`:`' . $value . '`^]^]';
278+
279+
$this->block->setData('conditions_encoded', $encodedConditions);
280+
281+
$productCollection = $this->block->createCollection();
282+
$productCollection->load();
283+
$skus = array_map(
284+
function ($item) {
285+
return $item['sku'];
286+
},
287+
$productCollection->getItems()
288+
);
289+
$this->assertEquals($matches, $skus, '', 0.0, 10, true);
290+
}
291+
292+
public function priceFilterDataProvider(): array
293+
{
294+
return [
295+
[
296+
'>',
297+
10,
298+
[
299+
'simple1001',
300+
]
301+
],
302+
[
303+
'>=',
304+
10,
305+
[
306+
'simple1000',
307+
'simple1001',
308+
'configurable',
309+
]
310+
],
311+
[
312+
'<',
313+
10,
314+
[]
315+
],
316+
[
317+
'<',
318+
20,
319+
[
320+
'simple1000',
321+
'configurable',
322+
]
323+
],
324+
[
325+
'<=',
326+
20,
327+
[
328+
'simple1000',
329+
'simple1001',
330+
'configurable',
331+
]
332+
],
333+
];
334+
}
259335
}

0 commit comments

Comments
 (0)