Skip to content

Commit 1d19c62

Browse files
committed
github 32996 - create a Directory module region updater that relies on MySQL ordering of regions for the region drop down
1 parent 0c14764 commit 1d19c62

File tree

7 files changed

+359
-4
lines changed

7 files changed

+359
-4
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
/**
3+
* RegionProvider
4+
*
5+
* @copyright Copyright © 2021 Staempfli AG. All rights reserved.
6+
* @author juan.alonso@staempfli.com
7+
*/
8+
9+
namespace Magento\Customer\ViewModel\Address;
10+
11+
use Magento\Directory\Helper\Data as DataHelper;
12+
use Magento\Framework\Serialize\Serializer\Json as JsonSerializer;
13+
use Magento\Framework\View\Element\Block\ArgumentInterface;
14+
15+
class RegionProvider implements ArgumentInterface
16+
{
17+
18+
19+
protected $regions = [];
20+
21+
/**
22+
* @var DataHelper
23+
*/
24+
private $directoryHelper;
25+
/**
26+
* @var JsonSerializer
27+
*/
28+
private $jsonSerializer;
29+
30+
31+
/**
32+
* Constructor
33+
*
34+
* @param DataHelper $directoryHelper
35+
* @param JsonSerializer $jsonSerializer
36+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
37+
*/
38+
public function __construct(
39+
DataHelper $directoryHelper,
40+
JsonSerializer $jsonSerializer
41+
) {
42+
$this->directoryHelper= $directoryHelper;
43+
$this->jsonSerializer = $jsonSerializer;
44+
}
45+
46+
public function getRegionJson() : string
47+
{
48+
$regions = $this->getRegions();
49+
return $this->jsonSerializer->serialize($regions);
50+
}
51+
52+
53+
/**
54+
* @return array
55+
*/
56+
protected function getRegions() : array
57+
{
58+
if (!$this->regions) {
59+
$regions = $this->directoryHelper->getRegionData();
60+
$this->regions['config'] = $regions['config'];
61+
unset($regions['config']);
62+
foreach ($regions as $countryCode => $countryRegions) {
63+
foreach ($countryRegions as $regionId => $regionData) {
64+
$this->regions[$countryCode][] = [
65+
'id' => $regionId,
66+
'name' => $regionData['name'],
67+
'code' => $regionData['code']
68+
];
69+
}
70+
}
71+
72+
}
73+
return $this->regions;
74+
}
75+
76+
}

app/code/Magento/Customer/view/frontend/layout/customer_account_create.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
<block class="Magento\Customer\Block\Form\Register" name="customer_form_register" template="Magento_Customer::form/register.phtml">
1818
<arguments>
1919
<argument name="attribute_data" xsi:type="object">Magento\Customer\Block\DataProviders\AddressAttributeData</argument>
20+
<argument name="region_provider" xsi:type="object">Magento\Customer\ViewModel\Address\RegionProvider</argument>
21+
<argument name="show_address_fields" xsi:type="boolean">true</argument>
2022
</arguments>
2123
<container name="form.additional.info" as="form_additional_info"/>
2224
<container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>

app/code/Magento/Customer/view/frontend/layout/customer_address_form.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<argument name="attribute_data" xsi:type="object">Magento\Customer\Block\DataProviders\AddressAttributeData</argument>
2323
<argument name="post_code_config" xsi:type="object">Magento\Customer\Block\DataProviders\PostCodesPatternsAttributeData</argument>
2424
<argument name="view_model" xsi:type="object">Magento\Customer\ViewModel\Address</argument>
25+
<argument name="region_provider" xsi:type="object">Magento\Customer\ViewModel\Address\RegionProvider</argument>
2526
</arguments>
2627
</block>
2728
</referenceContainer>

app/code/Magento/Customer/view/frontend/templates/address/edit.phtml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
/** @var \Magento\Customer\ViewModel\Address $viewModel */
99
/** @var \Magento\Framework\Escaper $escaper */
1010
/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
11+
/** @var \Magento\Customer\ViewModel\Address\RegionProvider $regionProvider */
1112
$viewModel = $block->getViewModel();
13+
$regionProvider = $block->getRegionProvider();
1214
?>
1315
<?php $_company = $block->getLayout()->createBlock(\Magento\Customer\Block\Widget\Company::class) ?>
1416
<?php $_telephone = $block->getLayout()->createBlock(\Magento\Customer\Block\Widget\Telephone::class) ?>
@@ -222,13 +224,13 @@ $viewModel = $block->getViewModel();
222224
}
223225
},
224226
"#country": {
225-
"regionUpdater": {
227+
"directoryRegionUpdater": {
226228
"optionalRegionAllowed": <?= /* @noEscape */ $_displayAll ? 'true' : 'false' ?>,
227229
"regionListId": "#region_id",
228230
"regionInputId": "#region",
229231
"postcodeId": "#zip",
230232
"form": "#form-validate",
231-
"regionJson": <?= /* @noEscape */ $viewModel->dataGetRegionJson() ?>,
233+
"regionJson": <?= /* @noEscape */ $regionProvider->getRegionJson(); ?>,
232234
"defaultRegion": "<?= (int) $block->getRegionId() ?>",
233235
"countriesWithOptionalZip": <?= /* @noEscape */ $viewModel->dataGetCountriesWithOptionalZip(true) ?>
234236
}

app/code/Magento/Customer/view/frontend/templates/form/register.phtml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ use Magento\Customer\Helper\Address;
1414
$addressHelper = $block->getData('addressHelper');
1515
/** @var \Magento\Directory\Helper\Data $directoryHelper */
1616
$directoryHelper = $block->getData('directoryHelper');
17+
/** @var \Magento\Customer\ViewModel\Address\RegionProvider $regionProvider */
18+
$regionProvider = $block->getRegionProvider();
1719
$formData = $block->getFormData();
1820
?>
1921
<?php $displayAll = $block->getConfig('general/region/display_all'); ?>
@@ -342,14 +344,14 @@ script;
342344
<?= /* @noEscape */ $secureRenderer->renderTag('script', [], $scriptString, false) ?>
343345
<?php if ($block->getShowAddressFields()): ?>
344346
<?php
345-
$regionJson = /* @noEscape */ $directoryHelper->getRegionJson();
347+
$regionJson = /* @noEscape */ $regionProvider->getRegionJson();
346348
$regionId = (int) $formData->getRegionId();
347349
$countriesWithOptionalZip = /* @noEscape */ $directoryHelper->getCountriesWithOptionalZip(true);
348350
?>
349351
<script type="text/x-magento-init">
350352
{
351353
"#country": {
352-
"regionUpdater": {
354+
"directoryRegionUpdater": {
353355
"optionalRegionAllowed": <?= /* @noEscape */ $displayAll ? 'true' : 'false' ?>,
354356
"regionListId": "#region_id",
355357
"regionInputId": "#region",
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
var config = {
7+
map: {
8+
'*': {
9+
directoryRegionUpdater: 'Magento_Directory/js/region-updater',
10+
}
11+
}
12+
};

0 commit comments

Comments
 (0)