Skip to content

Commit 67d4826

Browse files
ENGCOM-7214: Fix bug 26449: Configurable product attribute issue #27339
- Merge Pull Request #27339 from tna274/magento2:fix_issue_26449 - Merged commits: 1. e7ff694 2. 1071acf 3. 3b6b038 4. 19ceb3a 5. 1efecdf 6. 1e9895d 7. d139cf9 8. ec6bb30 9. 7cad476 10. d896259 11. 7d88658 12. 43e7715 13. 784e733 14. 962274a 15. ea41479 16. 1486300 17. deb5586 18. dfb74d5
2 parents f3a160c + dfb74d5 commit 67d4826

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)