Невозможно установить группу клиентов и создать адрес для клиентов сразу после регистрации в Magento 2.3.4
Я пытаюсь обновить клиентов сразу после их регистрации на платформе, но у меня возникли некоторые трудности с сохранением данных.
Что я пытаюсь сделать, так это добавить клиентов в группы в зависимости от их страны, а также создать для них новый адрес и установить его в качестве адреса доставки и выставления счетов по умолчанию. Проблема, которую я вижу, заключается в том, что я не могу сохранить обе вещи одновременно, это одна или другая, в зависимости от того, какая из них сохранена второй.
Если я обновлю идентификатор группы и сохраню клиента, а затем создам адрес, в администраторе будет отображаться только адрес. Если я сделаю это в обратном порядке, добавлю адрес клиента, а затем сохраню идентификатор группы клиентов, я увижу только идентификатор группы в администраторе, обратите внимание, что адрес будет сохранен для клиента, только он не установлен в качестве адреса доставки и выставления счетов по умолчанию.
Я не уверен, что мне не хватает чего-либо, связанного с интерфейсами репозитория и тем, как они работают, или если есть все, что я делаю неправильно.
Итак, вы все знаете, что я также пытался использовать два разных события, customer_register_success
и customer_save_after
, но результат был таким же, как при использовании только одного события, ничего особенного.
Вот как клиенты выглядят в администраторе после их сохранения.
Это для клиента, которого я сначала сохранил адрес, а затем идентификатор группы.
Вот событие XML
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="customer_register_success">
<observer instance="DryRun\Various\Observer\Customer\RegisterSuccess" name="dryrun_various_observer_customer_registersuccess_customer_register_success"/>
</event>
</config>
Вот наблюдатель
<?php
/**
* Copyright © All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace DryRun\Various\Observer\Customer;
class RegisterSuccess implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $scopeConfig;
/**
* @var \Magento\Customer\Api\CustomerRepositoryInterface
*/
protected $customerRepository;
/**
* @var \Magento\Customer\Model\GroupFactory
*/
protected $customerGroupFactory;
/**
* @var \Magento\Customer\Api\AddressRepositoryInterface
*/
protected $addressRepository;
/**
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
*/
protected $addressDataFactory;
/**
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Customer\Model\GroupFactory $customerGroupFactory,
\Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
\Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
\Magento\Customer\Api\Data\AddressInterfaceFactory $addressDataFactory,
\Psr\Log\LoggerInterface $logger
) {
$this->scopeConfig = $scopeConfig;
$this->customerRepository = $customerRepository;
$this->customerGroupFactory = $customerGroupFactory;
$this->addressRepository = $addressRepository;
$this->addressDataFactory = $addressDataFactory;
$this->logger = $logger;
}
/**
* Execute observer
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(
\Magento\Framework\Event\Observer $observer
) {
$customer = $observer->getCustomer();
if(!$customer->getId()) {
return;
}
$accountController = $observer->getAccountController();
$countryId = $accountController->getRequest()->getParam("country_id");
$this->createCustomerAddress($customer, $countryId);
$this->assignCustomerToGroup($customer, $countryId);
}
public function assignCustomerToGroup($customer, $countryId) {
try {
$EUCountries = $this->scopeConfig->getValue('general/country/eu_countries', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
$EUCountries = explode(',', $EUCountries);
if (in_array($countryId, $EUCountries)) {
if ($countryId === 'GB') {
$targetGroup = 10; // 'Customer in -GB-';
} else {
$targetGroup = 8; // 'Consumer B2C (inside EU)';
}
} else {
$targetGroup = 9; // 'General Customer (outside EU)';
}
$customer->setGroupId($targetGroup);
$this->customerRepository->save($customer);
} catch (Exception $e) {
$this->logger->debug("ERROR adding customer to group: " . $e->getMessage());
}
}
public function createCustomerAddress($customer, $countryID){
try{
$address = $this->addressDataFactory->create();
$address->setFirstname($customer->getFirstname())
->setLastname($customer->getLastname())
->setStreet(array("0" => "-", "1" => "-"))
->setCity("-")
->setPostcode("0000 00")
->setTelephone("-")
->setCountryId($countryID)
->setCustomerId($customer->getId())
->setIsDefaultBilling("1")
->setIsDefaultShipping("1")
// ->setSaveInAddressBook("1") # Call to undefined method Magento\Customer\Model\Data\Address::setSaveInAddressBook()
;
$this->addressRepository->save($address);
}
catch(Exception $e){
$this->logger->debug("ERROR adding customer address: " . $e->getMessage());
}
}
}
Любой предложения приветствуются, спасибо!
1 answers
Хорошие новости, я смог найти решение этой проблемы. Но все же решение не дает никаких ответов на вопрос, почему оно не работало раньше. Так что, если у вас есть причина для этого, опубликуйте ее - я уверен, что мы все сможем извлечь из этого урок.
Что мне нужно было сделать, так это сохранить адрес во второй раз с помощью setIsDefaultBilling("1") и setIsDefaultShipping("1")
Итак, поток таков:
- создайте адрес и добавьте его клиенту
- обновить клиента (добавить в группу)
- сохранить повторите адрес
<?php
/**
* Copyright © All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace DryRun\Various\Observer\Customer;
class RegisterSuccess implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $scopeConfig;
/**
* @var \Magento\Customer\Api\CustomerRepositoryInterface
*/
protected $customerRepository;
/**
* @var \Magento\Customer\Model\GroupFactory
*/
protected $customerGroupFactory;
/**
* @var \Magento\Customer\Api\AddressRepositoryInterface
*/
protected $addressRepository;
/**
* @var \Magento\Customer\Api\Data\AddressInterfaceFactory
*/
protected $addressDataFactory;
/**
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Customer\Model\GroupFactory $customerGroupFactory,
\Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
\Magento\Customer\Api\AddressRepositoryInterface $addressRepository,
\Magento\Customer\Api\Data\AddressInterfaceFactory $addressDataFactory,
\Psr\Log\LoggerInterface $logger
) {
$this->scopeConfig = $scopeConfig;
$this->customerRepository = $customerRepository;
$this->customerGroupFactory = $customerGroupFactory;
$this->addressRepository = $addressRepository;
$this->addressDataFactory = $addressDataFactory;
$this->logger = $logger;
}
/**
* Execute observer
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(
\Magento\Framework\Event\Observer $observer
) {
$customer = $observer->getCustomer();
if(!$customer->getId()) {
return;
}
$accountController = $observer->getAccountController();
$countryId = $accountController->getRequest()->getParam("country_id");
$address = $this->createCustomerAddress($customer, $countryId);
$this->assignCustomerToGroup($customer, $countryId);
## NEW
$this->setDefaultAddress($address);
}
public function assignCustomerToGroup($customer, $countryId) {
try {
$EUCountries = $this->scopeConfig->getValue('general/country/eu_countries', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
$EUCountries = explode(',', $EUCountries);
if (in_array($countryId, $EUCountries)) {
if ($countryId === 'GB') {
$targetGroup = 10; // 'Customer in -GB-';
} else {
$targetGroup = 8; // 'Consumer B2C (inside EU)';
}
} else {
$targetGroup = 9; // 'General Customer (outside EU)';
}
$customer->setGroupId($targetGroup);
$this->customerRepository->save($customer);
} catch (Exception $e) {
$this->logger->debug("ERROR adding customer to group: " . $e->getMessage());
}
}
public function createCustomerAddress($customer, $countryID){
try{
$address = $this->addressDataFactory->create();
$address->setFirstname($customer->getFirstname())
->setLastname($customer->getLastname())
->setStreet(array("0" => "-", "1" => "-"))
->setCity("-")
->setPostcode("0000 00")
->setTelephone("-")
->setCountryId($countryID)
->setCustomerId($customer->getId())
->setIsDefaultBilling("1")
->setIsDefaultShipping("1")
// ->setSaveInAddressBook("1") # Call to undefined method Magento\Customer\Model\Data\Address::setSaveInAddressBook()
;
return $this->addressRepository->save($address);
}
catch(Exception $e){
$this->logger->debug("ERROR adding customer address: " . $e->getMessage());
}
}
## NEW
public function setDefaultAddress($address) {
$address->setIsDefaultBilling("1")
->setIsDefaultShipping("1");
$this->addressRepository->save($address);
}**
}