diff --git a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutShippingSection.xml b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutShippingSection.xml
index c20309814d51..136658cc5910 100644
--- a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutShippingSection.xml
+++ b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutShippingSection.xml
@@ -31,5 +31,6 @@
+
diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/AddressStateFieldShouldNotAcceptJustIntegerValuesTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/AddressStateFieldShouldNotAcceptJustIntegerValuesTest.xml
new file mode 100644
index 000000000000..add1a1b1cf9b
--- /dev/null
+++ b/app/code/Magento/Checkout/Test/Mftf/Test/AddressStateFieldShouldNotAcceptJustIntegerValuesTest.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Customer/Model/Address/Validator/Country.php b/app/code/Magento/Customer/Model/Address/Validator/Country.php
index ff1020eba70e..d7fb51dbbd44 100644
--- a/app/code/Magento/Customer/Model/Address/Validator/Country.php
+++ b/app/code/Magento/Customer/Model/Address/Validator/Country.php
@@ -88,6 +88,8 @@ private function validateCountry(AbstractAddress $address)
*
* @param AbstractAddress $address
* @return array
+ * @throws \Zend_Validate_Exception
+ * @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
private function validateRegion(AbstractAddress $address)
{
@@ -107,7 +109,7 @@ private function validateRegion(AbstractAddress $address)
//If country actually has regions and requires you to
//select one then it must be selected.
$errors[] = __('"%fieldName" is required. Enter and try again.', ['fieldName' => 'regionId']);
- } elseif ($regionId && !in_array($regionId, $allowedRegions, true)) {
+ } elseif ($allowedRegions && $regionId && !in_array($regionId, $allowedRegions, true)) {
//If a region is selected then checking if it exists.
$errors[] = __(
'Invalid value of "%value" provided for the %fieldName field.',
diff --git a/app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml b/app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml
index 19194ae2e542..a1f0277ec40e 100644
--- a/app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml
+++ b/app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml
@@ -83,4 +83,8 @@
Yes
RegionCA
+
+
+ GB
+
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Address/Validator/CountryTest.php b/app/code/Magento/Customer/Test/Unit/Model/Address/Validator/CountryTest.php
index 9ab35f2d301d..d8148543a55d 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Address/Validator/CountryTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Address/Validator/CountryTest.php
@@ -161,7 +161,13 @@ public function validateDataProvider()
'region_id2' => [
array_merge($data, ['country_id' => $countryId, 'region_id' => 2]),
[$countryId++],
- [1],
+ [],
+ [],
+ ],
+ 'region_id3' => [
+ array_merge($data, ['country_id' => $countryId, 'region_id' => 2]),
+ [$countryId++],
+ [1, 3],
['Invalid value of "2" provided for the regionId field.'],
],
'validated' => [
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 1f1f07850452..6a129a3aa4b4 100644
--- a/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml
+++ b/app/code/Magento/Customer/view/frontend/templates/address/edit.phtml
@@ -112,7 +112,7 @@
name="region"
value="= $block->escapeHtmlAttr($block->getRegion()) ?>"
title="= $block->escapeHtmlAttr(__('State/Province')) ?>"
- class="input-text = $block->escapeHtmlAttr($this->helper('Magento\Customer\Helper\Address')->getAttributeValidationClass('region')) ?>"= !$block->getConfig('general/region/display_all') ? ' disabled="disabled"' : '' ?>/>
+ class="input-text validate-not-number-first = $block->escapeHtmlAttr($this->helper('Magento\Customer\Helper\Address')->getAttributeValidationClass('region')) ?>"= !$block->getConfig('general/region/display_all') ? ' disabled="disabled"' : '' ?>/>
diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/region.js b/app/code/Magento/Ui/view/base/web/js/form/element/region.js
index 0edb4c1966b5..fec69bf8558b 100644
--- a/app/code/Magento/Ui/view/base/web/js/form/element/region.js
+++ b/app/code/Magento/Ui/view/base/web/js/form/element/region.js
@@ -57,6 +57,7 @@ define([
registry.get(this.customName, function (input) {
isRegionRequired = !!option['is_region_required'];
input.validation['required-entry'] = isRegionRequired;
+ input.validation['validate-not-number-first'] = true;
input.required(isRegionRequired);
});
}
diff --git a/app/code/Magento/Ui/view/base/web/js/lib/validation/rules.js b/app/code/Magento/Ui/view/base/web/js/lib/validation/rules.js
index 41e2703f4ed1..c63b4588d2d1 100644
--- a/app/code/Magento/Ui/view/base/web/js/lib/validation/rules.js
+++ b/app/code/Magento/Ui/view/base/web/js/lib/validation/rules.js
@@ -755,6 +755,12 @@ define([
},
$.mage.__('Please use only letters (a-z or A-Z) or numbers (0-9) in this field. No spaces or other characters are allowed.')//eslint-disable-line max-len
],
+ 'validate-not-number-first': [
+ function (value) {
+ return utils.isEmptyNoTrim(value) || /^[^0-9-\.].*$/.test(value.trim());
+ },
+ $.mage.__('First character must be letter.')
+ ],
'validate-date': [
function (value, params, additionalParams) {
var test = moment(value, additionalParams.dateFormat);
diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js
index 6258b3c62737..d08819ebe94a 100644
--- a/lib/web/mage/validation.js
+++ b/lib/web/mage/validation.js
@@ -990,6 +990,12 @@
},
$.mage.__('Please use only letters (a-z or A-Z) or numbers (0-9) in this field. No spaces or other characters are allowed.') //eslint-disable-line max-len
],
+ 'validate-not-number-first': [
+ function (value) {
+ return $.mage.isEmptyNoTrim(value) || /^[^0-9-\.].*$/.test(value.trim());
+ },
+ $.mage.__('First character must be letter.')
+ ],
'validate-date': [
function (value, params, additionalParams) {
var test = moment(value, additionalParams.dateFormat);