99use Magento \Catalog \Api \Data \ProductAttributeInterface ;
1010use Magento \Catalog \Api \Data \ProductInterface ;
1111use Magento \Catalog \Api \Data \ProductInterfaceFactory ;
12+ use Magento \Catalog \Api \ProductAttributeRepositoryInterface ;
1213use Magento \Catalog \Api \ProductRepositoryInterface ;
1314use Magento \Catalog \Model \Config ;
1415use Magento \Catalog \Model \Product \Gallery \ReadHandler as GalleryReadHandler ;
1516use Magento \ConfigurableProduct \Model \Product \Type \Collection \SalableProcessor ;
1617use Magento \Framework \App \ObjectManager ;
1718use Magento \Framework \EntityManager \MetadataPool ;
19+ use Magento \Framework \Api \SearchCriteriaBuilder ;
1820
1921/**
2022 * Configurable product type implementation
@@ -194,9 +196,18 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
194196 */
195197 private $ salableProcessor ;
196198
199+ /**
200+ * @var ProductAttributeRepositoryInterface|null
201+ */
202+ private $ productAttributeRepository ;
203+
204+ /**
205+ * @var SearchCriteriaBuilder|null
206+ */
207+ private $ searchCriteriaBuilder ;
208+
197209 /**
198210 * @codingStandardsIgnoreStart/End
199- *
200211 * @param \Magento\Catalog\Model\Product\Option $catalogProductOption
201212 * @param \Magento\Eav\Model\Config $eavConfig
202213 * @param \Magento\Catalog\Model\Product\Type $catalogProductType
@@ -214,9 +225,13 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
214225 * @param \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable $catalogProductTypeConfigurable
215226 * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
216227 * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
228+ * @param \Magento\Framework\Cache\FrontendInterface|null $cache
229+ * @param \Magento\Customer\Model\Session|null $customerSession
217230 * @param \Magento\Framework\Serialize\Serializer\Json $serializer
218231 * @param ProductInterfaceFactory $productFactory
219232 * @param SalableProcessor $salableProcessor
233+ * @param ProductAttributeRepositoryInterface|null $productAttributeRepository
234+ * @param SearchCriteriaBuilder|null $searchCriteriaBuilder
220235 * @SuppressWarnings(PHPMD.ExcessiveParameterList)
221236 */
222237 public function __construct (
@@ -241,7 +256,9 @@ public function __construct(
241256 \Magento \Customer \Model \Session $ customerSession = null ,
242257 \Magento \Framework \Serialize \Serializer \Json $ serializer = null ,
243258 ProductInterfaceFactory $ productFactory = null ,
244- SalableProcessor $ salableProcessor = null
259+ SalableProcessor $ salableProcessor = null ,
260+ ProductAttributeRepositoryInterface $ productAttributeRepository = null ,
261+ SearchCriteriaBuilder $ searchCriteriaBuilder = null
245262 ) {
246263 $ this ->typeConfigurableFactory = $ typeConfigurableFactory ;
247264 $ this ->_eavAttributeFactory = $ eavAttributeFactory ;
@@ -256,6 +273,10 @@ public function __construct(
256273 $ this ->productFactory = $ productFactory ?: ObjectManager::getInstance ()
257274 ->get (ProductInterfaceFactory::class);
258275 $ this ->salableProcessor = $ salableProcessor ?: ObjectManager::getInstance ()->get (SalableProcessor::class);
276+ $ this ->productAttributeRepository = $ productAttributeRepository ?:
277+ ObjectManager::getInstance ()->get (ProductAttributeRepositoryInterface::class);
278+ $ this ->searchCriteriaBuilder = $ searchCriteriaBuilder ?:
279+ ObjectManager::getInstance ()->get (SearchCriteriaBuilder::class);
259280 parent ::__construct (
260281 $ catalogProductOption ,
261282 $ eavConfig ,
@@ -1231,19 +1252,16 @@ public function isPossibleBuyFromList($product)
12311252
12321253 /**
12331254 * Returns array of sub-products for specified configurable product
1234- *
1235- * $requiredAttributeIds - one dimensional array, if provided
12361255 * Result array contains all children for specified configurable product
12371256 *
12381257 * @param \Magento\Catalog\Model\Product $product
1239- * @param array $requiredAttributeIds
1258+ * @param array $requiredAttributeIds Attributes to include in the select; one-dimensional array
12401259 * @return ProductInterface[]
1241- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
12421260 */
12431261 public function getUsedProducts ($ product , $ requiredAttributeIds = null )
12441262 {
12451263 if (!$ product ->hasData ($ this ->_usedProducts )) {
1246- $ collection = $ this ->getConfiguredUsedProductCollection ($ product , false );
1264+ $ collection = $ this ->getConfiguredUsedProductCollection ($ product , false , $ requiredAttributeIds );
12471265 $ usedProducts = array_values ($ collection ->getItems ());
12481266 $ product ->setData ($ this ->_usedProducts , $ usedProducts );
12491267 }
@@ -1390,25 +1408,38 @@ private function getUsedProductsCacheKey($keyParts)
13901408
13911409 /**
13921410 * Prepare collection for retrieving sub-products of specified configurable product
1393- *
13941411 * Retrieve related products collection with additional configuration
13951412 *
13961413 * @param \Magento\Catalog\Model\Product $product
13971414 * @param bool $skipStockFilter
1415+ * @param array $requiredAttributeIds Attributes to include in the select
13981416 * @return \Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable\Product\Collection
1417+ * @throws \Magento\Framework\Exception\LocalizedException
13991418 */
14001419 private function getConfiguredUsedProductCollection (
14011420 \Magento \Catalog \Model \Product $ product ,
1402- $ skipStockFilter = true
1421+ $ skipStockFilter = true ,
1422+ $ requiredAttributeIds = null
14031423 ) {
14041424 $ collection = $ this ->getUsedProductCollection ($ product );
14051425
14061426 if ($ skipStockFilter ) {
14071427 $ collection ->setFlag ('has_stock_status_filter ' , true );
14081428 }
14091429
1430+ $ attributesForSelect = $ this ->getAttributesForCollection ($ product );
1431+ if ($ requiredAttributeIds ) {
1432+ $ this ->searchCriteriaBuilder ->addFilter ('attribute_id ' , $ requiredAttributeIds , 'in ' );
1433+ $ requiredAttributes = $ this ->productAttributeRepository
1434+ ->getList ($ this ->searchCriteriaBuilder ->create ())->getItems ();
1435+ $ requiredAttributeCodes = [];
1436+ foreach ($ requiredAttributes as $ requiredAttribute ) {
1437+ $ requiredAttributeCodes [] = $ requiredAttribute ->getAttributeCode ();
1438+ }
1439+ $ attributesForSelect = array_unique (array_merge ($ attributesForSelect , $ requiredAttributeCodes ));
1440+ }
14101441 $ collection
1411- ->addAttributeToSelect ($ this -> getAttributesForCollection ( $ product ) )
1442+ ->addAttributeToSelect ($ attributesForSelect )
14121443 ->addFilterByRequiredOptions ()
14131444 ->setStoreId ($ product ->getStoreId ());
14141445
0 commit comments