Skip to content

Commit 2045c54

Browse files
Chhandak.BaruaChhandak.Barua
authored andcommitted
Merge branch '2.4-develop' of https://github.com/magento-l3/magento2ce into ACP2E-507
2 parents f8b9f99 + d6756f9 commit 2045c54

File tree

123 files changed

+6911
-667
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

123 files changed

+6911
-667
lines changed

app/code/Magento/BundleGraphQl/Model/Resolver/Order/Item/BundleOptions.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ class BundleOptions implements ResolverInterface
3030
private const OPTION_TYPE = 'bundle';
3131

3232
/**
33-
* Serializer
34-
*
3533
* @var Json
3634
*/
3735
private $serializer;
@@ -148,7 +146,7 @@ private function formatBundleOptionItems(
148146
$optionDetails = [
149147
self::OPTION_TYPE,
150148
$bundleChildAttributes['option_id'],
151-
implode(',', $options),
149+
is_array($options) ? implode(',', $options) : $options,
152150
(int) $childOrderItemOptions['info_buyRequest']['qty']
153151
];
154152

app/code/Magento/Catalog/Model/Attribute/ScopeOverriddenValue.php

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
namespace Magento\Catalog\Model\Attribute;
88

9+
use Magento\Catalog\Model\AbstractModel;
10+
use Magento\Framework\DataObject;
911
use Magento\Framework\EntityManager\MetadataPool;
1012
use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
1113
use Magento\Framework\Api\SearchCriteriaBuilder;
@@ -15,7 +17,6 @@
1517
use Magento\Framework\App\ResourceConnection;
1618

1719
/**
18-
* Class ScopeOverriddenValue
1920
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2021
*/
2122
class ScopeOverriddenValue
@@ -76,7 +77,7 @@ public function __construct(
7677
* Whether attribute value is overridden in specific store
7778
*
7879
* @param string $entityType
79-
* @param \Magento\Catalog\Model\AbstractModel $entity
80+
* @param AbstractModel $entity
8081
* @param string $attributeCode
8182
* @param int|string $storeId
8283
* @return bool
@@ -86,39 +87,41 @@ public function containsValue($entityType, $entity, $attributeCode, $storeId)
8687
if ((int)$storeId === Store::DEFAULT_STORE_ID) {
8788
return false;
8889
}
89-
if (!isset($this->attributesValues[$storeId])) {
90+
$values = $this->getAttributesValues($entityType, $entity);
91+
92+
if (!isset($values[$storeId])) {
9093
$this->initAttributeValues($entityType, $entity, (int)$storeId);
94+
$values = $this->getAttributesValues($entityType, $entity);
9195
}
9296

93-
return isset($this->attributesValues[$storeId])
94-
&& array_key_exists($attributeCode, $this->attributesValues[$storeId]);
97+
return isset($values[$storeId]) && array_key_exists($attributeCode, $values[$storeId]);
9598
}
9699

97100
/**
98101
* Get attribute default values
99102
*
100103
* @param string $entityType
101-
* @param \Magento\Catalog\Model\AbstractModel $entity
104+
* @param AbstractModel $entity
102105
* @return array
103106
*
104107
* @deprecated 101.0.0
105108
*/
106109
public function getDefaultValues($entityType, $entity)
107110
{
108-
if ($this->attributesValues === null) {
111+
$values = $this->getAttributesValues($entityType, $entity);
112+
if (!isset($values[Store::DEFAULT_STORE_ID])) {
109113
$this->initAttributeValues($entityType, $entity, (int)$entity->getStoreId());
114+
$values = $this->getAttributesValues($entityType, $entity);
110115
}
111116

112-
return isset($this->attributesValues[Store::DEFAULT_STORE_ID])
113-
? $this->attributesValues[Store::DEFAULT_STORE_ID]
114-
: [];
117+
return $values[Store::DEFAULT_STORE_ID] ?? [];
115118
}
116119

117120
/**
118121
* Init attribute values.
119122
*
120123
* @param string $entityType
121-
* @param \Magento\Catalog\Model\AbstractModel $entity
124+
* @param AbstractModel $entity
122125
* @param int $storeId
123126
* @throws \Magento\Framework\Exception\LocalizedException
124127
* @return void
@@ -129,6 +132,7 @@ private function initAttributeValues($entityType, $entity, $storeId)
129132
/** @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute */
130133
$attributeTables = [];
131134
if ($metadata->getEavEntityType()) {
135+
$entityId = $entity->getData($metadata->getLinkField());
132136
foreach ($this->getAttributes($entityType) as $attribute) {
133137
if (!$attribute->isStatic()) {
134138
$attributeTables[$attribute->getBackend()->getTable()][] = $attribute->getAttributeId();
@@ -147,7 +151,7 @@ private function initAttributeValues($entityType, $entity, $storeId)
147151
'a.attribute_id = t.attribute_id',
148152
['attribute_code' => 'a.attribute_code']
149153
)
150-
->where($metadata->getLinkField() . ' = ?', $entity->getData($metadata->getLinkField()))
154+
->where($metadata->getLinkField() . ' = ?', $entityId)
151155
->where('t.attribute_id IN (?)', $attributeCodes)
152156
->where('t.store_id IN (?)', $storeIds);
153157
$selects[] = $select;
@@ -158,9 +162,12 @@ private function initAttributeValues($entityType, $entity, $storeId)
158162
\Magento\Framework\DB\Select::SQL_UNION_ALL
159163
);
160164
$attributes = $metadata->getEntityConnection()->fetchAll((string)$unionSelect);
165+
$values = array_fill_keys($storeIds, []);
161166
foreach ($attributes as $attribute) {
162-
$this->attributesValues[$attribute['store_id']][$attribute['attribute_code']] = $attribute['value'];
167+
$values[$attribute['store_id']][$attribute['attribute_code']] = $attribute['value'];
163168
}
169+
$values += $this->getAttributesValues($entityType, $entity);
170+
$this->setAttributesValues($entityType, $entity, $values);
164171
}
165172
}
166173

@@ -187,4 +194,52 @@ private function getAttributes($entityType)
187194
);
188195
return $searchResult->getItems();
189196
}
197+
198+
/**
199+
* Clear entity attributes values cache
200+
*
201+
* @param string $entityType
202+
* @param DataObject $entity
203+
* @return void
204+
* @throws \Exception
205+
*/
206+
public function clearAttributesValues(string $entityType, DataObject $entity): void
207+
{
208+
if (isset($this->attributesValues[$entityType])) {
209+
$metadata = $this->metadataPool->getMetadata($entityType);
210+
$entityId = $entity->getData($metadata->getLinkField());
211+
unset($this->attributesValues[$entityType][$entityId]);
212+
}
213+
}
214+
215+
/**
216+
* Get entity attributes values from cache
217+
*
218+
* @param string $entityType
219+
* @param DataObject $entity
220+
* @return array
221+
* @throws \Exception
222+
*/
223+
private function getAttributesValues(string $entityType, DataObject $entity): array
224+
{
225+
$metadata = $this->metadataPool->getMetadata($entityType);
226+
$entityId = $entity->getData($metadata->getLinkField());
227+
return $this->attributesValues[$entityType][$entityId] ?? [];
228+
}
229+
230+
/**
231+
* Set entity attributes values into cache
232+
*
233+
* @param string $entityType
234+
* @param DataObject $entity
235+
* @param array $values
236+
* @return void
237+
* @throws \Exception
238+
*/
239+
private function setAttributesValues(string $entityType, DataObject $entity, array $values): void
240+
{
241+
$metadata = $this->metadataPool->getMetadata($entityType);
242+
$entityId = $entity->getData($metadata->getLinkField());
243+
$this->attributesValues[$entityType][$entityId] = $values;
244+
}
190245
}

app/code/Magento/Catalog/Model/Indexer/Product/Price.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public function __construct(
6666
public function execute($ids)
6767
{
6868
$this->_productPriceIndexerRows->execute($ids);
69-
$this->cacheContext->registerEntities(ProductModel::CACHE_TAG, $ids);
7069
}
7170

7271
/**

app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Rows.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
*/
66
namespace Magento\Catalog\Model\Indexer\Product\Price\Action;
77

8-
use Magento\Directory\Model\CurrencyFactory;
98
use Magento\Catalog\Model\Indexer\Product\Price\DimensionCollectionFactory;
109
use Magento\Catalog\Model\Indexer\Product\Price\TableMaintainer;
10+
use Magento\Catalog\Model\Product;
1111
use Magento\Catalog\Model\Product\Type;
1212
use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice;
1313
use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\Factory;
1414
use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\TierPrice;
15+
use Magento\Directory\Model\CurrencyFactory;
1516
use Magento\Framework\App\Config\ScopeConfigInterface;
17+
use Magento\Framework\App\ObjectManager;
18+
use Magento\Framework\Indexer\CacheContext;
1619
use Magento\Framework\Stdlib\DateTime;
1720
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
1821
use Magento\Store\Model\StoreManagerInterface;
@@ -34,6 +37,11 @@ class Rows extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction
3437
*/
3538
private $batchSize;
3639

40+
/**
41+
* @var CacheContext
42+
*/
43+
private CacheContext $cacheContext;
44+
3745
/**
3846
* @param ScopeConfigInterface $config
3947
* @param StoreManagerInterface $storeManager
@@ -47,6 +55,7 @@ class Rows extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction
4755
* @param DimensionCollectionFactory|null $dimensionCollectionFactory
4856
* @param TableMaintainer|null $tableMaintainer
4957
* @param int|null $batchSize
58+
* @param CacheContext|null $cacheContext
5059
* @SuppressWarnings(PHPMD.NPathComplexity) Added to backward compatibility with abstract class
5160
* @SuppressWarnings(PHPMD.CyclomaticComplexity) Added to backward compatibility with abstract class
5261
* @SuppressWarnings(PHPMD.ExcessiveParameterList) Added to backward compatibility with abstract class
@@ -63,7 +72,8 @@ public function __construct(
6372
TierPrice $tierPriceIndexResource = null,
6473
DimensionCollectionFactory $dimensionCollectionFactory = null,
6574
TableMaintainer $tableMaintainer = null,
66-
?int $batchSize = null
75+
?int $batchSize = null,
76+
CacheContext $cacheContext = null
6777
) {
6878
parent::__construct(
6979
$config,
@@ -79,6 +89,7 @@ public function __construct(
7989
$tableMaintainer
8090
);
8191
$this->batchSize = $batchSize ?? self::BATCH_SIZE;
92+
$this->cacheContext = $cacheContext ?? ObjectManager::getInstance()->get(CacheContext::class);
8293
}
8394

8495
/**
@@ -101,7 +112,7 @@ public function execute($ids)
101112
$currentBatch[] = $id;
102113
if (++$i === $this->batchSize) {
103114
try {
104-
$this->_reindexRows($currentBatch);
115+
$this->cacheContext->registerEntities(Product::CACHE_TAG, $this->_reindexRows($currentBatch));
105116
} catch (\Exception $e) {
106117
throw new \Magento\Framework\Exception\LocalizedException(__($e->getMessage()), $e);
107118
}
@@ -112,7 +123,7 @@ public function execute($ids)
112123

113124
if (!empty($currentBatch)) {
114125
try {
115-
$this->_reindexRows($currentBatch);
126+
$this->cacheContext->registerEntities(Product::CACHE_TAG, $this->_reindexRows($currentBatch));
116127
} catch (\Exception $e) {
117128
throw new \Magento\Framework\Exception\LocalizedException(__($e->getMessage()), $e);
118129
}

app/code/Magento/Catalog/Model/ResourceModel/Product.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\Catalog\Model\ResourceModel;
77

8+
use Magento\Catalog\Api\Data\ProductInterface;
9+
use Magento\Catalog\Model\Attribute\ScopeOverriddenValue;
810
use Magento\Catalog\Model\ResourceModel\Product\Website\Link as ProductWebsiteLink;
911
use Magento\Eav\Api\AttributeManagementInterface;
1012
use Magento\Framework\App\ObjectManager;
@@ -40,15 +42,11 @@ class Product extends AbstractResource
4042
protected $_productCategoryTable;
4143

4244
/**
43-
* Catalog category
44-
*
4545
* @var Category
4646
*/
4747
protected $_catalogCategory;
4848

4949
/**
50-
* Category collection factory
51-
*
5250
* @var Category\CollectionFactory
5351
*/
5452
protected $_categoryCollectionFactory;
@@ -105,6 +103,11 @@ class Product extends AbstractResource
105103
*/
106104
private $mediaImageDeleteProcessor;
107105

106+
/**
107+
* @var ScopeOverriddenValue
108+
*/
109+
private $scopeOverriddenValue;
110+
108111
/**
109112
* @param \Magento\Eav\Model\Entity\Context $context
110113
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
@@ -120,6 +123,7 @@ class Product extends AbstractResource
120123
* @param UniqueValidationInterface|null $uniqueValidator
121124
* @param AttributeManagementInterface|null $eavAttributeManagement
122125
* @param MediaImageDeleteProcessor|null $mediaImageDeleteProcessor
126+
* @param ScopeOverriddenValue|null $scopeOverriddenValue
123127
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
124128
*/
125129
public function __construct(
@@ -136,7 +140,8 @@ public function __construct(
136140
TableMaintainer $tableMaintainer = null,
137141
UniqueValidationInterface $uniqueValidator = null,
138142
AttributeManagementInterface $eavAttributeManagement = null,
139-
?MediaImageDeleteProcessor $mediaImageDeleteProcessor = null
143+
?MediaImageDeleteProcessor $mediaImageDeleteProcessor = null,
144+
?ScopeOverriddenValue $scopeOverriddenValue = null
140145
) {
141146
$this->_categoryCollectionFactory = $categoryCollectionFactory;
142147
$this->_catalogCategory = $catalogCategory;
@@ -157,6 +162,8 @@ public function __construct(
157162
?? ObjectManager::getInstance()->get(AttributeManagementInterface::class);
158163
$this->mediaImageDeleteProcessor = $mediaImageDeleteProcessor
159164
?? ObjectManager::getInstance()->get(MediaImageDeleteProcessor::class);
165+
$this->scopeOverriddenValue = $scopeOverriddenValue
166+
?? ObjectManager::getInstance()->get(ScopeOverriddenValue::class);
160167
}
161168

162169
/**
@@ -316,6 +323,7 @@ protected function _afterSave(DataObject $product)
316323
{
317324
$this->removeNotInSetAttributeValues($product);
318325
$this->_saveWebsiteIds($product)->_saveCategories($product);
326+
$this->scopeOverriddenValue->clearAttributesValues(ProductInterface::class, $product);
319327
return parent::_afterSave($product);
320328
}
321329

0 commit comments

Comments
 (0)