Skip to content

Commit 4cfc163

Browse files
committed
ACP2E-961: Customer attribute 'Is required' attribute is not properly overridden per website scope in Admin
1 parent fd01a2d commit 4cfc163

File tree

6 files changed

+42
-13
lines changed

6 files changed

+42
-13
lines changed

app/code/Magento/Customer/Controller/Adminhtml/Index/Validate.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
/**
2525
* Class for validation of customer
26+
*
27+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2628
*/
2729
class Validate extends CustomerAction implements HttpPostActionInterface, HttpGetActionInterface
2830
{
@@ -124,6 +126,7 @@ public function __construct(
124126
*
125127
* @param \Magento\Framework\DataObject $response
126128
* @return CustomerInterface|null
129+
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
127130
*/
128131
protected function _validateCustomer($response)
129132
{
@@ -158,7 +161,7 @@ protected function _validateCustomer($response)
158161
$entity_id = $submittedData['entity_id'];
159162
$customer->setId($entity_id);
160163
}
161-
if (isset($data['website_id'])) {
164+
if (isset($data['website_id']) && is_numeric($data['website_id'])) {
162165
$website = $this->storeManager->getWebsite($data['website_id']);
163166
$storeId = current($website->getStoreIds());
164167
$this->storeManager->setCurrentStore($storeId);

app/code/Magento/Customer/Model/AttributeMetadataResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ private function modifyGroupAttributeMeta(AttributeInterface $attribute): void
225225
{
226226
if ($attribute->getAttributeCode() === 'group_id') {
227227
$defaultGroup = $this->groupManagement->getDefaultGroup();
228-
$defaultGroupId = !empty($defaultGroup) ? $defaultGroup->getId() : null;
228+
$defaultGroupId = $defaultGroup->getId();
229229
$attribute->setDataUsingMethod(self::$metaProperties['default'], $defaultGroupId);
230230
}
231231
}

app/code/Magento/Customer/Model/Customer/DataProviderWithDefaultAddresses.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
/**
2828
* Refactored version of Magento\Customer\Model\Customer\DataProvider with eliminated usage of addresses collection.
29+
*
30+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2931
*/
3032
class DataProviderWithDefaultAddresses extends AbstractDataProvider
3133
{
@@ -161,7 +163,6 @@ public function getData(): array
161163
array_flip(self::$forbiddenCustomerFields)
162164
);
163165
$this->prepareCustomAttributeValue($result['customer']);
164-
unset($result['address']);
165166

166167
$result['default_billing_address'] = $this->prepareDefaultAddress(
167168
$customer->getDefaultBillingAddress()

app/code/Magento/Customer/Model/ResourceModel/CustomerRepository.php

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,7 @@ public function save(CustomerInterface $customer, $passwordHash = null)
204204
$prevCustomerData = $prevCustomerDataArr = null;
205205
if ($customer->getId()) {
206206
$prevCustomerData = $this->getById($customer->getId());
207-
$prevCustomerDataArr = $prevCustomerData->__toArray();
208-
if (isset($prevCustomerDataArr[CustomerInterface::CUSTOM_ATTRIBUTES])) {
209-
foreach ($prevCustomerDataArr[CustomerInterface::CUSTOM_ATTRIBUTES] as $attribute) {
210-
$prevCustomerDataArr[$attribute['attribute_code']] = $attribute['value'];
211-
}
212-
unset($prevCustomerDataArr[CustomerInterface::CUSTOM_ATTRIBUTES]);
213-
}
207+
$prevCustomerDataArr = $this->prepareCustomerData($prevCustomerData->__toArray());
214208
}
215209
/** @var $customer \Magento\Customer\Model\Data\Customer */
216210
$customerArr = $customer->__toArray();
@@ -491,6 +485,7 @@ public function deleteById($customerId)
491485
* Helper function that adds a FilterGroup to the collection.
492486
*
493487
* @deprecated 101.0.0
488+
* @see no alternative
494489
* @param FilterGroup $filterGroup
495490
* @param Collection $collection
496491
* @return void
@@ -534,4 +529,21 @@ private function setCustomerGroupId($customerModel, $customerArr, $prevCustomerD
534529
$customerModel->setGroupId($prevCustomerDataArr['group_id']);
535530
}
536531
}
532+
533+
/**
534+
* Prepare customer data.
535+
*
536+
* @param array $customerData
537+
* @return array
538+
*/
539+
private function prepareCustomerData(array $customerData): array
540+
{
541+
if (isset($customerData[CustomerInterface::CUSTOM_ATTRIBUTES])) {
542+
foreach ($customerData[CustomerInterface::CUSTOM_ATTRIBUTES] as $attribute) {
543+
$customerData[$attribute['attribute_code']] = $attribute['value'];
544+
}
545+
unset($customerData[CustomerInterface::CUSTOM_ATTRIBUTES]);
546+
}
547+
return $customerData;
548+
}
537549
}

app/code/Magento/Customer/Test/Unit/Controller/Adminhtml/Index/SaveTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
use Magento\Framework\View\Result\PageFactory;
4545
use Magento\Newsletter\Model\SubscriberFactory;
4646
use Magento\Newsletter\Model\SubscriptionManagerInterface;
47+
use Magento\Store\Api\Data\WebsiteInterface;
48+
use Magento\Store\Model\StoreManagerInterface;
4749
use PHPUnit\Framework\MockObject\MockObject;
4850
use PHPUnit\Framework\TestCase;
4951

@@ -284,6 +286,13 @@ protected function setUp(): void
284286
$this->emailNotificationMock = $this->getMockBuilder(EmailNotificationInterface::class)
285287
->disableOriginalConstructor()
286288
->getMockForAbstractClass();
289+
$website = $this->createPartialMock(\Magento\Store\Model\Website::class, ['getStoreIds']);
290+
$website->method('getStoreIds')
291+
->willReturn([1]);
292+
$storeManager = $this->getMockBuilder(StoreManagerInterface::class)
293+
->getMockForAbstractClass();
294+
$storeManager->method('getWebsite')
295+
->willReturn($website);
287296

288297
$objectManager = new ObjectManager($this);
289298

@@ -310,6 +319,7 @@ protected function setUp(): void
310319
'addressRepository' => $this->customerAddressRepositoryMock,
311320
'addressMapper' => $this->customerAddressMapperMock,
312321
'subscriptionManager' => $this->subscriptionManager,
322+
'storeManager' => $storeManager,
313323
]
314324
);
315325

app/code/Magento/Customer/view/adminhtml/web/js/form/element/website.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@ define([
2525
option = this.getOption(value);
2626

2727
customerAttributes.forEach(element => {
28-
var requiredWebsites = element.validation['required-entry-website']
29-
if (_.isArray(requiredWebsites) && requiredWebsites.includes(parseInt(value))) {
28+
var requiredWebsites = element.validation['required-entry-website'];
29+
if (!_.isArray(requiredWebsites)) {
30+
return;
31+
}
32+
if (requiredWebsites.includes(parseInt(value))) {
3033
element.validation['required-entry'] = true;
3134
element.required(true);
3235
} else {
33-
element.validation['required-entry'] = false;
36+
delete element.validation['required-entry'];
3437
element.required(false);
3538
}
3639
});

0 commit comments

Comments
 (0)