Question

I am trying to override customer model file below is the code of my di.xml

 <preference for = "Magento\Customer\Model\AccountManagement" type = "Vendor\Module\Model\Rewrite\Customer\AccountManagement" />

Below is code for my model file

 <?php
 namespace Vendor\Module\Model\Rewrite\Customer;

 use Magento\Customer\Api\Data\CustomerInterface;

class AccountManagement extends \Magento\Customer\Model\AccountManagement
{


public function createAccountWithPasswordHash(CustomerInterface $customer, $hash, $redirectUrl = '')
{
    // This logic allows an existing customer to be added to a different store.  No new account is created.
    // The plan is to move this logic into a new method called something like 'registerAccountWithStore'
    if ($customer->getId()) {
        $customer = $this->customerRepository->get($customer->getEmail());
        $websiteId = $customer->getWebsiteId();

        if ($this->isCustomerInStore($websiteId, $customer->getStoreId())) {
            throw new InputException(__('This customer already exists in this store.'));
        }
        // Existing password hash will be used from secured customer data registry when saving customer
    }

    // Make sure we have a storeId to associate this customer with.
    if (!$customer->getStoreId()) {
        if ($customer->getWebsiteId()) {
            $storeId = $this->storeManager->getWebsite($customer->getWebsiteId())->getDefaultStore()->getId();
        } else {
            $storeId = $this->storeManager->getStore()->getId();
        }
        $customer->setStoreId($storeId);
    }

    // Associate website_id with customer
    if (!$customer->getWebsiteId()) {
        $websiteId = $this->storeManager->getStore($customer->getStoreId())->getWebsiteId();
        $customer->setWebsiteId($websiteId);
    }

    // Update 'created_in' value with actual store name
    if ($customer->getId() === null) {
        $storeName = $this->storeManager->getStore($customer->getStoreId())->getName();
        $customer->setCreatedIn($storeName);
    }

    $customerAddresses = $customer->getAddresses() ?: [];
    $customer->setAddresses(null);
    try {
        // If customer exists existing hash will be used by Repository
        $customer = $this->customerRepository->save($customer, $hash);
    } catch (AlreadyExistsException $e) {
        throw new InputMismatchException(
            __('CHANGE THIS TEXT FROM DEFAULT TO CUSTOM ONE.')
        );
    } catch (LocalizedException $e) {
        throw $e;
    }
    try {
        foreach ($customerAddresses as $address) {
             if ($address->getId()) {
                $newAddress = clone $address;
                $newAddress->setId(null);
                $newAddress->setCustomerId($customer->getId());
                $this->addressRepository->save($newAddress);
             } else {
                $address->setCustomerId($customer->getId());
                $this->addressRepository->save($address);
            }
        }
    } catch (InputException $e) {
        $this->customerRepository->delete($customer);
        throw $e;
    }
    $customer = $this->customerRepository->getById($customer->getId());
    $newLinkToken = $this->mathRandom->getUniqueHash();
    $this->changeResetPasswordLinkToken($customer, $newLinkToken);
    //$this->sendEmailConfirmation($customer, $redirectUrl);

    return $customer;
    }  
 }

Above code is not working for me, thrwoing below error.

Notice: Undefined property: Vendor\Module\Model\Rewrite\Customer\AccountManagement\Interceptor::$storeManager in app/code/Vendor/Module/Model/Rewrite/Customer/AccountManagement.php on line 42

All i need to do is i should stop sending emails for new customer registrations. so i have commented out this line

  $this->sendEmailConfirmation($customer, $redirectUrl);

Please anyone suggest on this. Thanks in Advance.

Était-ce utile?

La solution

If you want to stop sending emails only, then you can simply override the sendEmailConfirmation function and return false.

use Magento\Customer\Api\Data\CustomerInterface;

...
...

protected function sendEmailConfirmation(CustomerInterface $customer, $redirectUrl)
{
    return false;
}

Autres conseils

Please run below command and check:

rm -rf generated/*

php bin/magento c:c

php bin/magento c:f

This path Vendor\Module\Model\Rewrite\Customer\AccountManagement also fine no need to change

I think you haven't injected the proper dependency in your preference:

   <?php

   use Magento\Store\Model\StoreManagerInterface;

   class AccountManagement extends \Magento\Customer\Model\AccountManagement
   {
    /**
     * @var \Magento\Store\Model\StoreManagerInterface
    */
       private $storeManager;

     public function __construct(
        StoreManagerInterface $storeManager,
     ){
        $this->storeManager = $storeManager;
     }

Inject rest dependencys also like this

clear var/*, generated

Also perform setup:upgrade.

Are you getting any error ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top