Skip to content

Commit c60a0c9

Browse files
committed
MAGETWO-97247: Impossible to enable shared catalog through cli command
1 parent 4ee3bb3 commit c60a0c9

File tree

6 files changed

+221
-124
lines changed

6 files changed

+221
-124
lines changed

app/code/Magento/Config/Console/Command/ConfigSet/DefaultProcessor.php

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,20 @@
77

88
use Magento\Config\App\Config\Type\System;
99
use Magento\Config\Console\Command\ConfigSetCommand;
10+
use Magento\Config\Model\Config\Factory as ConfigFactory;
1011
use Magento\Framework\App\Config\ConfigPathResolver;
1112
use Magento\Framework\App\DeploymentConfig;
13+
use Magento\Framework\App\ObjectManager;
14+
use Magento\Framework\App\ScopeResolverPool;
1215
use Magento\Framework\Exception\CouldNotSaveException;
1316
use Magento\Config\Model\PreparedValueFactory;
14-
use Magento\Framework\App\Config\Value;
1517

1618
/**
1719
* Processes default flow of config:set command.
20+
*
1821
* This processor saves the value of configuration into database.
1922
*
20-
* {@inheritdoc}
23+
* @inheritdoc
2124
* @api
2225
* @since 100.2.0
2326
*/
@@ -44,26 +47,44 @@ class DefaultProcessor implements ConfigSetProcessorInterface
4447
*/
4548
private $preparedValueFactory;
4649

50+
/**
51+
* @var ScopeResolverPool
52+
*/
53+
private $scopeResolverPool;
54+
55+
/**
56+
* @var ConfigFactory
57+
*/
58+
private $configFactory;
59+
4760
/**
4861
* @param PreparedValueFactory $preparedValueFactory The factory for prepared value
4962
* @param DeploymentConfig $deploymentConfig The deployment configuration reader
5063
* @param ConfigPathResolver $configPathResolver The resolver for configuration paths according to source type
64+
* @param ScopeResolverPool|null $scopeResolverPool
65+
* @param ConfigFactory|null $configFactory
5166
*/
5267
public function __construct(
5368
PreparedValueFactory $preparedValueFactory,
5469
DeploymentConfig $deploymentConfig,
55-
ConfigPathResolver $configPathResolver
70+
ConfigPathResolver $configPathResolver,
71+
ScopeResolverPool $scopeResolverPool = null,
72+
ConfigFactory $configFactory = null
5673
) {
5774
$this->preparedValueFactory = $preparedValueFactory;
5875
$this->deploymentConfig = $deploymentConfig;
5976
$this->configPathResolver = $configPathResolver;
77+
78+
$this->scopeResolverPool = $scopeResolverPool ?? ObjectManager::getInstance()->get(ScopeResolverPool::class);
79+
$this->configFactory = $configFactory ?? ObjectManager::getInstance()->get(ConfigFactory::class);
6080
}
6181

6282
/**
6383
* Processes database flow of config:set command.
84+
*
6485
* Requires installed application.
6586
*
66-
* {@inheritdoc}
87+
* @inheritdoc
6788
* @since 100.2.0
6889
*/
6990
public function process($path, $value, $scope, $scopeCode)
@@ -78,12 +99,15 @@ public function process($path, $value, $scope, $scopeCode)
7899
}
79100

80101
try {
81-
/** @var Value $backendModel */
82-
$backendModel = $this->preparedValueFactory->create($path, $value, $scope, $scopeCode);
83-
if ($backendModel instanceof Value) {
84-
$resourceModel = $backendModel->getResource();
85-
$resourceModel->save($backendModel);
86-
}
102+
$resolvedScope = $this->scopeResolverPool->get($scope)
103+
->getScope($scopeCode);
104+
$config = $this->configFactory->create([
105+
'scope' => $resolvedScope->getScopeType(),
106+
'scope_id' => $resolvedScope->getId(),
107+
'scope_code' => $resolvedScope->getCode(),
108+
]);
109+
$config->setDataByPath($path, $value);
110+
$config->save();
87111
} catch (\Exception $exception) {
88112
throw new CouldNotSaveException(__('%1', $exception->getMessage()), $exception);
89113
}

app/code/Magento/Config/Model/Config.php

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,31 @@
99
use Magento\Config\Model\Config\Structure\Element\Group;
1010
use Magento\Config\Model\Config\Structure\Element\Field;
1111
use Magento\Framework\App\ObjectManager;
12+
use Magento\Framework\App\ScopeInterface;
13+
use Magento\Framework\App\ScopeResolverPool;
14+
use Magento\Store\Model\ScopeInterface as StoreScopeInterface;
1215

1316
/**
1417
* Backend config model
1518
*
1619
* Used to save configuration
20+
*
1721
* @author Magento Core Team <[email protected]>
1822
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1923
* @api
2024
* @since 100.0.2
25+
* @method string getSection()
26+
* @method void setSection(string $section)
27+
* @method string getWebsite()
28+
* @method void setWebsite(string $website)
29+
* @method string getStore()
30+
* @method void setStore(string $store)
31+
* @method string getScope()
32+
* @method void setScope(string $scope)
33+
* @method int getScopeId()
34+
* @method void setScopeId(int $scopeId)
35+
* @method string getScopeCode()
36+
* @method void setScopeCode(string $scopeCode)
2137
*/
2238
class Config extends \Magento\Framework\DataObject
2339
{
@@ -87,6 +103,11 @@ class Config extends \Magento\Framework\DataObject
87103
*/
88104
private $settingChecker;
89105

106+
/**
107+
* @var ScopeResolverPool
108+
*/
109+
private $scopeResolverPool;
110+
90111
/**
91112
* @param \Magento\Framework\App\Config\ReinitableConfigInterface $config
92113
* @param \Magento\Framework\Event\ManagerInterface $eventManager
@@ -97,6 +118,7 @@ class Config extends \Magento\Framework\DataObject
97118
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
98119
* @param Config\Reader\Source\Deployed\SettingChecker|null $settingChecker
99120
* @param array $data
121+
* @param ScopeResolverPool|null $scopeResolverPool
100122
*/
101123
public function __construct(
102124
\Magento\Framework\App\Config\ReinitableConfigInterface $config,
@@ -107,7 +129,8 @@ public function __construct(
107129
\Magento\Framework\App\Config\ValueFactory $configValueFactory,
108130
\Magento\Store\Model\StoreManagerInterface $storeManager,
109131
SettingChecker $settingChecker = null,
110-
array $data = []
132+
array $data = [],
133+
ScopeResolverPool $scopeResolverPool = null
111134
) {
112135
parent::__construct($data);
113136
$this->_eventManager = $eventManager;
@@ -117,7 +140,8 @@ public function __construct(
117140
$this->_configLoader = $configLoader;
118141
$this->_configValueFactory = $configValueFactory;
119142
$this->_storeManager = $storeManager;
120-
$this->settingChecker = $settingChecker ?: ObjectManager::getInstance()->get(SettingChecker::class);
143+
$this->settingChecker = $settingChecker ?? ObjectManager::getInstance()->get(SettingChecker::class);
144+
$this->scopeResolverPool = $scopeResolverPool ?? ObjectManager::getInstance()->get(ScopeResolverPool::class);
121145
}
122146

123147
/**
@@ -505,9 +529,8 @@ public function setDataByPath($path, $value)
505529
}
506530

507531
/**
508-
* Get scope name and scopeId
532+
* Resolve scope data
509533
*
510-
* @todo refactor to scope resolver
511534
* @return void
512535
*/
513536
private function initScope()
@@ -522,24 +545,33 @@ private function initScope()
522545
$this->setStore('');
523546
}
524547

525-
if ($this->getStore()) {
526-
$scope = 'stores';
527-
$store = $this->_storeManager->getStore($this->getStore());
528-
$scopeId = (int)$store->getId();
529-
$scopeCode = $store->getCode();
530-
} elseif ($this->getWebsite()) {
531-
$scope = 'websites';
532-
$website = $this->_storeManager->getWebsite($this->getWebsite());
533-
$scopeId = (int)$website->getId();
534-
$scopeCode = $website->getCode();
548+
if ($this->getScope() && $this->getScopeId() && $this->getScopeCode()) {
549+
$scope = $this->scopeResolverPool->get($this->getScope())
550+
->getScope($this->getScopeId());
551+
if (StoreScopeInterface::SCOPE_WEBSITE === $scope->getScopeType()) {
552+
$this->setWebsite($scope->getId());
553+
} elseif (StoreScopeInterface::SCOPE_STORE === $scope->getScopeType()) {
554+
$this->setStore($scope->getId());
555+
}
535556
} else {
536-
$scope = 'default';
537-
$scopeId = 0;
538-
$scopeCode = '';
557+
switch (true) {
558+
case $this->getStore():
559+
$scope = $this->scopeResolverPool->get(StoreScopeInterface::SCOPE_STORE)
560+
->getScope($this->getStore());
561+
break;
562+
case $this->getWebsite():
563+
$scope = $this->scopeResolverPool->get(StoreScopeInterface::SCOPE_WEBSITE)
564+
->getScope($this->getWebsite());
565+
break;
566+
default:
567+
$scope = $this->scopeResolverPool->get(ScopeInterface::SCOPE_DEFAULT)
568+
->getScope(0);
569+
break;
570+
}
571+
$this->setScope($scope->getScopeType());
572+
$this->setScopeId($scope->getId());
573+
$this->setScopeCode($scope->getCode());
539574
}
540-
$this->setScope($scope);
541-
$this->setScopeId($scopeId);
542-
$this->setScopeCode($scopeCode);
543575
}
544576

545577
/**

0 commit comments

Comments
 (0)