Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
<?php
/**
*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
* Copyright 2015 Adobe
* All Rights Reserved.
*/
namespace Magento\CatalogRuleConfigurable\Plugin\CatalogRule\Model\Rule;

use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\CatalogRule\Model\ResourceModel\Product\ConditionsToCollectionApplier;
use Magento\CatalogRule\Model\Rule;
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
use Magento\CatalogRuleConfigurable\Plugin\CatalogRule\Model\ConfigurableProductsProvider;
use Magento\Framework\Exception\InputException;

/**
* Add configurable sub products to catalog rule indexer on full reindex
Expand All @@ -24,6 +27,16 @@ class ConfigurableProductHandler
*/
private $configurableProductsProvider;

/**
* @var ConditionsToCollectionApplier
*/
private ConditionsToCollectionApplier $conditionsToCollectionApplier;

/**
* @var CollectionFactory
*/
private CollectionFactory $productCollectionFactory;

/**
* @var array
*/
Expand All @@ -32,13 +45,19 @@ class ConfigurableProductHandler
/**
* @param \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $configurable
* @param ConfigurableProductsProvider $configurableProductsProvider
* @param CollectionFactory $productCollectionFactory
* @param ConditionsToCollectionApplier $conditionsToCollectionApplier
*/
public function __construct(
\Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $configurable,
ConfigurableProductsProvider $configurableProductsProvider
ConfigurableProductsProvider $configurableProductsProvider,
CollectionFactory $productCollectionFactory,
ConditionsToCollectionApplier $conditionsToCollectionApplier
) {
$this->configurable = $configurable;
$this->configurableProductsProvider = $configurableProductsProvider;
$this->productCollectionFactory = $productCollectionFactory;
$this->conditionsToCollectionApplier = $conditionsToCollectionApplier;
}

/**
Expand Down Expand Up @@ -66,7 +85,11 @@ public function aroundGetMatchingProductIds(
foreach ($configurableProductIds as $productId) {
if (!isset($this->childrenProducts[$productId])) {
$this->childrenProducts[$productId] = $this->configurable->getChildrenIds($productId)[0];
$this->childrenProducts[$productId] =
$this->validateChildrenProducts($rule, $this->childrenProducts[$productId])
?? $this->childrenProducts[$productId];
}

$subProductIds = $this->childrenProducts[$productId];
$parentValidationResult = isset($productIds[$productId])
? array_filter($productIds[$productId])
Expand All @@ -77,6 +100,7 @@ public function aroundGetMatchingProductIds(
$childValidationResult = isset($productIds[$subProductId])
? array_filter($productIds[$subProductId])
: [];

$productIds[$subProductId] = $parentValidationResult + $childValidationResult;
}

Expand All @@ -85,4 +109,31 @@ public function aroundGetMatchingProductIds(
}
return $productIds;
}

/**
* Filter the provided child product IDs by applying the rule's conditions
*
* @param Rule $rule
* @param array $productIds
* @return array|false
*/
private function validateChildrenProducts(Rule $rule, array $productIds): array|false
{
if ($rule->getConditions()) {
try {
$collection = $this->productCollectionFactory->create();
$collection->addAttributeToSelect('*');
$collection->addFieldToFilter('entity_id', ['in' => $productIds]);

$productCollection = $this->conditionsToCollectionApplier
->applyConditionsToCollection($rule->getConditions(), $collection);

return $productCollection->getAllIds();
} catch (InputException $e) {
return false;
}
}

return $productIds;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
use Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\CatalogRule\Model\ResourceModel\Product\ConditionsToCollectionApplier;

/**
* Unit test for Magento\CatalogRuleConfigurable\Plugin\CatalogRule\Model\Rule\ConfigurableProductHandler
Expand All @@ -34,6 +36,16 @@ class ConfigurableProductHandlerTest extends TestCase
*/
private $configurableProductsProviderMock;

/**
* @var CollectionFactory|MockObject
*/
private $productCollectionFactoryMock;

/**
* @var ConditionsToCollectionApplier|MockObject
*/
private $conditionsToCollectionApplierMock;

/** @var Rule|MockObject */
private $ruleMock;

Expand All @@ -50,11 +62,23 @@ protected function setUp(): void
ConfigurableProductsProvider::class,
['getIds']
);
$this->productCollectionFactoryMock = $this->createPartialMock(
CollectionFactory::class,
['create']
);

$this->conditionsToCollectionApplierMock = $this->createPartialMock(
ConditionsToCollectionApplier::class,
['applyConditionsToCollection']
);

$this->ruleMock = $this->createMock(Rule::class);

$this->configurableProductHandler = new ConfigurableProductHandler(
$this->configurableMock,
$this->configurableProductsProviderMock
$this->configurableProductsProviderMock,
$this->productCollectionFactoryMock,
$this->conditionsToCollectionApplierMock
);
}

Expand Down