Skip to content

Commit 3a7e3c6

Browse files
committed
fix-configurable-sorting-child-match-39929
magento#39929
1 parent a04b0ef commit 3a7e3c6

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed

app/code/Magento/ConfigurableProduct/Plugin/CatalogWidget/Block/Product/ProductsListPlugin.php

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,15 @@
88
namespace Magento\ConfigurableProduct\Plugin\CatalogWidget\Block\Product;
99

1010
use Magento\Catalog\Model\Product;
11-
use Magento\Catalog\Model\Product\Visibility;
1211
use Magento\Catalog\Model\ResourceModel\Product\Collection;
13-
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
1412
use Magento\CatalogWidget\Block\Product\ProductsList;
1513
use Magento\Framework\App\ResourceConnection;
14+
use Magento\Framework\DB\Select;
1615
use Magento\Framework\EntityManager\MetadataPool;
1716
use Magento\Framework\Exception\LocalizedException;
1817

1918
class ProductsListPlugin
2019
{
21-
/**
22-
* @var CollectionFactory
23-
*/
24-
private CollectionFactory $productCollectionFactory;
25-
26-
/**
27-
* @var Visibility
28-
*/
29-
private Visibility $catalogProductVisibility;
30-
3120
/**
3221
* @var ResourceConnection
3322
*/
@@ -39,19 +28,13 @@ class ProductsListPlugin
3928
private MetadataPool $metadataPool;
4029

4130
/**
42-
* @param CollectionFactory $productCollectionFactory
43-
* @param Visibility $catalogProductVisibility
4431
* @param ResourceConnection $resource
4532
* @param MetadataPool $metadataPool
4633
*/
4734
public function __construct(
48-
CollectionFactory $productCollectionFactory,
49-
Visibility $catalogProductVisibility,
5035
ResourceConnection $resource,
5136
MetadataPool $metadataPool
5237
) {
53-
$this->productCollectionFactory = $productCollectionFactory;
54-
$this->catalogProductVisibility = $catalogProductVisibility;
5538
$this->resource = $resource;
5639
$this->metadataPool = $metadataPool;
5740
}
@@ -95,18 +78,36 @@ public function afterCreateCollection(ProductsList $subject, Collection $result)
9578
->where('link_table.product_id IN (?)', $searchProducts)
9679
);
9780

98-
$configurableProductCollection = $this->productCollectionFactory->create();
99-
$configurableProductCollection->setVisibility($this->catalogProductVisibility->getVisibleInCatalogIds());
100-
$configurableProductCollection->addIdFilter($productIds);
101-
102-
/** @var Product $item */
103-
foreach ($configurableProductCollection->getItems() as $item) {
104-
if (false === in_array($item->getId(), $currentIds)) {
105-
$result->addItem($item->load($item->getId()));
106-
}
81+
if (empty($productIds)) {
82+
return $result;
10783
}
84+
$this->addParentProductsToSelect($result, $productIds);
10885
}
10986

11087
return $result;
11188
}
89+
90+
/**
91+
* @param Collection $result The product collection
92+
* @param array $productIds Array of parent product IDs to include
93+
* @return void
94+
*/
95+
protected function addParentProductsToSelect(Collection $result, array $productIds): void
96+
{
97+
$connection = $this->resource->getConnection();
98+
$select = $result->getSelect();
99+
$originalWhere = $select->getPart(Select::WHERE);
100+
if (!empty($originalWhere)) {
101+
$originalWhere = array_filter($originalWhere, 'strlen');
102+
}
103+
$parentCondition = $connection->quoteInto('e.entity_id IN (?)', $productIds);
104+
105+
$newWhere = [];
106+
if (!empty($originalWhere)) {
107+
$newWhere[] = '(' . implode(' ', $originalWhere) . ')';
108+
}
109+
$newWhere[] = $parentCondition;
110+
$select->reset(Select::WHERE);
111+
$select->where(new \Zend_Db_Expr(implode(' OR ', $newWhere)));
112+
}
112113
}

0 commit comments

Comments
 (0)