Skip to content

Commit ab829bf

Browse files
committed
Merge remote-tracking branch 'origin/ACP2E-4281' into PR_2025_10_24_muntianu
2 parents f52dc52 + 896b245 commit ab829bf

File tree

7 files changed

+1097
-51
lines changed

7 files changed

+1097
-51
lines changed

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

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
<?php
22
/**
3-
* Copyright 2015 Adobe
3+
* Copyright 2011 Adobe
44
* All Rights Reserved.
55
*/
6+
67
namespace Magento\Customer\Model\ResourceModel;
78

8-
use Magento\Customer\Controller\Adminhtml\Group\Delete;
99
use Magento\Customer\Model\CustomerRegistry;
1010
use Magento\Customer\Model\ResourceModel\Address\DeleteRelation;
11+
use Magento\Eav\Model\ResourceModel\OrphanedMultiselectCleaner;
1112
use Magento\Framework\App\ObjectManager;
13+
use Magento\Framework\DataObject;
1214

1315
/**
14-
* Class Address
16+
* Customer address entity resource model
1517
*
16-
* @package Magento\Customer\Model\ResourceModel
1718
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1819
*/
1920
class Address extends \Magento\Eav\Model\Entity\VersionControl\AbstractEntity
@@ -28,24 +29,51 @@ class Address extends \Magento\Eav\Model\Entity\VersionControl\AbstractEntity
2829
*/
2930
protected $customerRepository;
3031

32+
/**
33+
* @var OrphanedMultiselectCleaner
34+
*/
35+
private $orphanedMultiselectCleaner;
36+
37+
/**
38+
* @var DeleteRelation
39+
*/
40+
private $deleteRelation;
41+
42+
/**
43+
* @var CustomerRegistry
44+
*/
45+
private $customerRegistry;
46+
3147
/**
3248
* @param \Magento\Eav\Model\Entity\Context $context
3349
* @param \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot
3450
* @param \Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite $entityRelationComposite
3551
* @param \Magento\Framework\Validator\Factory $validatorFactory
3652
* @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
3753
* @param array $data
54+
* @param OrphanedMultiselectCleaner|null $orphanedMultiselectCleaner
55+
* @param DeleteRelation|null $deleteRelation
56+
* @param CustomerRegistry|null $customerRegistry
3857
*/
3958
public function __construct(
4059
\Magento\Eav\Model\Entity\Context $context,
4160
\Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot,
4261
\Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite $entityRelationComposite,
4362
\Magento\Framework\Validator\Factory $validatorFactory,
4463
\Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
45-
$data = []
64+
$data = [],
65+
?OrphanedMultiselectCleaner $orphanedMultiselectCleaner = null,
66+
?DeleteRelation $deleteRelation = null,
67+
?CustomerRegistry $customerRegistry = null
4668
) {
4769
$this->customerRepository = $customerRepository;
4870
$this->_validatorFactory = $validatorFactory;
71+
$this->orphanedMultiselectCleaner = $orphanedMultiselectCleaner
72+
?? ObjectManager::getInstance()->get(OrphanedMultiselectCleaner::class);
73+
$this->deleteRelation = $deleteRelation
74+
?? ObjectManager::getInstance()->get(DeleteRelation::class);
75+
$this->customerRegistry = $customerRegistry
76+
?? ObjectManager::getInstance()->get(CustomerRegistry::class);
4977
parent::__construct($context, $entitySnapshot, $entityRelationComposite, $data);
5078
}
5179

@@ -76,11 +104,15 @@ public function getEntityType()
76104
/**
77105
* Check customer address before saving
78106
*
79-
* @param \Magento\Framework\DataObject $address
107+
* @param DataObject $address
80108
* @return $this
81109
*/
82-
protected function _beforeSave(\Magento\Framework\DataObject $address)
110+
protected function _beforeSave(DataObject $address)
83111
{
112+
if ($address->getId()) {
113+
$this->cleanOrphanedMultiselectValues($address);
114+
}
115+
84116
parent::_beforeSave($address);
85117

86118
$this->_validate($address);
@@ -91,7 +123,7 @@ protected function _beforeSave(\Magento\Framework\DataObject $address)
91123
/**
92124
* Validate customer address entity
93125
*
94-
* @param \Magento\Framework\DataObject $address
126+
* @param DataObject $address
95127
* @return void
96128
* @throws \Magento\Framework\Validator\Exception When validation failed
97129
*/
@@ -122,25 +154,14 @@ public function delete($object)
122154
}
123155

124156
/**
125-
* Get instance of DeleteRelation class
126-
*
127-
* @deprecated 101.0.0
128-
* @return DeleteRelation
129-
*/
130-
private function getDeleteRelation()
131-
{
132-
return ObjectManager::getInstance()->get(DeleteRelation::class);
133-
}
134-
135-
/**
136-
* Get instance of CustomerRegistry class
157+
* Clean up orphaned multiselect attribute values before validation
137158
*
138-
* @deprecated 101.0.0
139-
* @return CustomerRegistry
159+
* @param DataObject $address
160+
* @return void
140161
*/
141-
private function getCustomerRegistry()
162+
private function cleanOrphanedMultiselectValues(DataObject $address): void
142163
{
143-
return ObjectManager::getInstance()->get(CustomerRegistry::class);
164+
$this->orphanedMultiselectCleaner->cleanEntity($this, $address);
144165
}
145166

146167
/**
@@ -149,11 +170,10 @@ private function getCustomerRegistry()
149170
* @param \Magento\Customer\Model\Address $address
150171
* @return $this
151172
*/
152-
protected function _afterDelete(\Magento\Framework\DataObject $address)
173+
protected function _afterDelete(DataObject $address)
153174
{
154-
$customer = $this->getCustomerRegistry()->retrieve($address->getCustomerId());
155-
156-
$this->getDeleteRelation()->deleteRelation($address, $customer);
175+
$customer = $this->customerRegistry->retrieve($address->getCustomerId());
176+
$this->deleteRelation->deleteRelation($address, $customer);
157177
return parent::_afterDelete($address);
158178
}
159179
}

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22
/**
3-
* Copyright 2015 Adobe
3+
* Copyright 2011 Adobe
44
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
@@ -12,6 +12,7 @@
1212
use Magento\Customer\Model\Customer\NotificationStorage;
1313
use Magento\Eav\Model\Entity\Context;
1414
use Magento\Eav\Model\Entity\VersionControl\AbstractEntity;
15+
use Magento\Eav\Model\ResourceModel\OrphanedMultiselectCleaner;
1516
use Magento\Framework\App\Config\ScopeConfigInterface;
1617
use Magento\Framework\App\ObjectManager;
1718
use Magento\Framework\DataObject;
@@ -73,6 +74,11 @@ class Customer extends AbstractEntity
7374
*/
7475
private $encryptor;
7576

77+
/**
78+
* @var OrphanedMultiselectCleaner
79+
*/
80+
private $orphanedMultiselectCleaner;
81+
7682
/**
7783
* Customer constructor.
7884
*
@@ -86,6 +92,7 @@ class Customer extends AbstractEntity
8692
* @param array $data
8793
* @param AccountConfirmation|null $accountConfirmation
8894
* @param EncryptorInterface|null $encryptor
95+
* @param OrphanedMultiselectCleaner|null $orphanedMultiselectCleaner
8996
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
9097
*/
9198
public function __construct(
@@ -98,7 +105,8 @@ public function __construct(
98105
StoreManagerInterface $storeManager,
99106
$data = [],
100107
?AccountConfirmation $accountConfirmation = null,
101-
?EncryptorInterface $encryptor = null
108+
?EncryptorInterface $encryptor = null,
109+
?OrphanedMultiselectCleaner $orphanedMultiselectCleaner = null
102110
) {
103111
parent::__construct($context, $entitySnapshot, $entityRelationComposite, $data);
104112

@@ -107,6 +115,8 @@ public function __construct(
107115
$this->dateTime = $dateTime;
108116
$this->accountConfirmation = $accountConfirmation ?: ObjectManager::getInstance()
109117
->get(AccountConfirmation::class);
118+
$this->orphanedMultiselectCleaner = $orphanedMultiselectCleaner
119+
?? ObjectManager::getInstance()->get(OrphanedMultiselectCleaner::class);
110120
$this->setType('customer');
111121
$this->setConnection('customer_read');
112122
$this->storeManager = $storeManager;
@@ -151,6 +161,10 @@ protected function _beforeSave(DataObject $customer)
151161
}
152162
$customer->getGroupId();
153163

164+
if ($customer->getId()) {
165+
$this->cleanOrphanedMultiselectValues($customer);
166+
}
167+
154168
parent::_beforeSave($customer);
155169

156170
if (!$customer->getEmail()) {
@@ -519,6 +533,17 @@ public function updateSessionCutOff(int $customerId, int $timestamp): void
519533
);
520534
}
521535

536+
/**
537+
* Clean up orphaned multiselect attribute values before validation
538+
*
539+
* @param DataObject $customer
540+
* @return void
541+
*/
542+
private function cleanOrphanedMultiselectValues(DataObject $customer): void
543+
{
544+
$this->orphanedMultiselectCleaner->cleanEntity($this, $customer);
545+
}
546+
522547
/**
523548
* @inheritDoc
524549
*/

0 commit comments

Comments
 (0)