Skip to content

Commit 51866b2

Browse files
authored
ENGCOM-7810: #28569:Multi-store: Missing store codes in relation t… #28794
2 parents f8f1e5e + fcc5772 commit 51866b2

File tree

7 files changed

+358
-59
lines changed

7 files changed

+358
-59
lines changed

app/code/Magento/Store/Model/ResourceModel/StoreWebsiteRelation.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public function __construct(ResourceConnection $resource)
2727
}
2828

2929
/**
30+
* Get store by website id
31+
*
3032
* @param int $websiteId
3133
* @return array
3234
*/
@@ -41,4 +43,29 @@ public function getStoreByWebsiteId($websiteId)
4143
$data = $connection->fetchCol($storeSelect);
4244
return $data;
4345
}
46+
47+
/**
48+
* Get website store data
49+
*
50+
* @param int $websiteId
51+
* @param bool $available
52+
* @return array
53+
*/
54+
public function getWebsiteStores(int $websiteId, bool $available = false): array
55+
{
56+
$connection = $this->resource->getConnection();
57+
$storeTable = $this->resource->getTableName('store');
58+
$storeSelect = $connection->select()->from($storeTable)->where(
59+
'website_id = ?',
60+
$websiteId
61+
);
62+
63+
if ($available) {
64+
$storeSelect = $storeSelect->where(
65+
'is_active = 1'
66+
);
67+
}
68+
69+
return $connection->fetchAll($storeSelect);
70+
}
4471
}

app/code/Magento/Store/Model/Service/StoreConfigManager.php

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

8-
/**
9-
* Allows to get store config
10-
*/
9+
use Magento\Framework\App\Config\ScopeConfigInterface;
10+
use Magento\Store\Api\Data\StoreConfigInterface;
11+
use Magento\Store\Api\Data\StoreInterface;
12+
use Magento\Store\Model\Data\StoreConfig;
13+
use Magento\Store\Model\Data\StoreConfigFactory;
14+
use Magento\Store\Model\ResourceModel\Store\CollectionFactory;
15+
use Magento\Store\Model\Store;
16+
1117
class StoreConfigManager implements \Magento\Store\Api\StoreConfigManagerInterface
1218
{
1319
/**
14-
* @var \Magento\Store\Model\ResourceModel\Store\CollectionFactory
20+
* @var CollectionFactory
1521
*/
1622
protected $storeCollectionFactory;
1723

1824
/**
19-
* @var \Magento\Store\Model\Data\StoreConfigFactory
25+
* @var StoreConfigFactory
2026
*/
2127
protected $storeConfigFactory;
2228

2329
/**
2430
* Core store config
2531
*
26-
* @var \Magento\Framework\App\Config\ScopeConfigInterface
32+
* @var ScopeConfigInterface
2733
*/
2834
protected $scopeConfig;
2935

@@ -41,25 +47,25 @@ class StoreConfigManager implements \Magento\Store\Api\StoreConfigManagerInterfa
4147
];
4248

4349
/**
44-
* @param \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory
45-
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
46-
* @param \Magento\Store\Model\Data\StoreConfigFactory $storeConfigFactory
50+
* @param CollectionFactory $storeCollectionFactory
51+
* @param ScopeConfigInterface $scopeConfig
52+
* @param StoreConfigFactory $storeConfigFactory
4753
*/
4854
public function __construct(
49-
\Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory,
50-
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
51-
\Magento\Store\Model\Data\StoreConfigFactory $storeConfigFactory
55+
CollectionFactory $storeCollectionFactory,
56+
ScopeConfigInterface $scopeConfig,
57+
StoreConfigFactory $storeConfigFactory
5258
) {
5359
$this->storeCollectionFactory = $storeCollectionFactory;
5460
$this->scopeConfig = $scopeConfig;
5561
$this->storeConfigFactory = $storeConfigFactory;
5662
}
5763

5864
/**
59-
* Get store configs
65+
* Get store configurations
6066
*
6167
* @param string[] $storeCodes list of stores by store codes, will return all if storeCodes is not set
62-
* @return \Magento\Store\Api\Data\StoreConfigInterface[]
68+
* @return StoreConfigInterface[]
6369
*/
6470
public function getStoreConfigs(array $storeCodes = null)
6571
{
@@ -76,14 +82,14 @@ public function getStoreConfigs(array $storeCodes = null)
7682
}
7783

7884
/**
79-
* Get store config
85+
* Get store specific configs
8086
*
81-
* @param \Magento\Store\Model\Store $store
82-
* @return \Magento\Store\Api\Data\StoreConfigInterface
87+
* @param Store|StoreInterface $store
88+
* @return StoreConfigInterface
8389
*/
8490
protected function getStoreConfig($store)
8591
{
86-
/** @var \Magento\Store\Model\Data\StoreConfig $storeConfig */
92+
/** @var StoreConfig $storeConfig */
8793
$storeConfig = $this->storeConfigFactory->create();
8894

8995
$storeConfig->setId($store->getId())
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\StoreGraphQl\Model\Resolver;
9+
10+
use Magento\Framework\GraphQl\Config\Element\Field;
11+
use Magento\Framework\GraphQl\Query\ResolverInterface;
12+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
13+
use Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider;
14+
15+
/**
16+
* AvailableStores page field resolver, used for GraphQL request processing.
17+
*/
18+
class AvailableStoresResolver implements ResolverInterface
19+
{
20+
/**
21+
* @var StoreConfigDataProvider
22+
*/
23+
private $storeConfigDataProvider;
24+
25+
/**
26+
* @param StoreConfigDataProvider $storeConfigsDataProvider
27+
*/
28+
public function __construct(
29+
StoreConfigDataProvider $storeConfigsDataProvider
30+
) {
31+
$this->storeConfigDataProvider = $storeConfigsDataProvider;
32+
}
33+
34+
/**
35+
* @inheritdoc
36+
*/
37+
public function resolve(
38+
Field $field,
39+
$context,
40+
ResolveInfo $info,
41+
array $value = null,
42+
array $args = null
43+
) {
44+
return $this->storeConfigDataProvider->getAvailableStoreConfig(
45+
(int)$context->getExtensionAttributes()->getStore()->getWebsiteId()
46+
);
47+
}
48+
}

app/code/Magento/StoreGraphQl/Model/Resolver/Store/StoreConfigDataProvider.php

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
namespace Magento\StoreGraphQl\Model\Resolver\Store;
99

1010
use Magento\Framework\App\Config\ScopeConfigInterface;
11+
use Magento\Store\Api\Data\StoreConfigInterface;
1112
use Magento\Store\Api\StoreConfigManagerInterface;
13+
use Magento\Store\Model\ResourceModel\StoreWebsiteRelation;
1214
use Magento\Store\Model\ScopeInterface;
1315
use Magento\Store\Api\Data\StoreInterface;
1416

@@ -32,19 +34,27 @@ class StoreConfigDataProvider
3234
*/
3335
private $extendedConfigData;
3436

37+
/**
38+
* @var StoreWebsiteRelation
39+
*/
40+
private $storeWebsiteRelation;
41+
3542
/**
3643
* @param StoreConfigManagerInterface $storeConfigManager
3744
* @param ScopeConfigInterface $scopeConfig
45+
* @param StoreWebsiteRelation $storeWebsiteRelation
3846
* @param array $extendedConfigData
3947
*/
4048
public function __construct(
4149
StoreConfigManagerInterface $storeConfigManager,
4250
ScopeConfigInterface $scopeConfig,
51+
StoreWebsiteRelation $storeWebsiteRelation,
4352
array $extendedConfigData = []
4453
) {
4554
$this->storeConfigManager = $storeConfigManager;
4655
$this->scopeConfig = $scopeConfig;
4756
$this->extendedConfigData = $extendedConfigData;
57+
$this->storeWebsiteRelation = $storeWebsiteRelation;
4858
}
4959

5060
/**
@@ -55,23 +65,42 @@ public function __construct(
5565
*/
5666
public function getStoreConfigData(StoreInterface $store): array
5767
{
58-
return array_merge(
59-
$this->getBaseConfigData($store),
60-
$this->getExtendedConfigData((int)$store->getId())
61-
);
68+
$defaultStoreConfig = $this->storeConfigManager->getStoreConfigs([$store->getCode()]);
69+
return $this->prepareStoreConfigData(current($defaultStoreConfig), $store->getName());
6270
}
6371

6472
/**
65-
* Get base config data
73+
* Get available website stores
6674
*
67-
* @param StoreInterface $store
75+
* @param int $websiteId
6876
* @return array
6977
*/
70-
private function getBaseConfigData(StoreInterface $store) : array
78+
public function getAvailableStoreConfig(int $websiteId): array
7179
{
72-
$storeConfig = current($this->storeConfigManager->getStoreConfigs([$store->getCode()]));
80+
$websiteStores = $this->storeWebsiteRelation->getWebsiteStores($websiteId, true);
81+
$storeCodes = array_column($websiteStores, 'code');
82+
83+
$storeConfigs = $this->storeConfigManager->getStoreConfigs($storeCodes);
84+
$storesConfigData = [];
85+
86+
foreach ($storeConfigs as $storeConfig) {
87+
$key = array_search($storeConfig->getCode(), array_column($websiteStores, 'code'), true);
88+
$storesConfigData[] = $this->prepareStoreConfigData($storeConfig, $websiteStores[$key]['name']);
89+
}
7390

74-
return [
91+
return $storesConfigData;
92+
}
93+
94+
/**
95+
* Prepare store config data
96+
*
97+
* @param StoreConfigInterface $storeConfig
98+
* @param string $storeName
99+
* @return array
100+
*/
101+
private function prepareStoreConfigData(StoreConfigInterface $storeConfig, string $storeName): array
102+
{
103+
return array_merge([
75104
'id' => $storeConfig->getId(),
76105
'code' => $storeConfig->getCode(),
77106
'website_id' => $storeConfig->getWebsiteId(),
@@ -82,14 +111,14 @@ private function getBaseConfigData(StoreInterface $store) : array
82111
'weight_unit' => $storeConfig->getWeightUnit(),
83112
'base_url' => $storeConfig->getBaseUrl(),
84113
'base_link_url' => $storeConfig->getBaseLinkUrl(),
85-
'base_static_url' => $storeConfig->getSecureBaseStaticUrl(),
114+
'base_static_url' => $storeConfig->getBaseStaticUrl(),
86115
'base_media_url' => $storeConfig->getBaseMediaUrl(),
87116
'secure_base_url' => $storeConfig->getSecureBaseUrl(),
88117
'secure_base_link_url' => $storeConfig->getSecureBaseLinkUrl(),
89118
'secure_base_static_url' => $storeConfig->getSecureBaseStaticUrl(),
90119
'secure_base_media_url' => $storeConfig->getSecureBaseMediaUrl(),
91-
'store_name' => $store->getName()
92-
];
120+
'store_name' => $storeName,
121+
], $this->getExtendedConfigData((int)$storeConfig->getId()));
93122
}
94123

95124
/**
@@ -98,7 +127,7 @@ private function getBaseConfigData(StoreInterface $store) : array
98127
* @param int $storeId
99128
* @return array
100129
*/
101-
private function getExtendedConfigData(int $storeId)
130+
private function getExtendedConfigData(int $storeId): array
102131
{
103132
$extendedConfigData = [];
104133
foreach ($this->extendedConfigData as $key => $path) {

app/code/Magento/StoreGraphQl/etc/schema.graphqls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# See COPYING.txt for license details.
33
type Query {
44
storeConfig : StoreConfig @resolver(class: "Magento\\StoreGraphQl\\Model\\Resolver\\StoreConfigResolver") @doc(description: "The store config query") @cache(cacheable: false)
5+
availableStores: [StoreConfig] @resolver(class: "Magento\\StoreGraphQl\\Model\\Resolver\\AvailableStoresResolver") @doc(description: "Get a list of available store views and their config information.")
56
}
67

78
type Website @doc(description: "Website is deprecated because it is should not be used on storefront. The type contains information about a website") {

0 commit comments

Comments
 (0)