Skip to content

Commit eef82fd

Browse files
committed
MAGETWO-67092: Table salesrule_product_attribute is not populated when upgrading to 2.2
1 parent 86eed24 commit eef82fd

File tree

2 files changed

+96
-6
lines changed

2 files changed

+96
-6
lines changed

app/code/Magento/SalesRule/Setup/UpgradeData.php

Lines changed: 95 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,27 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\SalesRule\Setup;
78

9+
use Magento\Backend\App\Area\FrontNameResolver;
10+
use Magento\Framework\App\State;
811
use Magento\Framework\DB\AggregatedFieldDataConverter;
912
use Magento\Framework\DB\DataConverter\SerializedToJson;
1013
use Magento\Framework\DB\FieldToConvert;
14+
use Magento\Framework\EntityManager\MetadataPool;
15+
use Magento\Framework\Serialize\Serializer\Json;
1116
use Magento\Framework\Setup\ModuleContextInterface;
1217
use Magento\Framework\Setup\ModuleDataSetupInterface;
1318
use Magento\Framework\Setup\UpgradeDataInterface;
14-
use Magento\Framework\EntityManager\MetadataPool;
1519
use Magento\SalesRule\Api\Data\RuleInterface;
20+
use Magento\SalesRule\Model\ResourceModel\Rule as ResourceModelRule;
21+
use Magento\SalesRule\Model\ResourceModel\Rule\CollectionFactory as RuleCollectionFactory;
22+
use Magento\SalesRule\Model\Rule as ModelRule;
1623

24+
/**
25+
* Class \Magento\SalesRule\Setup\UpgradeData
26+
*/
1727
class UpgradeData implements UpgradeDataInterface
1828
{
1929
/**
@@ -27,17 +37,55 @@ class UpgradeData implements UpgradeDataInterface
2737
private $aggregatedFieldConverter;
2838

2939
/**
30-
* UpgradeData constructor.
40+
* Resource Model of sales rule.
3141
*
42+
* @var ResourceModelRule;
43+
*/
44+
private $resourceModelRule;
45+
46+
/**
47+
* App state.
48+
*
49+
* @var State
50+
*/
51+
private $state;
52+
53+
/**
54+
* Serializer.
55+
*
56+
* @var Json
57+
*/
58+
private $serializer;
59+
60+
/**
61+
* Rule Collection Factory.
62+
*
63+
* @var RuleColletionFactory
64+
*/
65+
private $ruleColletionFactory;
66+
67+
/**
3268
* @param AggregatedFieldDataConverter $aggregatedFieldConverter
3369
* @param MetadataPool $metadataPool
70+
* @param ResourceModelRule $resourceModelRule
71+
* @param Json $serializer
72+
* @param State $state
73+
* @param RuleCollectionFactory $ruleColletionFactory
3474
*/
3575
public function __construct(
3676
AggregatedFieldDataConverter $aggregatedFieldConverter,
37-
MetadataPool $metadataPool
77+
MetadataPool $metadataPool,
78+
ResourceModelRule $resourceModelRule,
79+
Json $serializer,
80+
State $state,
81+
RuleCollectionFactory $ruleColletionFactory
3882
) {
3983
$this->aggregatedFieldConverter = $aggregatedFieldConverter;
4084
$this->metadataPool = $metadataPool;
85+
$this->resourceModelRule = $resourceModelRule;
86+
$this->serializer = $serializer;
87+
$this->state = $state;
88+
$this->ruleColletionFactory = $ruleColletionFactory;
4189
}
4290

4391
/**
@@ -46,11 +94,17 @@ public function __construct(
4694
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
4795
{
4896
$setup->startSetup();
49-
5097
if (version_compare($context->getVersion(), '2.0.2', '<')) {
5198
$this->convertSerializedDataToJson($setup);
5299
}
53-
100+
if (version_compare($context->getVersion(), '2.0.3', '<')) {
101+
$this->state->emulateAreaCode(
102+
FrontNameResolver::AREA_CODE,
103+
[$this, 'fillSalesRuleProductAttributeTable'],
104+
[$setup]
105+
);
106+
$this->fillSalesRuleProductAttributeTable();
107+
}
54108
$setup->endSetup();
55109
}
56110

@@ -82,4 +136,40 @@ public function convertSerializedDataToJson($setup)
82136
$setup->getConnection()
83137
);
84138
}
139+
140+
/**
141+
* Fills blank table salesrule_product_attribute with data.
142+
*
143+
* @return void
144+
*/
145+
public function fillSalesRuleProductAttributeTable()
146+
{
147+
$ruleCollection = $this->getRuleColletion();
148+
/** @var ModelRule $rule */
149+
foreach ($ruleCollection as $rule) {
150+
// Save product attributes used in rule
151+
$ruleProductAttributes = array_merge(
152+
$this->resourceModelRule->getProductAttributes(
153+
$this->serializer->serialize($rule->getConditions()->asArray())
154+
),
155+
$this->resourceModelRule->getProductAttributes(
156+
$this->serializer->serialize($rule->getActions()->asArray())
157+
)
158+
);
159+
if (count($ruleProductAttributes)) {
160+
$this->resourceModelRule->setActualProductAttributes($rule, $ruleProductAttributes);
161+
}
162+
}
163+
}
164+
165+
/**
166+
* Get sales rule collection.
167+
*
168+
* @deprecated
169+
* @return ResourceModelRule\Collection
170+
*/
171+
private function getRuleColletion()
172+
{
173+
return $this->ruleColletionFactory->create();
174+
}
85175
}

app/code/Magento/SalesRule/etc/module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9-
<module name="Magento_SalesRule" setup_version="2.0.2">
9+
<module name="Magento_SalesRule" setup_version="2.0.3">
1010
<sequence>
1111
<module name="Magento_Rule"/>
1212
<module name="Magento_Catalog"/>

0 commit comments

Comments
 (0)