Skip to content

Commit 5bc7f00

Browse files
authored
ENGCOM-7214: Fix bug 26449: Configurable product attribute issue #27339
2 parents 108d22f + 67d4826 commit 5bc7f00

8 files changed

+445
-37
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="StorefrontCheckNoAppearDefaultOptionConfigurableProductTest">
12+
<annotations>
13+
<stories value="Configurable Product"/>
14+
<title value="Check for Configurable Product the default option doesn't appear."/>
15+
<description value="Check for Configurable Product the default option doesn't appear on the list options product when an option use."/>
16+
<testCaseId value="MC-35074"/>
17+
</annotations>
18+
<before>
19+
<createData entity="ApiCategory" stepKey="createCategory"/>
20+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin1"/>
21+
</before>
22+
<after>
23+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
24+
<actionGroup ref="AdminDeleteProductAttributeByLabelActionGroup" stepKey="deleteAttribute">
25+
<argument name="productAttributeLabel" value="{{colorProductAttribute.default_label}}" />
26+
</actionGroup>
27+
<actionGroup ref="AdminLogoutActionGroup" stepKey="adminLogout"/>
28+
</after>
29+
30+
<actionGroup ref="AdminFillBasicValueConfigurableProductActionGroup" stepKey="fillBasicValue">
31+
<argument name="product" value="_defaultProduct"/>
32+
<argument name="category" value="$$createCategory$$"/>
33+
</actionGroup>
34+
<actionGroup ref="AdminAddOptionsToAttributeWithDefaultLayeredNavigationActionGroup" stepKey="createOptions"/>
35+
<actionGroup ref="AdminGotoSelectValueAttributePageActionGroup" stepKey="gotoSelectValuePage">
36+
<argument name="defaultLabelAttribute" value="{{colorProductAttribute.default_label}}"/>
37+
</actionGroup>
38+
<actionGroup ref="AdminSelectValueFromAttributeActionGroup" stepKey="selectColorProductAttribute2">
39+
<argument name="option" value="colorProductAttribute2"/>
40+
</actionGroup>
41+
<actionGroup ref="AdminSelectValueFromAttributeActionGroup" stepKey="selectColorProductAttribute3">
42+
<argument name="option" value="colorProductAttribute3"/>
43+
</actionGroup>
44+
<actionGroup ref="AdminSetQuantityToEachSkusConfigurableProductActionGroup" stepKey="saveConfigurable"/>
45+
<grabValueFrom selector="{{NewProductPageSection.sku}}" stepKey="grabSkuProduct"/>
46+
<magentoCLI command="indexer:reindex" stepKey="reindex"/>
47+
48+
<actionGroup ref="SelectStorefrontSideBarAttributeOption" stepKey="expandOption">
49+
<argument name="categoryName" value="$$createCategory.name$$"/>
50+
<argument name="attributeDefaultLabel" value="{{colorProductAttribute.default_label}}"/>
51+
</actionGroup>
52+
<dontSeeElement selector="{{LayeredNavigationSection.filterOptionContent(colorProductAttribute.default_label,colorProductAttribute1.name)}}" stepKey="dontSeeCaptchaField"/>
53+
<actionGroup ref="DeleteProductBySkuActionGroup" stepKey="deleteConfigurableProduct">
54+
<argument name="sku" value="$grabSkuProduct"/>
55+
</actionGroup>
56+
</test>
57+
</tests>

app/code/Magento/ConfigurableProduct/Plugin/Model/ResourceModel/Product.php

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,21 @@
44
* Copyright © Magento, Inc. All rights reserved.
55
* See COPYING.txt for license details.
66
*/
7+
78
namespace Magento\ConfigurableProduct\Plugin\Model\ResourceModel;
89

10+
use Magento\Catalog\Api\Data\ProductAttributeInterface;
11+
use Magento\Catalog\Api\ProductAttributeRepositoryInterface;
12+
use Magento\ConfigurableProduct\Api\Data\OptionInterface;
913
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
14+
use Magento\Framework\Api\FilterBuilder;
15+
use Magento\Framework\Api\SearchCriteriaBuilder;
16+
use Magento\Framework\App\ObjectManager;
1017
use Magento\Framework\Indexer\ActionInterface;
1118

19+
/**
20+
* Plugin product resource model
21+
*/
1222
class Product
1323
{
1424
/**
@@ -21,18 +31,45 @@ class Product
2131
*/
2232
private $productIndexer;
2333

34+
/**
35+
* @var ProductAttributeRepositoryInterface
36+
*/
37+
private $productAttributeRepository;
38+
39+
/**
40+
* @var SearchCriteriaBuilder
41+
*/
42+
private $searchCriteriaBuilder;
43+
44+
/**
45+
* @var FilterBuilder
46+
*/
47+
private $filterBuilder;
48+
2449
/**
2550
* Initialize Product dependencies.
2651
*
2752
* @param Configurable $configurable
2853
* @param ActionInterface $productIndexer
54+
* @param ProductAttributeRepositoryInterface $productAttributeRepository
55+
* @param SearchCriteriaBuilder $searchCriteriaBuilder
56+
* @param FilterBuilder $filterBuilder
2957
*/
3058
public function __construct(
3159
Configurable $configurable,
32-
ActionInterface $productIndexer
60+
ActionInterface $productIndexer,
61+
ProductAttributeRepositoryInterface $productAttributeRepository = null,
62+
SearchCriteriaBuilder $searchCriteriaBuilder = null,
63+
FilterBuilder $filterBuilder = null
3364
) {
3465
$this->configurable = $configurable;
3566
$this->productIndexer = $productIndexer;
67+
$this->productAttributeRepository = $productAttributeRepository ?: ObjectManager::getInstance()
68+
->get(ProductAttributeRepositoryInterface::class);
69+
$this->searchCriteriaBuilder = $searchCriteriaBuilder ?: ObjectManager::getInstance()
70+
->get(SearchCriteriaBuilder::class);
71+
$this->filterBuilder = $filterBuilder ?: ObjectManager::getInstance()
72+
->get(FilterBuilder::class);
3673
}
3774

3875
/**
@@ -41,6 +78,7 @@ public function __construct(
4178
* @param \Magento\Catalog\Model\ResourceModel\Product $subject
4279
* @param \Magento\Framework\DataObject $object
4380
* @return void
81+
* @throws \Magento\Framework\Exception\NoSuchEntityException
4482
*
4583
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
4684
*/
@@ -51,6 +89,39 @@ public function beforeSave(
5189
/** @var \Magento\Catalog\Model\Product $object */
5290
if ($object->getTypeId() == Configurable::TYPE_CODE) {
5391
$object->getTypeInstance()->getSetAttributes($object);
92+
$this->resetConfigurableOptionsData($object);
93+
}
94+
}
95+
96+
/**
97+
* Set null for configurable options attribute of configurable product
98+
*
99+
* @param \Magento\Catalog\Model\Product $object
100+
* @return void
101+
* @throws \Magento\Framework\Exception\NoSuchEntityException
102+
*/
103+
private function resetConfigurableOptionsData($object)
104+
{
105+
$extensionAttribute = $object->getExtensionAttributes();
106+
if ($extensionAttribute && $extensionAttribute->getConfigurableProductOptions()) {
107+
$attributeIds = [];
108+
/** @var OptionInterface $option */
109+
foreach ($extensionAttribute->getConfigurableProductOptions() as $option) {
110+
$attributeIds[] = $option->getAttributeId();
111+
}
112+
113+
$filter = $this->filterBuilder
114+
->setField(ProductAttributeInterface::ATTRIBUTE_ID)
115+
->setConditionType('in')
116+
->setValue($attributeIds)
117+
->create();
118+
$this->searchCriteriaBuilder->addFilters([$filter]);
119+
$searchCriteria = $this->searchCriteriaBuilder->create();
120+
$optionAttributes = $this->productAttributeRepository->getList($searchCriteria)->getItems();
121+
122+
foreach ($optionAttributes as $optionAttribute) {
123+
$object->setData($optionAttribute->getAttributeCode(), null);
124+
}
54125
}
55126
}
56127

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminAddOptionsToAttributeWithDefaultLayeredNavigationActionGroup">
12+
<annotations>
13+
<description>Adds 3 provided Options to a new Attribute on the Configurable Product creation/edit page. Selected default first option. Set "Use in Layered Navigation" to "Yes".</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="label" defaultValue="colorProductAttribute" />
17+
<argument name="option1" defaultValue="colorProductAttribute1"/>
18+
<argument name="option2" defaultValue="colorProductAttribute2"/>
19+
<argument name="option3" defaultValue="colorProductAttribute3"/>
20+
</arguments>
21+
22+
<click selector="{{AdminProductFormConfigurationsSection.createConfigurations}}" stepKey="clickOnCreateConfigurations"/>
23+
<click selector="{{AdminCreateProductConfigurationsPanel.createNewAttribute}}" stepKey="clickOnNewAttribute"/>
24+
<waitForPageLoad stepKey="waitForIFrame"/>
25+
<switchToIFrame selector="{{AdminNewAttributePanel.newAttributeIFrame}}" stepKey="switchToNewAttributeIFrame"/>
26+
<fillField selector="{{AdminNewAttributePanel.defaultLabel}}" userInput="{{label.default_label}}" stepKey="fillDefaultLabel"/>
27+
28+
<!--Add option 1 to attribute-->
29+
<click selector="{{AdminNewAttributePanel.addOption}}" stepKey="clickAddOption1"/>
30+
<waitForElementVisible selector="{{AdminNewAttributePanel.isDefault('1')}}" time="30" stepKey="waitForOptionRow1" after="clickAddOption1"/>
31+
<fillField selector="{{AdminNewAttributePanel.optionAdminValue('0')}}" userInput="{{option1.name}}" stepKey="fillAdminLabel1" after="waitForOptionRow1"/>
32+
<click selector="{{AdminNewAttributePanel.isDefault('1')}}" stepKey="selectDefault" after="fillAdminLabel1"/>
33+
34+
<!--Add option 2 to attribute-->
35+
<click selector="{{AdminNewAttributePanel.addOption}}" stepKey="clickAddOption2" after="selectDefault"/>
36+
<waitForElementVisible selector="{{AdminNewAttributePanel.isDefault('2')}}" time="30" stepKey="waitForOptionRow2" after="clickAddOption2"/>
37+
<fillField selector="{{AdminNewAttributePanel.optionAdminValue('1')}}" userInput="{{option2.name}}" stepKey="fillAdminLabel2" after="waitForOptionRow2"/>
38+
39+
<!--Add option 3 to attribute-->
40+
<click selector="{{AdminNewAttributePanel.addOption}}" stepKey="clickAddOption3" after="fillAdminLabel2"/>
41+
<waitForElementVisible selector="{{AdminNewAttributePanel.isDefault('3')}}" time="30" stepKey="waitForOptionRow3" after="clickAddOption3"/>
42+
<fillField selector="{{AdminNewAttributePanel.optionAdminValue('2')}}" userInput="{{option3.name}}" stepKey="fillAdminLabel3" after="waitForOptionRow3"/>
43+
44+
<!-- Set Use In Layered Navigation -->
45+
<click selector="{{AdminNewAttributePanel.storefrontPropertiesTab}}" stepKey="goToStorefrontPropertiesTab" after="fillAdminLabel3"/>
46+
<waitForElementVisible selector="{{AdminNewAttributePanel.storefrontPropertiesTitle}}" stepKey="waitTabLoad" after="goToStorefrontPropertiesTab"/>
47+
<selectOption selector="{{AdminNewAttributePanel.useInLayeredNavigation}}" stepKey="selectUseInLayer" userInput="Filterable (with results)" after="waitTabLoad"/>
48+
49+
<!--Save attribute-->
50+
<click selector="{{AdminNewAttributePanel.saveAttribute}}" stepKey="clickSaveAttribute"/>
51+
<waitForPageLoad stepKey="waitForSavingAttribute"/>
52+
</actionGroup>
53+
</actionGroups>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminFillBasicValueConfigurableProductActionGroup">
12+
<annotations>
13+
<description>Goes to the Admin Product grid page. Fill basic value for Configurable Product using the default Product Options.</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="product" defaultValue="_defaultProduct"/>
17+
<argument name="category" defaultValue="_defaultCategory"/>
18+
</arguments>
19+
<amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
20+
<waitForPageLoad time="30" stepKey="wait1"/>
21+
<click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickOnAddProductToggle"/>
22+
<click selector="{{AdminProductGridActionSection.addConfigurableProduct}}" stepKey="clickOnAddConfigurableProduct"/>
23+
<fillField userInput="{{product.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/>
24+
<fillField userInput="{{product.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/>
25+
<fillField userInput="{{product.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/>
26+
<fillField userInput="{{product.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/>
27+
<searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{category.name}}]" stepKey="fillCategory"/>
28+
<selectOption userInput="{{product.visibility}}" selector="{{AdminProductFormSection.visibility}}" stepKey="fillVisibility"/>
29+
<click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/>
30+
<fillField userInput="{{product.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/>
31+
</actionGroup>
32+
</actionGroups>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminGotoSelectValueAttributePageActionGroup">
12+
<annotations>
13+
<description>Goes to the select values page from each attribute to include in the product.</description>
14+
</annotations>
15+
16+
<arguments>
17+
<argument name="defaultLabelAttribute" type="string" defaultValue="{{colorProductAttribute.default_label}}"/>
18+
</arguments>
19+
20+
<click selector="{{AdminCreateProductConfigurationsPanel.filters}}" stepKey="clickOnFilters"/>
21+
<fillField selector="{{AdminCreateProductConfigurationsPanel.attributeCode}}" userInput="{{defaultLabelAttribute}}" stepKey="fillFilterAttributeCodeField"/>
22+
<click selector="{{AdminCreateProductConfigurationsPanel.applyFilters}}" stepKey="clickApplyFiltersButton"/>
23+
<click selector="{{AdminCreateProductConfigurationsPanel.firstCheckbox}}" stepKey="clickOnFirstCheckbox"/>
24+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton"/>
25+
26+
</actionGroup>
27+
</actionGroups>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminSelectValueFromAttributeActionGroup">
12+
<annotations>
13+
<description>Click to check option.</description>
14+
</annotations>
15+
16+
<arguments>
17+
<argument name="option" defaultValue="colorProductAttribute1"/>
18+
</arguments>
19+
<click selector="{{AdminCreateProductConfigurationsPanel.attributeOption(option.name)}}" stepKey="clickOnCreateNewValue2"/>
20+
</actionGroup>
21+
</actionGroups>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminSetQuantityToEachSkusConfigurableProductActionGroup">
12+
<annotations>
13+
<description>Set quantity 1 to all child skus for configurable product. Save a configurable product and confirm.</description>
14+
</annotations>
15+
16+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton2"/>
17+
<click selector="{{AdminCreateProductConfigurationsPanel.applySingleQuantityToEachSkus}}" stepKey="clickOnApplySingleQuantityToEachSku"/>
18+
<fillField selector="{{AdminCreateProductConfigurationsPanel.quantity}}" userInput="1" stepKey="enterAttributeQuantity"/>
19+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton3"/>
20+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton4"/>
21+
<click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="clickOnSaveButton2"/>
22+
<click selector="{{AdminChooseAffectedAttributeSetPopup.confirm}}" stepKey="clickOnConfirmInPopup"/>
23+
<seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="seeSaveProductMessage"/>
24+
</actionGroup>
25+
</actionGroups>

0 commit comments

Comments
 (0)