Skip to content

Commit fcc5772

Browse files
ENGCOM-7810: #28569:Multi-store: Missing store codes in relation t… #28794
- Merge Pull Request #28794 from magento/magento2:28569_adding_stores_to_store_config - Merged commits: 1. 0b577a3 2. 1973c26 3. 5ab033d 4. ac5835b 5. 5ea15d1 6. 4fe5f8f 7. 48f8add 8. d8643e2 9. 7cb5e98 10. 2a3f775 11. d627611 12. 48749bc 13. 362b81a 14. 78ea7b8 15. e1f8b56 16. 4c994bf 17. ad896c5 18. 454695c 19. 00fbf7f 20. 3c770e2 21. d9edb5b 22. b23125e 23. 0ccadf5
2 parents f8f1e5e + 0ccadf5 commit fcc5772

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)