I am working on a module that adds an account in the checkout in Magento 2.3
I am able to create an account now but i'm struggling with adding an address to that account. I already tried multiple different ways by using the customer address factory.
/Model/Checkout/ShippingInformationManagementPlugin.php
<?php
namespace BB\Checkout\Model\Checkout;
class ShippingInformationManagementPlugin
{
protected $quoteRepository;
/**
* @var \Magento\Newsletter\Model\SubscriberFactory
*/
protected $subscriberFactory;
/**
* @var \Magento\Customer\Api\AccountManagementInterface
*/
protected $accountManagement;
/**
* @var \Magento\Customer\Helper\Address
*/
protected $addressHelper;
/**
* @var \Magento\Customer\Model\Metadata\FormFactory
*/
protected $formFactory;
/**
* @var \Magento\Customer\Api\Data\RegionInterfaceFactory
*/
protected $regionDataFactory;
/**
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
*/
protected $addressDataFactory;
/**
* @var \Magento\Customer\Model\Registration
*/
protected $registration;
/**
* @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
*/
protected $customerDataFactory;
/**
* @var \Magento\Customer\Model\Url
*/
protected $customerUrl;
/**
* @var \Magento\Framework\Escaper
*/
protected $escaper;
/**
* @var \Magento\Customer\Model\CustomerExtractor
*/
protected $customerExtractor;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $urlModel;
/**
* @var \Magento\Framework\Api\DataObjectHelper
*/
protected $dataObjectHelper;
/**
* @var Session
*/
protected $session;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Customer\Model\CustomerFactory
*/
protected $customerFactory;
/**
* @var \Magento\Customer\Model\AddressFactory
*/
protected $addressFactory;
public function __construct(
\Magento\Quote\Model\QuoteRepository $quoteRepository,
\Magento\Newsletter\Model\SubscriberFactory $subscriberFactory,
\Magento\Framework\Api\ExtensionAttributesFactory $extensionAttributesFactory,
\Magento\Framework\Event\Observer $observer,
\Magento\Customer\Model\Session $customerSession,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Customer\Model\CustomerFactory $customerFactory,
\Magento\Customer\Model\AddressFactory $addressFactory
)
{
$this->quoteRepository = $quoteRepository;
$this->subscriberFactory = $subscriberFactory;
$this->extensionAttributesFactory = $extensionAttributesFactory;
$this->observer = $observer;
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->addressFactory = $addressFactory;
}
/**
* @param \Magento\Checkout\Model\ShippingInformationManagement $subject
* @param $cartId
* @param \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
*/
public function beforeSaveAddressInformation(
\Magento\Checkout\Model\ShippingInformationManagement $subject,
$cartId,
\Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
)
{
$extAttributes = $addressInformation->getExtensionAttributes();
$email = $extAttributes->getEmail();
// Create account for user
if ($extAttributes->getPassword() !== '') {
// Get Website ID
$websiteId = $this->storeManager->getWebsite()->getWebsiteId();
// Instantiate object (this is the most important part)
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$address = $addressInformation->getShippingAddress();
// Preparing data for new customer
$customer->setEmail($extAttributes->getEmail());
$customer->setPassword($extAttributes->getPassword());
$customer->setFirstname($address->getFirstname());
$customer->setLastname($address->getLastname());
// //Address data (not working)
// $customer->setStreet($address->getStreet());
// $customer->setPostcode($address->getPostcode());
// $customer->setCity($address->getCity());
// $customer->setCountry($address->getCountry());
// $customer->setTelephone($address->getTelephone());
// Save data
try {
$customer->save();
echo 'Create customer successfully, customer ID: ' . $customer->getId();
$addAddress = $this->addressFactory->create();
$addAddress->setCustomerId($customer->getId());
$addAddress->setCountryId('NL');
$addAddress->setPostcode('6942AE');
$addAddress->setCity('Arnhem');
$addAddress->setTelephone('0123456789');
$addAddress->setStreet('Street 1');
$addAddress->setIsDefaultBilling('1');
$addAddress->setIsDefaultShipping('1');
$addAddress->setSaveInAddressBook('1');
$addAddress->save();
} catch (\Exception $e) {
// E-mail address is already added, this will occur if the customer goes back and forward in steps, the account is already created by then.
}
}
}
}Any idea? It saves the account but doesn't add the address.
Solved! Go to Solution.
I'm not exactly sure what I was missing but I changed around some variable names and somehow it works now.
ShippingInformationManagementPlugin.php
<?php
namespace BB\Checkout\Model\Checkout;
class ShippingInformationManagementPlugin
{
protected $quoteRepository;
/**
* @var \Magento\Newsletter\Model\SubscriberFactory
*/
protected $subscriberFactory;
/**
* @var \Magento\Customer\Api\AccountManagementInterface
*/
protected $accountManagement;
/**
* @var \Magento\Customer\Helper\Address
*/
protected $addressHelper;
/**
* @var \Magento\Customer\Model\Metadata\FormFactory
*/
protected $formFactory;
/**
* @var \Magento\Customer\Api\Data\RegionInterfaceFactory
*/
protected $regionDataFactory;
/**
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
*/
protected $addressDataFactory;
/**
* @var \Magento\Customer\Model\Registration
*/
protected $registration;
/**
* @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
*/
protected $customerDataFactory;
/**
* @var \Magento\Customer\Model\Url
*/
protected $customerUrl;
/**
* @var \Magento\Framework\Escaper
*/
protected $escaper;
/**
* @var \Magento\Customer\Model\CustomerExtractor
*/
protected $customerExtractor;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $urlModel;
/**
* @var \Magento\Framework\Api\DataObjectHelper
*/
protected $dataObjectHelper;
/**
* @var Session
*/
protected $session;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Customer\Model\CustomerFactory
*/
protected $customerFactory;
/**
* @var \Magento\Customer\Model\AddressFactory
*/
protected $addressFactory;
public function __construct(
\Magento\Quote\Model\QuoteRepository $quoteRepository,
\Magento\Newsletter\Model\SubscriberFactory $subscriberFactory,
\Magento\Framework\Api\ExtensionAttributesFactory $extensionAttributesFactory,
\Magento\Framework\Event\Observer $observer,
\Magento\Customer\Model\Session $customerSession,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Customer\Model\CustomerFactory $customerFactory,
\Magento\Customer\Model\AddressFactory $addressFactory
)
{
$this->quoteRepository = $quoteRepository;
$this->subscriberFactory = $subscriberFactory;
$this->extensionAttributesFactory = $extensionAttributesFactory;
$this->observer = $observer;
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->addressFactory = $addressFactory;
}
/**
* @param \Magento\Checkout\Model\ShippingInformationManagement $subject
* @param $cartId
* @param \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
*/
public function beforeSaveAddressInformation(
\Magento\Checkout\Model\ShippingInformationManagement $subject,
$cartId,
\Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
)
{
$extAttributes = $addressInformation->getExtensionAttributes();
$email = $extAttributes->getEmail();
$subscribe = $extAttributes->getSubscribe();
// Subscribe user to newsletter
if ($subscribe === true) {
$subscriber = $this->subscriberFactory->create()->loadByEmail($email);
if ($subscriber->getId() && $subscriber->getSubscriberStatus() == \Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED) {
} else {
$status = $this->subscriberFactory->create()->subscribe($email);
}
}
// Create account for user
if ($extAttributes->getPassword() !== '') {
// Create account
$websiteId = $this->storeManager->getWebsite()->getWebsiteId();
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$address = $addressInformation->getShippingAddress();
// Preparing data for new customer
$customer->setEmail($extAttributes->getEmail());
$customer->setPassword($extAttributes->getPassword());
$customer->setFirstname($address->getFirstname());
$customer->setLastname($address->getLastname());
try {
$customer->save();
// Create address
$customerAddress = $this->addressFactory->create();
$customerAddress->setCustomerId($customer->getId());
$customerAddress->setFirstname($address->getFirstname());
$customerAddress->setLastname($address->getFirstname());
$customerAddress->setCountryId($address->getCountryId());
$customerAddress->setPostcode($address->getPostcode());
$customerAddress->setCity($address->getCity());
$customerAddress->setTelephone($address->getTelephone());
$customerAddress->setStreet($address->getStreet());
$customerAddress->setCompany($address->getCompany());
$customerAddress->setVatId($address->getVatId());
$customerAddress->setIsDefaultBilling('1');
$customerAddress->setIsDefaultShipping('1');
$customerAddress->setSaveInAddressBook('1');
$customerAddress->save();
} catch (\Exception $e) {
// E-mail address is already added, this will occur if the customer goes back and forward in steps, the account is already created by then.
}
}
}
}
Might be you missing the firstname and lastname of customer address,
$address->setCustomerId($customerId)
->setFirstname($firstname)
->setLastname($lastname)
Add above field and check.
That sadly doesn't fix it.
I'm not exactly sure what I was missing but I changed around some variable names and somehow it works now.
ShippingInformationManagementPlugin.php
<?php
namespace BB\Checkout\Model\Checkout;
class ShippingInformationManagementPlugin
{
protected $quoteRepository;
/**
* @var \Magento\Newsletter\Model\SubscriberFactory
*/
protected $subscriberFactory;
/**
* @var \Magento\Customer\Api\AccountManagementInterface
*/
protected $accountManagement;
/**
* @var \Magento\Customer\Helper\Address
*/
protected $addressHelper;
/**
* @var \Magento\Customer\Model\Metadata\FormFactory
*/
protected $formFactory;
/**
* @var \Magento\Customer\Api\Data\RegionInterfaceFactory
*/
protected $regionDataFactory;
/**
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
*/
protected $addressDataFactory;
/**
* @var \Magento\Customer\Model\Registration
*/
protected $registration;
/**
* @var \Magento\Customer\Api\Data\CustomerInterfaceFactory
*/
protected $customerDataFactory;
/**
* @var \Magento\Customer\Model\Url
*/
protected $customerUrl;
/**
* @var \Magento\Framework\Escaper
*/
protected $escaper;
/**
* @var \Magento\Customer\Model\CustomerExtractor
*/
protected $customerExtractor;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $urlModel;
/**
* @var \Magento\Framework\Api\DataObjectHelper
*/
protected $dataObjectHelper;
/**
* @var Session
*/
protected $session;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Customer\Model\CustomerFactory
*/
protected $customerFactory;
/**
* @var \Magento\Customer\Model\AddressFactory
*/
protected $addressFactory;
public function __construct(
\Magento\Quote\Model\QuoteRepository $quoteRepository,
\Magento\Newsletter\Model\SubscriberFactory $subscriberFactory,
\Magento\Framework\Api\ExtensionAttributesFactory $extensionAttributesFactory,
\Magento\Framework\Event\Observer $observer,
\Magento\Customer\Model\Session $customerSession,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Customer\Model\CustomerFactory $customerFactory,
\Magento\Customer\Model\AddressFactory $addressFactory
)
{
$this->quoteRepository = $quoteRepository;
$this->subscriberFactory = $subscriberFactory;
$this->extensionAttributesFactory = $extensionAttributesFactory;
$this->observer = $observer;
$this->storeManager = $storeManager;
$this->customerFactory = $customerFactory;
$this->addressFactory = $addressFactory;
}
/**
* @param \Magento\Checkout\Model\ShippingInformationManagement $subject
* @param $cartId
* @param \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
*/
public function beforeSaveAddressInformation(
\Magento\Checkout\Model\ShippingInformationManagement $subject,
$cartId,
\Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
)
{
$extAttributes = $addressInformation->getExtensionAttributes();
$email = $extAttributes->getEmail();
$subscribe = $extAttributes->getSubscribe();
// Subscribe user to newsletter
if ($subscribe === true) {
$subscriber = $this->subscriberFactory->create()->loadByEmail($email);
if ($subscriber->getId() && $subscriber->getSubscriberStatus() == \Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED) {
} else {
$status = $this->subscriberFactory->create()->subscribe($email);
}
}
// Create account for user
if ($extAttributes->getPassword() !== '') {
// Create account
$websiteId = $this->storeManager->getWebsite()->getWebsiteId();
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$address = $addressInformation->getShippingAddress();
// Preparing data for new customer
$customer->setEmail($extAttributes->getEmail());
$customer->setPassword($extAttributes->getPassword());
$customer->setFirstname($address->getFirstname());
$customer->setLastname($address->getLastname());
try {
$customer->save();
// Create address
$customerAddress = $this->addressFactory->create();
$customerAddress->setCustomerId($customer->getId());
$customerAddress->setFirstname($address->getFirstname());
$customerAddress->setLastname($address->getFirstname());
$customerAddress->setCountryId($address->getCountryId());
$customerAddress->setPostcode($address->getPostcode());
$customerAddress->setCity($address->getCity());
$customerAddress->setTelephone($address->getTelephone());
$customerAddress->setStreet($address->getStreet());
$customerAddress->setCompany($address->getCompany());
$customerAddress->setVatId($address->getVatId());
$customerAddress->setIsDefaultBilling('1');
$customerAddress->setIsDefaultShipping('1');
$customerAddress->setSaveInAddressBook('1');
$customerAddress->save();
} catch (\Exception $e) {
// E-mail address is already added, this will occur if the customer goes back and forward in steps, the account is already created by then.
}
}
}
}