Magento’s region ID’s are internal primary keys on the database that don’t mean anything to the rest of the world. two digit state codes, such as MN or AL are a universal region identifier.
I had to import customers from an external ERP into Magento 2. There might be a way to set a region on a customer using the two digit code, I just wrote a simple way to get the region ID from the state code.
Here is the helper I wrote for this. Pretty straight forward.
<?php
/**
*
* @author Kevin Miles <kevin.miles@evermore.tech>
*/
namespace Evermore\CustomerImport\Helper;
class Address extends \Magento\Framework\App\Helper\AbstractHelper
{
protected $_regionFactory;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Directory\Model\RegionFactory $regionFactory
) {
$this->_regionFactory = $regionFactory;
parent::__construct($context);
}
/**
* Gets the region ID from the two digit state code.
* @param $state - Two letter state code
*
* @return int|bool
*/
public function getRegionCode($state, $countryId = 'US') {
try {
$region = $this->_regionFactory->create();
$regionId = $region->loadByCode( $state, $countryId )->getId();
return $regionId;
}
catch(\Exception $e) {
$this->_logger->critical($e->getMessage());
return false;
}
}
}
Here is the code that creates the customer address.
<?php
/**
*
* @author Kevin Miles <kevin.miles@evermore.tech>
*/
namespace Evermore\CustomerImport\Helper;
class CustomerCreate extends \Magento\Framework\App\Helper\AbstractHelper
{
protected $_customerFactory;
protected $_addressFactory;
protected $_addressHelper;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Customer\Model\CustomerFactory $customerFactory,
\Magento\Customer\Model\AddressFactory $addressFactory,
\FEvermore\CustomerImport\Helper\Address $addressHelper
) {
$this->_customerFactory = $customerFactory;
$this->_addressFactory = $addressFactory;
$this->_addressHelper = $addressHelper;
parent::__construct($context);
}
public function createCustomer($customer = array()) {
$newCustomer = $this->_customerFactory->create();
$newCustomer->setWebsiteId(1); //Main website.
$newCustomer->setGroupId(4); //Group ID of your group
$newCustomer->setFirstname($customer['firstname']);
$newCustomer->setLastname($customer['lastname']);
$newCustomer->setEmail($customer['email']);
$newCustomer->setPassword('P@ssw0rd');
$newCustomer->save();
$address = $this->_addressFactory->create();
$address->setCustomerId($newCustomer->getId())
->setFirstname($customer['firstname'])
->setLastname($customer['lastname'])
->setCountryId($customer['country'])
->setStreet($customer['address'])
->setCity($customer['city'])
->setRegionId($this->_addressHelper->getRegionCode($customer['state'])) //This is where i get the region id.
->setPostcode($customer['zip'])
->setTelephone($customer['phone'])
->setFax($customer['fax'])
->setSaveInAddressBook(1)
->setIsDefaultBilling(1)
->setIsDefaultShipping(1);
$address->save();
}
}