Невозможно установить группу клиентов и создать адрес для клиентов сразу после регистрации в Magento 2.3.4


Я пытаюсь обновить клиентов сразу после их регистрации на платформе, но у меня возникли некоторые трудности с сохранением данных.

Что я пытаюсь сделать, так это добавить клиентов в группы в зависимости от их страны, а также создать для них новый адрес и установить его в качестве адреса доставки и выставления счетов по умолчанию. Проблема, которую я вижу, заключается в том, что я не могу сохранить обе вещи одновременно, это одна или другая, в зависимости от того, какая из них сохранена второй.

Если я обновлю идентификатор группы и сохраню клиента, а затем создам адрес, в администраторе будет отображаться только адрес. Если я сделаю это в обратном порядке, добавлю адрес клиента, а затем сохраню идентификатор группы клиентов, я увижу только идентификатор группы в администраторе, обратите внимание, что адрес будет сохранен для клиента, только он не установлен в качестве адреса доставки и выставления счетов по умолчанию.

Я не уверен, что мне не хватает чего-либо, связанного с интерфейсами репозитория и тем, как они работают, или если есть все, что я делаю неправильно.

Итак, вы все знаете, что я также пытался использовать два разных события, customer_register_success и customer_save_after, но результат был таким же, как при использовании только одного события, ничего особенного.

Вот как клиенты выглядят в администраторе после их сохранения.

enter image description here

Это для клиента, которого я сначала сохранил адрес, а затем идентификатор группы.

enter image description here

Вот событие 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());
        }
    }
}

Любой предложения приветствуются, спасибо!

Author: Cristian, 2020-06-27

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);
    }**
}
 1
Author: Cristian, 2020-07-03 14:03:27