I tried a different approach overriding Address FormPost controller and it worked for me. Here is the steps that I followed:
1. app/code/Company/Module/etc/di.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
... <preference for="Company\Module\Model\Data\Address" type="Magento\Customer\Model\Data\Address" />
<preference for="Magento\Customer\Controller\Address\FormPost" type="Company\Module\Controller\Address\FormPost" />
... </config>
2. app/code/Company/Module/Model/Data/Address.php
<?php
namespace Company\Module\Model\Data;
/**
* Description of Address
*
* @author Japhet Perez
*/
class Address extends \Magento\Customer\Model\Data\Address implements \Company\Module\Api\Data\AddressInterface
{
/**
* {@inheritdoc}
*/
public function getAddressReference()
{
return $this->_get(self::ADDRESS_REFERENCE);
}
/**
* {@inheritdoc}
*/
public function setAddressReference($addressReference)
{
return $this->setData(self::ADDRESS_REFERENCE, $addressReference);
}
}3. app/code/Company/Module/Api/Data/AddressInterface.php
<?php
namespace Company\Module\Api\Data;
use Magento\Customer\Api\Data\AddressInterface as MainAddressInterface;
/**
* Description of AddressInterface
*
* @author Japhet Perez
*/
interface AddressInterface extends MainAddressInterface
{
const ADDRESS_REFERENCE = 'address_reference';
/*
* Get Address Reference
* @return string
*/
public function getAddressReference();
/*
* Set Address Reference
* @param string $addressReference
* @return $this
*/
public function setAddressReference($addressReference);
}4. app/code/Company/Module/Controller/Address/FormPost.php
<?php
namespace Company\Module\Controller\Address;
/**
* Description of FormPost
*
* @author Japhet Perez
*/
class FormPost extends \Magento\Customer\Controller\Address\FormPost
{
/**
* Process address form save
*
* @return \Magento\Framework\Controller\Result\Redirect
*/
public function execute()
{
$redirectUrl = null;
if (!$this->_formKeyValidator->validate($this->getRequest())) {
return $this->resultRedirectFactory->create()->setPath('*/*/');
}
if (!$this->getRequest()->isPost()) {
$this->_getSession()->setAddressFormData($this->getRequest()->getPostValue());
return $this->resultRedirectFactory->create()->setUrl(
$this->_redirect->error($this->_buildUrl('*/*/edit'))
);
}
try {
$address = $this->_extractAddress();
/* Override starts here */
$address->setCustomAttribute('address_reference', $this->getRequest()->getPost('address_reference'));
/* Override ends here */
$this->_addressRepository->save($address);
$this->messageManager->addSuccess(__('You saved the address.'));
$url = $this->_buildUrl('*/*/index', ['_secure' => true]);
return $this->resultRedirectFactory->create()->setUrl($this->_redirect->success($url));
} catch (InputException $e) {
$this->messageManager->addError($e->getMessage());
foreach ($e->getErrors() as $error) {
$this->messageManager->addError($error->getMessage());
}
} catch (\Exception $e) {
$redirectUrl = $this->_buildUrl('*/*/index');
$this->messageManager->addException($e, __('We can\'t save the address.'));
}
$url = $redirectUrl;
if (!$redirectUrl) {
$this->_getSession()->setAddressFormData($this->getRequest()->getPostValue());
$url = $this->_buildUrl('*/*/edit', ['id' => $this->getRequest()->getParam('id')]);
}
return $this->resultRedirectFactory->create()->setUrl($this->_redirect->error($url));
}
}This worked for me creatingand editing addresses from customer My Account. I hope this works for you too.
Regards from Mexico!
Japhet
AWESOME ![]()
But please change :
<preference for="Company\Module\Model\Data\AddressInterface" type="Magento\Customer\Model\Data\Address" />
TO
<preference for="Magento\Customer\Model\Data\Address" type="Company\Module\Model\Data\Address" />
Thanks!