If someone is still looking for solutions, you can also add a helper
class to convert the region to region code and call the helper function in your block.
Example
Assuming you have already created custom module
Package/module/Helper/Data.php
<?php
namespace Package\Module\Helper;
use Magento\Directory\Model\ResourceModel\Region\Collection;
use Magento\Directory\Model\ResourceModel\Region\CollectionFactory;
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* @var Collection
*/
private $collectionFactory;
public function __construct(
CollectionFactory $collectionFactory
) {
$this->collectionFactory = $collectionFactory;
}
/**
* @param string $region
* @return string[]
*/
public function getRegionCode(string $region): array
{
$regionCode = $this->collectionFactory->create()
->addRegionNameFilter($region)
->getFirstItem()
->toArray();
return $regionCode;
}
}
Now need to override your core module
Package/module/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Customer\Block\Address\Renderer\DefaultRenderer" type="Package\Module\Block\Address\Renderer\DefaultRenderer"/>
</config>
And Finally your custom block
Package/module/Block/Address/Renderer/DefaultRenderer.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Package\module\Block\Address\Renderer;
use Magento\Customer\Block\Address\Renderer\RendererInterface;
use Magento\Customer\Model\Address\AddressModelInterface;
use Magento\Customer\Model\Address\Mapper;
use Magento\Customer\Model\Metadata\ElementFactory;
use Magento\Directory\Model\Country\Format;
use Magento\Framework\View\Element\AbstractBlock;
use Magento\TestFramework\Event\Magento;
use Package\module\Helper\Data;
/**
* Address format renderer default
*/
class DefaultRenderer extends AbstractBlock implements RendererInterface
{
/**
* Format type object
*
* @var \Magento\Framework\DataObject
*/
protected $_type;
/**
* @var ElementFactory
*/
protected $_elementFactory;
/**
* @var \Magento\Directory\Model\CountryFactory
*/
protected $_countryFactory;
/**
* @var \Magento\Customer\Api\AddressMetadataInterface
*/
protected $_addressMetadataService;
/**
* @var Mapper
*/
protected $addressMapper;
/**
* Constructor
*
* @param \Magento\Framework\View\Element\Context $context
* @param ElementFactory $elementFactory
* @param \Magento\Directory\Model\CountryFactory $countryFactory
* @param \Magento\Customer\Api\AddressMetadataInterface $metadataService
* @param Mapper $addressMapper
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Context $context,
ElementFactory $elementFactory,
\Magento\Directory\Model\CountryFactory $countryFactory,
\Magento\Customer\Api\AddressMetadataInterface $metadataService,
Mapper $addressMapper,
array $data = [],
Data $helper
) {
$this->_elementFactory = $elementFactory;
$this->_countryFactory = $countryFactory;
$this->_addressMetadataService = $metadataService;
$this->addressMapper = $addressMapper;
parent::__construct($context, $data);
$this->_isScopePrivate = true;
$this->helper = $helper;
}
/**
* Retrieve format type object
*
* @return \Magento\Framework\DataObject
*/
public function getType()
{
return $this->_type;
}
/**
* Retrieve format type object
*
* @param \Magento\Framework\DataObject $type
* @return \Magento\Customer\Block\Address\Renderer\DefaultRenderer
*/
public function setType(\Magento\Framework\DataObject $type)
{
$this->_type = $type;
return $this;
}
/**
* Get the format of the address
*
* @param AddressModelInterface|null $address
* @return string
* All new code should use renderArray based on Metadata service
*/
public function getFormat(AddressModelInterface $address = null)
{
$countryFormat = $address === null
? false : $address->getCountryModel()->getFormat(
$this->getType()->getCode()
);
$format = $countryFormat ? $countryFormat->getFormat() : $this->getType()->getDefaultFormat();
return $format;
}
/**
* Render address
*
* @param AddressModelInterface $address
* @param string|null $format
* @return mixed
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function render(AddressModelInterface $address, $format = null)
{
$address = $address->getDataModel(0, 0);
return $this->renderArray($this->addressMapper->toFlatArray($address), $format);
}
/**
* @inheritdoc
*/
public function getFormatArray($addressAttributes = null)
{
$countryFormat = false;
if ($addressAttributes && isset($addressAttributes['country_id'])) {
/** @var \Magento\Directory\Model\Country $country */
$country = $this->_countryFactory->create()->load($addressAttributes['country_id']);
$countryFormat = $country->getFormat($this->getType()->getCode());
}
$format = $countryFormat ? $countryFormat->getFormat() : $this->getType()->getDefaultFormat();
return $format;
}
/**
* Render address by attribute array
*
* @param array $addressAttributes
* @param Format|null $format
* @return string
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function renderArray($addressAttributes, $format = null)
{
switch ($this->getType()->getCode()) {
case 'html':
$dataFormat = ElementFactory::OUTPUT_FORMAT_HTML;
break;
case 'pdf':
$dataFormat = ElementFactory::OUTPUT_FORMAT_PDF;
break;
case 'oneline':
$dataFormat = ElementFactory::OUTPUT_FORMAT_ONELINE;
break;
default:
$dataFormat = ElementFactory::OUTPUT_FORMAT_TEXT;
break;
}
$attributesMetadata = $this->_addressMetadataService->getAllAttributesMetadata();
$data = [];
foreach ($attributesMetadata as $attributeMetadata) {
if (!$attributeMetadata->isVisible()) {
continue;
}
$attributeCode = $attributeMetadata->getAttributeCode();
if ($attributeCode == 'country_id' && isset($addressAttributes['country_id'])) {
$data['country'] = $this->_countryFactory->create()->loadByCode(
$addressAttributes['country_id']
)->getName();
} elseif ($attributeCode == 'region' && isset($addressAttributes['region'])) {
$data['region'] = (string)__($addressAttributes['region']);
$regionName = $addressAttributes['region'];
$regionData= $this->helper->getRegionCode($regionName);
$regionArray = $regionData;
$data['region_code'] = $regionArray['code'];
} elseif (isset($addressAttributes[$attributeCode])) {
$value = $addressAttributes[$attributeCode];
$dataModel = $this->_elementFactory->create($attributeMetadata, $value, 'customer_address');
$value = $dataModel->outputValue($dataFormat);
if ($attributeMetadata->getFrontendInput() == 'multiline') {
$values = $dataModel->outputValue(ElementFactory::OUTPUT_FORMAT_ARRAY);
// explode lines
foreach ($values as $k => $v) {
$key = sprintf('%s%d', $attributeCode, $k + 1);
$data[$key] = $v;
}
}
$data[$attributeCode] = $value;
}
}
if ($this->getType()->getEscapeHtml()) {
foreach ($data as $key => $value) {
$data[$key] = $this->escapeHtml($value);
}
}
$format = $format !== null ? $format : $this->getFormatArray($addressAttributes);
return $this->filterManager->template($format, ['variables' => $data]);
}
}