From 1d19c628c8accab2db4fb3165bde4206153b38ff Mon Sep 17 00:00:00 2001 From: Paras Sood Date: Mon, 31 May 2021 16:15:53 +0100 Subject: [PATCH 01/27] github 32996 - create a Directory module region updater that relies on MySQL ordering of regions for the region drop down --- .../ViewModel/Address/RegionProvider.php | 76 +++++ .../layout/customer_account_create.xml | 2 + .../frontend/layout/customer_address_form.xml | 1 + .../frontend/templates/address/edit.phtml | 6 +- .../frontend/templates/form/register.phtml | 6 +- .../view/frontend/requirejs-config.js | 12 + .../view/frontend/web/js/region-updater.js | 260 ++++++++++++++++++ 7 files changed, 359 insertions(+), 4 deletions(-) create mode 100644 app/code/Magento/Customer/ViewModel/Address/RegionProvider.php create mode 100644 app/code/Magento/Directory/view/frontend/requirejs-config.js create mode 100644 app/code/Magento/Directory/view/frontend/web/js/region-updater.js diff --git a/app/code/Magento/Customer/ViewModel/Address/RegionProvider.php b/app/code/Magento/Customer/ViewModel/Address/RegionProvider.php new file mode 100644 index 0000000000000..5c7921cd8a244 --- /dev/null +++ b/app/code/Magento/Customer/ViewModel/Address/RegionProvider.php @@ -0,0 +1,76 @@ +directoryHelper= $directoryHelper; + $this->jsonSerializer = $jsonSerializer; + } + + public function getRegionJson() : string + { + $regions = $this->getRegions(); + return $this->jsonSerializer->serialize($regions); + } + + + /** + * @return array + */ + protected function getRegions() : array + { + if (!$this->regions) { + $regions = $this->directoryHelper->getRegionData(); + $this->regions['config'] = $regions['config']; + unset($regions['config']); + foreach ($regions as $countryCode => $countryRegions) { + foreach ($countryRegions as $regionId => $regionData) { + $this->regions[$countryCode][] = [ + 'id' => $regionId, + 'name' => $regionData['name'], + 'code' => $regionData['code'] + ]; + } + } + + } + return $this->regions; + } + +} diff --git a/app/code/Magento/Customer/view/frontend/layout/customer_account_create.xml b/app/code/Magento/Customer/view/frontend/layout/customer_account_create.xml index 0c5af453f2373..cf16857592431 100644 --- a/app/code/Magento/Customer/view/frontend/layout/customer_account_create.xml +++ b/app/code/Magento/Customer/view/frontend/layout/customer_account_create.xml @@ -17,6 +17,8 @@ Magento\Customer\Block\DataProviders\AddressAttributeData + Magento\Customer\ViewModel\Address\RegionProvider + true diff --git a/app/code/Magento/Customer/view/frontend/layout/customer_address_form.xml b/app/code/Magento/Customer/view/frontend/layout/customer_address_form.xml index 29343c6066846..9a89f588bc750 100644 --- a/app/code/Magento/Customer/view/frontend/layout/customer_address_form.xml +++ b/app/code/Magento/Customer/view/frontend/layout/customer_address_form.xml @@ -22,6 +22,7 @@ Magento\Customer\Block\DataProviders\AddressAttributeData Magento\Customer\Block\DataProviders\PostCodesPatternsAttributeData Magento\Customer\ViewModel\Address + Magento\Customer\ViewModel\Address\RegionProvider diff --git a/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml b/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml index 71ac56475ae84..4622fac631270 100644 --- a/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml @@ -8,7 +8,9 @@ /** @var \Magento\Customer\ViewModel\Address $viewModel */ /** @var \Magento\Framework\Escaper $escaper */ /** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */ +/** @var \Magento\Customer\ViewModel\Address\RegionProvider $regionProvider */ $viewModel = $block->getViewModel(); +$regionProvider = $block->getRegionProvider(); ?> getLayout()->createBlock(\Magento\Customer\Block\Widget\Company::class) ?> getLayout()->createBlock(\Magento\Customer\Block\Widget\Telephone::class) ?> @@ -222,13 +224,13 @@ $viewModel = $block->getViewModel(); } }, "#country": { - "regionUpdater": { + "directoryRegionUpdater": { "optionalRegionAllowed": , "regionListId": "#region_id", "regionInputId": "#region", "postcodeId": "#zip", "form": "#form-validate", - "regionJson": dataGetRegionJson() ?>, + "regionJson": getRegionJson(); ?>, "defaultRegion": "getRegionId() ?>", "countriesWithOptionalZip": dataGetCountriesWithOptionalZip(true) ?> } diff --git a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml index 0394f112b1424..d08f201663803 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml @@ -14,6 +14,8 @@ use Magento\Customer\Helper\Address; $addressHelper = $block->getData('addressHelper'); /** @var \Magento\Directory\Helper\Data $directoryHelper */ $directoryHelper = $block->getData('directoryHelper'); +/** @var \Magento\Customer\ViewModel\Address\RegionProvider $regionProvider */ +$regionProvider = $block->getRegionProvider(); $formData = $block->getFormData(); ?> getConfig('general/region/display_all'); ?> @@ -342,14 +344,14 @@ script; renderTag('script', [], $scriptString, false) ?> getShowAddressFields()): ?> getRegionJson(); + $regionJson = /* @noEscape */ $regionProvider->getRegionJson(); $regionId = (int) $formData->getRegionId(); $countriesWithOptionalZip = /* @noEscape */ $directoryHelper->getCountriesWithOptionalZip(true); ?>