123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Model;
- use Magento\Customer\Api\CustomerMetadataInterface;
- use Magento\Customer\Api\Data\CustomerInterfaceFactory;
- use Magento\Customer\Api\GroupRepositoryInterface;
- use Magento\Customer\Model\Config\Share;
- use Magento\Customer\Model\ResourceModel\Address\CollectionFactory;
- use Magento\Customer\Model\ResourceModel\Customer as ResourceCustomer;
- use Magento\Framework\App\Config\ScopeConfigInterface;
- use Magento\Framework\Exception\AuthenticationException;
- use Magento\Framework\Exception\EmailNotConfirmedException;
- use Magento\Framework\Exception\InvalidEmailOrPasswordException;
- use Magento\Framework\Indexer\StateInterface;
- use Magento\Framework\Reflection\DataObjectProcessor;
- use Magento\Store\Model\ScopeInterface;
- use Magento\Framework\App\ObjectManager;
- /**
- * Customer model
- *
- * @api
- * @method int getWebsiteId() getWebsiteId()
- * @method Customer setWebsiteId($value)
- * @method int getStoreId() getStoreId()
- * @method string getEmail() getEmail()
- * @method mixed getDisableAutoGroupChange()
- * @method Customer setDisableAutoGroupChange($value)
- * @method Customer setGroupId($value)
- * @method Customer setDefaultBilling($value)
- * @method Customer setDefaultShipping($value)
- * @method Customer setPasswordHash($string)
- * @method string getPasswordHash()
- * @method string getConfirmation()
- * @SuppressWarnings(PHPMD.ExcessivePublicCount)
- * @SuppressWarnings(PHPMD.TooManyFields)
- * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- * @since 100.0.2
- */
- class Customer extends \Magento\Framework\Model\AbstractModel
- {
- /**
- * Configuration paths for email templates and identities
- */
- const XML_PATH_REGISTER_EMAIL_TEMPLATE = 'customer/create_account/email_template';
- const XML_PATH_REGISTER_EMAIL_IDENTITY = 'customer/create_account/email_identity';
- const XML_PATH_REMIND_EMAIL_TEMPLATE = 'customer/password/remind_email_template';
- const XML_PATH_FORGOT_EMAIL_TEMPLATE = 'customer/password/forgot_email_template';
- const XML_PATH_FORGOT_EMAIL_IDENTITY = 'customer/password/forgot_email_identity';
- const XML_PATH_RESET_PASSWORD_TEMPLATE = 'customer/password/reset_password_template';
- /**
- * @deprecated
- * @see AccountConfirmation::XML_PATH_IS_CONFIRM
- */
- const XML_PATH_IS_CONFIRM = 'customer/create_account/confirm';
- const XML_PATH_CONFIRM_EMAIL_TEMPLATE = 'customer/create_account/email_confirmation_template';
- const XML_PATH_CONFIRMED_EMAIL_TEMPLATE = 'customer/create_account/email_confirmed_template';
- const XML_PATH_GENERATE_HUMAN_FRIENDLY_ID = 'customer/create_account/generate_human_friendly_id';
- const SUBSCRIBED_YES = 'yes';
- const SUBSCRIBED_NO = 'no';
- const ENTITY = 'customer';
- const CUSTOMER_GRID_INDEXER_ID = 'customer_grid';
- /**
- * Configuration path to expiration period of reset password link
- */
- const XML_PATH_CUSTOMER_RESET_PASSWORD_LINK_EXPIRATION_PERIOD = 'customer/password/reset_link_expiration_period';
- /**
- * Model event prefix
- *
- * @var string
- */
- protected $_eventPrefix = 'customer';
- /**
- * Name of the event object
- *
- * @var string
- */
- protected $_eventObject = 'customer';
- /**
- * List of errors
- *
- * @var array
- */
- protected $_errors = [];
- /**
- * Assoc array of customer attributes
- *
- * @var array
- */
- protected $_attributes;
- /**
- * Customer addresses collection
- *
- * @var \Magento\Customer\Model\ResourceModel\Address\Collection
- */
- protected $_addressesCollection;
- /**
- * Is model deletable
- *
- * @var boolean
- */
- protected $_isDeleteable = true;
- /**
- * Is model readonly
- *
- * @var boolean
- */
- protected $_isReadonly = false;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- */
- protected $_storeManager;
- /**
- * @var \Magento\Eav\Model\Config
- */
- protected $_config;
- /**
- * @var \Magento\Framework\App\Config\ScopeConfigInterface
- */
- protected $_scopeConfig;
- /**
- * @var Share
- */
- protected $_configShare;
- /**
- * @var AddressFactory
- */
- protected $_addressFactory;
- /**
- * @var CollectionFactory
- */
- protected $_addressesFactory;
- /**
- * @var \Magento\Framework\Mail\Template\TransportBuilder
- */
- protected $_transportBuilder;
- /**
- * @var GroupRepositoryInterface
- */
- protected $_groupRepository;
- /**
- * @var \Magento\Framework\Encryption\EncryptorInterface
- */
- protected $_encryptor;
- /**
- * @var \Magento\Framework\Math\Random
- */
- protected $mathRandom;
- /**
- * @var \Magento\Framework\Stdlib\DateTime
- */
- protected $dateTime;
- /**
- * @var CustomerInterfaceFactory
- */
- protected $customerDataFactory;
- /**
- * @var DataObjectProcessor
- */
- protected $dataObjectProcessor;
- /**
- * @var \Magento\Framework\Api\DataObjectHelper
- */
- protected $dataObjectHelper;
- /**
- * @var \Magento\Customer\Api\CustomerMetadataInterface
- */
- protected $metadataService;
- /**
- * @var \Magento\Framework\Indexer\IndexerRegistry
- */
- protected $indexerRegistry;
- /**
- * @var AccountConfirmation
- */
- private $accountConfirmation;
- /**
- * Caching property to store customer address data models by the address ID.
- *
- * @var array
- */
- private $storedAddress;
- /**
- * @param \Magento\Framework\Model\Context $context
- * @param \Magento\Framework\Registry $registry
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Eav\Model\Config $config
- * @param ScopeConfigInterface $scopeConfig
- * @param ResourceCustomer $resource
- * @param Share $configShare
- * @param AddressFactory $addressFactory
- * @param CollectionFactory $addressesFactory
- * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
- * @param GroupRepositoryInterface $groupRepository
- * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
- * @param \Magento\Framework\Stdlib\DateTime $dateTime
- * @param CustomerInterfaceFactory $customerDataFactory
- * @param DataObjectProcessor $dataObjectProcessor
- * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
- * @param CustomerMetadataInterface $metadataService
- * @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry
- * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
- * @param array $data
- * @param AccountConfirmation|null $accountConfirmation
- *
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- \Magento\Framework\Model\Context $context,
- \Magento\Framework\Registry $registry,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Eav\Model\Config $config,
- \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
- \Magento\Customer\Model\ResourceModel\Customer $resource,
- \Magento\Customer\Model\Config\Share $configShare,
- \Magento\Customer\Model\AddressFactory $addressFactory,
- \Magento\Customer\Model\ResourceModel\Address\CollectionFactory $addressesFactory,
- \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
- GroupRepositoryInterface $groupRepository,
- \Magento\Framework\Encryption\EncryptorInterface $encryptor,
- \Magento\Framework\Stdlib\DateTime $dateTime,
- CustomerInterfaceFactory $customerDataFactory,
- DataObjectProcessor $dataObjectProcessor,
- \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
- \Magento\Customer\Api\CustomerMetadataInterface $metadataService,
- \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry,
- \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
- array $data = [],
- AccountConfirmation $accountConfirmation = null
- ) {
- $this->metadataService = $metadataService;
- $this->_scopeConfig = $scopeConfig;
- $this->_storeManager = $storeManager;
- $this->_config = $config;
- $this->_configShare = $configShare;
- $this->_addressFactory = $addressFactory;
- $this->_addressesFactory = $addressesFactory;
- $this->_transportBuilder = $transportBuilder;
- $this->_groupRepository = $groupRepository;
- $this->_encryptor = $encryptor;
- $this->dateTime = $dateTime;
- $this->customerDataFactory = $customerDataFactory;
- $this->dataObjectProcessor = $dataObjectProcessor;
- $this->dataObjectHelper = $dataObjectHelper;
- $this->indexerRegistry = $indexerRegistry;
- $this->accountConfirmation = $accountConfirmation ?: ObjectManager::getInstance()
- ->get(AccountConfirmation::class);
- parent::__construct(
- $context,
- $registry,
- $resource,
- $resourceCollection,
- $data
- );
- }
- /**
- * Initialize customer model
- *
- * @return void
- */
- public function _construct()
- {
- $this->_init(\Magento\Customer\Model\ResourceModel\Customer::class);
- }
- /**
- * Retrieve customer model with customer data
- *
- * @return \Magento\Customer\Api\Data\CustomerInterface
- */
- public function getDataModel()
- {
- $customerData = $this->getData();
- $addressesData = [];
- /** @var \Magento\Customer\Model\Address $address */
- foreach ($this->getAddresses() as $address) {
- if (!isset($this->storedAddress[$address->getId()])) {
- $this->storedAddress[$address->getId()] = $address->getDataModel();
- }
- $addressesData[] = $this->storedAddress[$address->getId()];
- }
- $customerDataObject = $this->customerDataFactory->create();
- $this->dataObjectHelper->populateWithArray(
- $customerDataObject,
- $customerData,
- \Magento\Customer\Api\Data\CustomerInterface::class
- );
- $customerDataObject->setAddresses($addressesData)
- ->setId($this->getId());
- return $customerDataObject;
- }
- /**
- * Update customer data
- *
- * @param \Magento\Customer\Api\Data\CustomerInterface $customer
- * @return $this
- */
- public function updateData($customer)
- {
- $customerDataAttributes = $this->dataObjectProcessor->buildOutputDataArray(
- $customer,
- \Magento\Customer\Api\Data\CustomerInterface::class
- );
- foreach ($customerDataAttributes as $attributeCode => $attributeData) {
- if ($attributeCode == 'password') {
- continue;
- }
- $this->setDataUsingMethod($attributeCode, $attributeData);
- }
- $customAttributes = $customer->getCustomAttributes();
- if ($customAttributes !== null) {
- foreach ($customAttributes as $attribute) {
- $this->setData($attribute->getAttributeCode(), $attribute->getValue());
- }
- }
- $customerId = $customer->getId();
- if ($customerId) {
- $this->setId($customerId);
- }
- return $this;
- }
- /**
- * Retrieve customer sharing configuration model
- *
- * @return Share
- */
- public function getSharingConfig()
- {
- return $this->_configShare;
- }
- /**
- * Authenticate customer
- *
- * @param string $login
- * @param string $password
- * @return bool
- * @throws \Magento\Framework\Exception\LocalizedException
- * Use \Magento\Customer\Api\AccountManagementInterface::authenticate
- */
- public function authenticate($login, $password)
- {
- $this->loadByEmail($login);
- if ($this->getConfirmation() && $this->isConfirmationRequired()) {
- throw new EmailNotConfirmedException(
- __("This account isn't confirmed. Verify and try again.")
- );
- }
- if (!$this->validatePassword($password)) {
- throw new InvalidEmailOrPasswordException(
- __('Invalid login or password.')
- );
- }
- $this->_eventManager->dispatch(
- 'customer_customer_authenticated',
- ['model' => $this, 'password' => $password]
- );
- return true;
- }
- /**
- * Load customer by email
- *
- * @param string $customerEmail
- * @return $this
- */
- public function loadByEmail($customerEmail)
- {
- $this->_getResource()->loadByEmail($this, $customerEmail);
- return $this;
- }
- /**
- * Change customer password
- *
- * @param string $newPassword
- * @return $this
- */
- public function changePassword($newPassword)
- {
- $this->_getResource()->changePassword($this, $newPassword);
- return $this;
- }
- /**
- * Get full customer name
- *
- * @return string
- */
- public function getName()
- {
- $name = '';
- if ($this->_config->getAttribute('customer', 'prefix')->getIsVisible() && $this->getPrefix()) {
- $name .= $this->getPrefix() . ' ';
- }
- $name .= $this->getFirstname();
- if ($this->_config->getAttribute('customer', 'middlename')->getIsVisible() && $this->getMiddlename()) {
- $name .= ' ' . $this->getMiddlename();
- }
- $name .= ' ' . $this->getLastname();
- if ($this->_config->getAttribute('customer', 'suffix')->getIsVisible() && $this->getSuffix()) {
- $name .= ' ' . $this->getSuffix();
- }
- return $name;
- }
- /**
- * Add address to address collection
- *
- * @param Address $address
- * @return $this
- */
- public function addAddress(Address $address)
- {
- $this->getAddressesCollection()->addItem($address);
- return $this;
- }
- /**
- * Retrieve customer address by address id
- *
- * @param int $addressId
- * @return Address
- */
- public function getAddressById($addressId)
- {
- return $this->_createAddressInstance()->load($addressId);
- }
- /**
- * Getting customer address object from collection by identifier
- *
- * @param int $addressId
- * @return Address
- */
- public function getAddressItemById($addressId)
- {
- return $this->getAddressesCollection()->getItemById($addressId);
- }
- /**
- * Retrieve not loaded address collection
- *
- * @return \Magento\Customer\Model\ResourceModel\Address\Collection
- */
- public function getAddressCollection()
- {
- return $this->_createAddressCollection();
- }
- /**
- * Customer addresses collection
- *
- * @return \Magento\Customer\Model\ResourceModel\Address\Collection
- */
- public function getAddressesCollection()
- {
- if ($this->_addressesCollection === null) {
- $this->_addressesCollection = $this->getAddressCollection()->setCustomerFilter(
- $this
- )->addAttributeToSelect(
- '*'
- );
- foreach ($this->_addressesCollection as $address) {
- $address->setCustomer($this);
- }
- }
- return $this->_addressesCollection;
- }
- /**
- * Retrieve customer address array
- *
- * @return \Magento\Framework\DataObject[]
- */
- public function getAddresses()
- {
- return $this->getAddressesCollection()->getItems();
- }
- /**
- * Retrieve all customer attributes
- *
- * @return Attribute[]
- */
- public function getAttributes()
- {
- if ($this->_attributes === null) {
- $this->_attributes = $this->_getResource()->loadAllAttributes($this)->getSortedAttributes();
- }
- return $this->_attributes;
- }
- /**
- * Get customer attribute model object
- *
- * @param string $attributeCode
- * @return \Magento\Customer\Model\ResourceModel\Attribute | null
- */
- public function getAttribute($attributeCode)
- {
- $this->getAttributes();
- if (isset($this->_attributes[$attributeCode])) {
- return $this->_attributes[$attributeCode];
- }
- return null;
- }
- /**
- * Set plain and hashed password
- *
- * @param string $password
- * @return $this
- */
- public function setPassword($password)
- {
- $this->setData('password', $password);
- $this->setPasswordHash($this->hashPassword($password));
- return $this;
- }
- /**
- * Hash customer password
- *
- * @param string $password
- * @param bool|int|string $salt
- * @return string
- */
- public function hashPassword($password, $salt = true)
- {
- return $this->_encryptor->getHash($password, $salt);
- }
- /**
- * Validate password with salted hash
- *
- * @param string $password
- * @return boolean
- */
- public function validatePassword($password)
- {
- $hash = $this->getPasswordHash();
- if (!$hash) {
- return false;
- }
- return $this->_encryptor->validateHash($password, $hash);
- }
- /**
- * Encrypt password
- *
- * @param string $password
- * @return string
- */
- public function encryptPassword($password)
- {
- return $this->_encryptor->encrypt($password);
- }
- /**
- * Decrypt password
- *
- * @param string $password
- * @return string
- */
- public function decryptPassword($password)
- {
- return $this->_encryptor->decrypt($password);
- }
- /**
- * Retrieve default address by type(attribute)
- *
- * @param string $attributeCode address type attribute code
- * @return Address|false
- */
- public function getPrimaryAddress($attributeCode)
- {
- $primaryAddress = $this->getAddressesCollection()->getItemById($this->getData($attributeCode));
- return $primaryAddress ? $primaryAddress : false;
- }
- /**
- * Get customer default billing address
- *
- * @return Address
- */
- public function getPrimaryBillingAddress()
- {
- return $this->getPrimaryAddress('default_billing');
- }
- /**
- * Get customer default billing address
- *
- * @return Address
- */
- public function getDefaultBillingAddress()
- {
- return $this->getPrimaryBillingAddress();
- }
- /**
- * Get default customer shipping address
- *
- * @return Address
- */
- public function getPrimaryShippingAddress()
- {
- return $this->getPrimaryAddress('default_shipping');
- }
- /**
- * Get default customer shipping address
- *
- * @return Address
- */
- public function getDefaultShippingAddress()
- {
- return $this->getPrimaryShippingAddress();
- }
- /**
- * Retrieve ids of default addresses
- *
- * @return array
- */
- public function getPrimaryAddressIds()
- {
- $ids = [];
- if ($this->getDefaultBilling()) {
- $ids[] = $this->getDefaultBilling();
- }
- if ($this->getDefaultShipping()) {
- $ids[] = $this->getDefaultShipping();
- }
- return $ids;
- }
- /**
- * Retrieve all customer default addresses
- *
- * @return Address[]
- */
- public function getPrimaryAddresses()
- {
- $addresses = [];
- $primaryBilling = $this->getPrimaryBillingAddress();
- if ($primaryBilling) {
- $addresses[] = $primaryBilling;
- $primaryBilling->setIsPrimaryBilling(true);
- }
- $primaryShipping = $this->getPrimaryShippingAddress();
- if ($primaryShipping) {
- if ($primaryBilling && $primaryBilling->getId() == $primaryShipping->getId()) {
- $primaryBilling->setIsPrimaryShipping(true);
- } else {
- $primaryShipping->setIsPrimaryShipping(true);
- $addresses[] = $primaryShipping;
- }
- }
- return $addresses;
- }
- /**
- * Retrieve not default addresses
- *
- * @return Address[]
- */
- public function getAdditionalAddresses()
- {
- $addresses = [];
- $primatyIds = $this->getPrimaryAddressIds();
- foreach ($this->getAddressesCollection() as $address) {
- if (!in_array($address->getId(), $primatyIds)) {
- $addresses[] = $address;
- }
- }
- return $addresses;
- }
- /**
- * Check if address is primary
- *
- * @param Address $address
- * @return boolean
- */
- public function isAddressPrimary(Address $address)
- {
- if (!$address->getId()) {
- return false;
- }
- return $address->getId() == $this->getDefaultBilling() || $address->getId() == $this->getDefaultShipping();
- }
- /**
- * Send email with new account related information
- *
- * @param string $type
- * @param string $backUrl
- * @param string $storeId
- * @return $this
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function sendNewAccountEmail($type = 'registered', $backUrl = '', $storeId = '0')
- {
- $types = $this->getTemplateTypes();
- if (!isset($types[$type])) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The transactional account email type is incorrect. Verify and try again.')
- );
- }
- if (!$storeId) {
- $storeId = $this->_getWebsiteStoreId($this->getSendemailStoreId());
- }
- $this->_sendEmailTemplate(
- $types[$type],
- self::XML_PATH_REGISTER_EMAIL_IDENTITY,
- ['customer' => $this, 'back_url' => $backUrl, 'store' => $this->getStore()],
- $storeId
- );
- return $this;
- }
- /**
- * Check if accounts confirmation is required in config
- *
- * @return bool
- * @deprecated 101.0.4
- * @see AccountConfirmation::isConfirmationRequired
- */
- public function isConfirmationRequired()
- {
- $websiteId = $this->getWebsiteId() ? $this->getWebsiteId() : null;
- return $this->accountConfirmation->isConfirmationRequired($websiteId, $this->getId(), $this->getEmail());
- }
- /**
- * Generate random confirmation key
- *
- * @return string
- */
- public function getRandomConfirmationKey()
- {
- return md5(uniqid());
- }
- /**
- * Send email with new customer password
- *
- * @return $this
- */
- public function sendPasswordReminderEmail()
- {
- $this->_sendEmailTemplate(
- self::XML_PATH_REMIND_EMAIL_TEMPLATE,
- self::XML_PATH_FORGOT_EMAIL_IDENTITY,
- ['customer' => $this, 'store' => $this->getStore()],
- $this->getStoreId()
- );
- return $this;
- }
- /**
- * Send corresponding email template
- *
- * @param string $template configuration path of email template
- * @param string $sender configuration path of email identity
- * @param array $templateParams
- * @param int|null $storeId
- * @return $this
- */
- protected function _sendEmailTemplate($template, $sender, $templateParams = [], $storeId = null)
- {
- /** @var \Magento\Framework\Mail\TransportInterface $transport */
- $transport = $this->_transportBuilder->setTemplateIdentifier(
- $this->_scopeConfig->getValue($template, ScopeInterface::SCOPE_STORE, $storeId)
- )->setTemplateOptions(
- ['area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId]
- )->setTemplateVars(
- $templateParams
- )->setFrom(
- $this->_scopeConfig->getValue($sender, ScopeInterface::SCOPE_STORE, $storeId)
- )->addTo(
- $this->getEmail(),
- $this->getName()
- )->getTransport();
- $transport->sendMessage();
- return $this;
- }
- /**
- * Send email with reset password confirmation link
- *
- * @return $this
- */
- public function sendPasswordResetConfirmationEmail()
- {
- $storeId = $this->getStoreId();
- if (!$storeId) {
- $storeId = $this->_getWebsiteStoreId();
- }
- $this->_sendEmailTemplate(
- self::XML_PATH_FORGOT_EMAIL_TEMPLATE,
- self::XML_PATH_FORGOT_EMAIL_IDENTITY,
- ['customer' => $this, 'store' => $this->getStore()],
- $storeId
- );
- return $this;
- }
- /**
- * Retrieve customer group identifier
- *
- * @return int
- */
- public function getGroupId()
- {
- if (!$this->hasData('group_id')) {
- $storeId = $this->getStoreId() ? $this->getStoreId() : $this->_storeManager->getStore()->getId();
- $groupId = $this->_scopeConfig->getValue(
- GroupManagement::XML_PATH_DEFAULT_ID,
- ScopeInterface::SCOPE_STORE,
- $storeId
- );
- $this->setData('group_id', $groupId);
- }
- return $this->getData('group_id');
- }
- /**
- * Retrieve customer tax class identifier
- *
- * @return int
- */
- public function getTaxClassId()
- {
- if (!$this->getData('tax_class_id')) {
- $groupTaxClassId = $this->_groupRepository->getById($this->getGroupId())->getTaxClassId();
- $this->setData('tax_class_id', $groupTaxClassId);
- }
- return $this->getData('tax_class_id');
- }
- /**
- * Retrieve store where customer was created
- *
- * @return \Magento\Store\Model\Store
- */
- public function getStore()
- {
- return $this->_storeManager->getStore($this->getStoreId());
- }
- /**
- * Retrieve shared store ids
- *
- * @return array
- */
- public function getSharedStoreIds()
- {
- $ids = $this->_getData('shared_store_ids');
- if ($ids === null) {
- $ids = [];
- if ((bool)$this->getSharingConfig()->isWebsiteScope()) {
- $ids = $this->_storeManager->getWebsite($this->getWebsiteId())->getStoreIds();
- } else {
- foreach ($this->_storeManager->getStores() as $store) {
- $ids[] = $store->getId();
- }
- }
- $this->setData('shared_store_ids', $ids);
- }
- return $ids;
- }
- /**
- * Retrieve shared website ids
- *
- * @return int[]
- */
- public function getSharedWebsiteIds()
- {
- $ids = $this->_getData('shared_website_ids');
- if ($ids === null) {
- $ids = [];
- if ((bool)$this->getSharingConfig()->isWebsiteScope()) {
- $ids[] = $this->getWebsiteId();
- } else {
- foreach ($this->_storeManager->getWebsites() as $website) {
- $ids[] = $website->getId();
- }
- }
- $this->setData('shared_website_ids', $ids);
- }
- return $ids;
- }
- /**
- * Retrieve attribute set id for customer.
- *
- * @return int
- * @since 102.0.1
- */
- public function getAttributeSetId()
- {
- return parent::getAttributeSetId() ?: CustomerMetadataInterface::ATTRIBUTE_SET_ID_CUSTOMER;
- }
- /**
- * Set store to customer
- *
- * @param \Magento\Store\Model\Store $store
- * @return $this
- */
- public function setStore(\Magento\Store\Model\Store $store)
- {
- $this->setStoreId($store->getId());
- $this->setWebsiteId($store->getWebsite()->getId());
- return $this;
- }
- /**
- * Validate customer attribute values.
- *
- * @deprecated 100.1.0
- * @return bool
- */
- public function validate()
- {
- return true;
- }
- /**
- * Unset subscription
- *
- * @return $this
- */
- public function unsetSubscription()
- {
- if (isset($this->_isSubscribed)) {
- unset($this->_isSubscribed);
- }
- return $this;
- }
- /**
- * Clean all addresses
- *
- * @return void
- */
- public function cleanAllAddresses()
- {
- $this->_addressesCollection = null;
- }
- /**
- * Add error
- *
- * @param mixed $error
- * @return $this
- */
- public function addError($error)
- {
- $this->_errors[] = $error;
- return $this;
- }
- /**
- * Retrieve errors
- *
- * @return array
- */
- public function getErrors()
- {
- return $this->_errors;
- }
- /**
- * Reset errors array
- *
- * @return $this
- */
- public function resetErrors()
- {
- $this->_errors = [];
- return $this;
- }
- /**
- * Prepare customer for delete
- *
- * @return $this
- */
- public function beforeDelete()
- {
- //TODO : Revisit and figure handling permissions in MAGETWO-11084 Implementation: Service Context Provider
- return parent::beforeDelete();
- }
- /**
- * Processing object after save data
- *
- * @return $this
- */
- public function afterSave()
- {
- $indexer = $this->indexerRegistry->get(self::CUSTOMER_GRID_INDEXER_ID);
- if ($indexer->getState()->getStatus() == StateInterface::STATUS_VALID) {
- $this->_getResource()->addCommitCallback([$this, 'reindex']);
- }
- return parent::afterSave();
- }
- /**
- * Init indexing process after customer delete
- *
- * @return \Magento\Framework\Model\AbstractModel
- */
- public function afterDeleteCommit()
- {
- $this->reindex();
- return parent::afterDeleteCommit();
- }
- /**
- * Init indexing process after customer save
- *
- * @return void
- */
- public function reindex()
- {
- /** @var \Magento\Framework\Indexer\IndexerInterface $indexer */
- $indexer = $this->indexerRegistry->get(self::CUSTOMER_GRID_INDEXER_ID);
- $indexer->reindexRow($this->getId());
- }
- /**
- * Get customer created at date timestamp
- *
- * @return int|null
- */
- public function getCreatedAtTimestamp()
- {
- $date = $this->getCreatedAt();
- if ($date) {
- return (new \DateTime($date))->getTimestamp();
- }
- return null;
- }
- /**
- * Reset all model data
- *
- * @return $this
- */
- public function reset()
- {
- $this->setData([]);
- $this->setOrigData();
- $this->_attributes = null;
- return $this;
- }
- /**
- * Checks model is deletable
- *
- * @return boolean
- */
- public function isDeleteable()
- {
- return $this->_isDeleteable;
- }
- /**
- * Set is deletable flag
- *
- * @param boolean $value
- * @return $this
- */
- public function setIsDeleteable($value)
- {
- $this->_isDeleteable = (bool)$value;
- return $this;
- }
- /**
- * Checks model is readonly
- *
- * @return boolean
- */
- public function isReadonly()
- {
- return $this->_isReadonly;
- }
- /**
- * Set is readonly flag
- *
- * @param boolean $value
- * @return $this
- */
- public function setIsReadonly($value)
- {
- $this->_isReadonly = (bool)$value;
- return $this;
- }
- /**
- * Check whether confirmation may be skipped when registering using certain email address
- *
- * @return bool
- * @deprecated 101.0.4
- * @see AccountConfirmation::isConfirmationRequired
- */
- protected function canSkipConfirmation()
- {
- if (!$this->getId()) {
- return false;
- }
- /* If an email was used to start the registration process and it is the same email as the one
- used to register, then this can skip confirmation.
- */
- $skipConfirmationIfEmail = $this->_registry->registry("skip_confirmation_if_email");
- if (!$skipConfirmationIfEmail) {
- return false;
- }
- return strtolower($skipConfirmationIfEmail) === strtolower($this->getEmail());
- }
- /**
- * Clone current object
- *
- * @return void
- */
- public function __clone()
- {
- $newAddressCollection = $this->getPrimaryAddresses();
- $newAddressCollection = array_merge($newAddressCollection, $this->getAdditionalAddresses());
- $this->setId(null);
- $this->cleanAllAddresses();
- foreach ($newAddressCollection as $address) {
- $this->addAddress(clone $address);
- }
- }
- /**
- * Return Entity Type instance
- *
- * @return \Magento\Eav\Model\Entity\Type
- */
- public function getEntityType()
- {
- return $this->_getResource()->getEntityType();
- }
- /**
- * Get either first store ID from a set website or the provided as default
- *
- * @param int|string|null $defaultStoreId
- *
- * @return int
- */
- protected function _getWebsiteStoreId($defaultStoreId = null)
- {
- if ($this->getWebsiteId() != 0 && empty($defaultStoreId)) {
- $storeIds = $this->_storeManager->getWebsite($this->getWebsiteId())->getStoreIds();
- reset($storeIds);
- $defaultStoreId = current($storeIds);
- }
- return $defaultStoreId;
- }
- /**
- * Change reset password link token
- *
- * Stores new reset password link token
- *
- * @param string $passwordLinkToken
- * @return $this
- * @throws \Magento\Framework\Exception\AuthenticationException
- */
- public function changeResetPasswordLinkToken($passwordLinkToken)
- {
- if (!is_string($passwordLinkToken) || empty($passwordLinkToken)) {
- throw new AuthenticationException(
- __('A valid password reset token is missing. Enter and try again.')
- );
- }
- $this->_getResource()->changeResetPasswordLinkToken($this, $passwordLinkToken);
- return $this;
- }
- /**
- * Check if current reset password link token is expired
- *
- * @return boolean
- */
- public function isResetPasswordLinkTokenExpired()
- {
- $linkToken = $this->getRpToken();
- $linkTokenCreatedAt = $this->getRpTokenCreatedAt();
- if (empty($linkToken) || empty($linkTokenCreatedAt)) {
- return true;
- }
- $expirationPeriod = $this->getResetPasswordLinkExpirationPeriod();
- $currentTimestamp = (new \DateTime())->getTimestamp();
- $tokenTimestamp = (new \DateTime($linkTokenCreatedAt))->getTimestamp();
- if ($tokenTimestamp > $currentTimestamp) {
- return true;
- }
- $dayDifference = floor(($currentTimestamp - $tokenTimestamp) / (24 * 60 * 60));
- if ($dayDifference >= $expirationPeriod) {
- return true;
- }
- return false;
- }
- /**
- * Retrieve customer reset password link expiration period in days
- *
- * @return int
- */
- public function getResetPasswordLinkExpirationPeriod()
- {
- return (int)$this->_scopeConfig->getValue(
- self::XML_PATH_CUSTOMER_RESET_PASSWORD_LINK_EXPIRATION_PERIOD,
- ScopeConfigInterface::SCOPE_TYPE_DEFAULT
- );
- }
- /**
- * Create address instance
- *
- * @return Address
- */
- protected function _createAddressInstance()
- {
- return $this->_addressFactory->create();
- }
- /**
- * Create address collection instance
- *
- * @return \Magento\Customer\Model\ResourceModel\Address\Collection
- */
- protected function _createAddressCollection()
- {
- return $this->_addressesFactory->create();
- }
- /**
- * Returns templates types
- *
- * @return array
- */
- protected function getTemplateTypes()
- {
- /**
- * 'registered' welcome email, when confirmation is disabled
- * 'confirmed' welcome email, when confirmation is enabled
- * 'confirmation' email with confirmation link
- */
- $types = [
- 'registered' => self::XML_PATH_REGISTER_EMAIL_TEMPLATE,
- 'confirmed' => self::XML_PATH_CONFIRMED_EMAIL_TEMPLATE,
- 'confirmation' => self::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
- ];
- return $types;
- }
- /**
- * Check if customer is locked
- *
- * @return boolean
- * @since 100.1.0
- */
- public function isCustomerLocked()
- {
- if ($this->getLockExpires()) {
- $lockExpires = new \DateTime($this->getLockExpires());
- if ($lockExpires > new \DateTime()) {
- return true;
- }
- }
- return false;
- }
- /**
- * Return Password Confirmation
- *
- * @return string
- * @since 100.1.0
- */
- public function getPasswordConfirm()
- {
- return (string) $this->getData('password_confirm');
- }
- /**
- * Return Password
- *
- * @return string
- * @since 100.1.0
- */
- public function getPassword()
- {
- return (string) $this->getData('password');
- }
- }
|