mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
418 lines
12 KiB
PHP
418 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Customer\Model;
|
|
|
|
use Magento\Customer\Api\AddressMetadataInterface;
|
|
use Magento\Customer\Api\Data\AddressInterface;
|
|
use Magento\Customer\Api\Data\AddressInterfaceFactory;
|
|
use Magento\Customer\Api\Data\RegionInterfaceFactory;
|
|
use Magento\Customer\Model\Address\AbstractAddress\CountryModelsCache;
|
|
use Magento\Customer\Model\Address\AbstractAddress\RegionModelsCache;
|
|
use Magento\Customer\Model\Address\CompositeValidator;
|
|
use Magento\Framework\Indexer\StateInterface;
|
|
|
|
/**
|
|
* Customer address model
|
|
*
|
|
* @api
|
|
* @method int getParentId()
|
|
* @method \Magento\Customer\Model\Address setParentId(int $parentId)
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
* @since 100.0.2
|
|
*/
|
|
class Address extends \Magento\Customer\Model\Address\AbstractAddress
|
|
{
|
|
/**
|
|
* Customer entity
|
|
*
|
|
* @var Customer
|
|
*/
|
|
protected $_customer;
|
|
|
|
/**
|
|
* @var CustomerFactory
|
|
*/
|
|
protected $_customerFactory;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Reflection\DataObjectProcessor
|
|
*/
|
|
protected $dataProcessor;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\DataObjectHelper
|
|
*/
|
|
protected $dataObjectHelper;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Indexer\IndexerRegistry
|
|
*/
|
|
protected $indexerRegistry;
|
|
|
|
/**
|
|
* @var \Magento\Customer\Model\Address\CustomAttributeListInterface
|
|
*/
|
|
private $attributeList;
|
|
|
|
/**
|
|
* @param \Magento\Framework\Model\Context $context
|
|
* @param \Magento\Framework\Registry $registry
|
|
* @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
|
|
* @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
|
|
* @param \Magento\Directory\Helper\Data $directoryData
|
|
* @param \Magento\Eav\Model\Config $eavConfig
|
|
* @param Address\Config $addressConfig
|
|
* @param \Magento\Directory\Model\RegionFactory $regionFactory
|
|
* @param \Magento\Directory\Model\CountryFactory $countryFactory
|
|
* @param AddressMetadataInterface $metadataService
|
|
* @param AddressInterfaceFactory $addressDataFactory
|
|
* @param RegionInterfaceFactory $regionDataFactory
|
|
* @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
|
|
* @param CustomerFactory $customerFactory
|
|
* @param \Magento\Framework\Reflection\DataObjectProcessor $dataProcessor
|
|
* @param \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry
|
|
* @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource
|
|
* @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
|
|
* @param array $data
|
|
* @param CompositeValidator|null $compositeValidator
|
|
* @param CountryModelsCache|null $countryModelsCache
|
|
* @param RegionModelsCache|null $regionModelsCache
|
|
*
|
|
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
|
|
*/
|
|
public function __construct(
|
|
\Magento\Framework\Model\Context $context,
|
|
\Magento\Framework\Registry $registry,
|
|
\Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
|
|
\Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
|
|
\Magento\Directory\Helper\Data $directoryData,
|
|
\Magento\Eav\Model\Config $eavConfig,
|
|
\Magento\Customer\Model\Address\Config $addressConfig,
|
|
\Magento\Directory\Model\RegionFactory $regionFactory,
|
|
\Magento\Directory\Model\CountryFactory $countryFactory,
|
|
AddressMetadataInterface $metadataService,
|
|
AddressInterfaceFactory $addressDataFactory,
|
|
RegionInterfaceFactory $regionDataFactory,
|
|
\Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
|
|
CustomerFactory $customerFactory,
|
|
\Magento\Framework\Reflection\DataObjectProcessor $dataProcessor,
|
|
\Magento\Framework\Indexer\IndexerRegistry $indexerRegistry,
|
|
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
|
|
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
|
|
array $data = [],
|
|
?CompositeValidator $compositeValidator = null,
|
|
?CountryModelsCache $countryModelsCache = null,
|
|
?RegionModelsCache $regionModelsCache = null,
|
|
) {
|
|
$this->dataProcessor = $dataProcessor;
|
|
$this->_customerFactory = $customerFactory;
|
|
$this->indexerRegistry = $indexerRegistry;
|
|
parent::__construct(
|
|
$context,
|
|
$registry,
|
|
$extensionFactory,
|
|
$customAttributeFactory,
|
|
$directoryData,
|
|
$eavConfig,
|
|
$addressConfig,
|
|
$regionFactory,
|
|
$countryFactory,
|
|
$metadataService,
|
|
$addressDataFactory,
|
|
$regionDataFactory,
|
|
$dataObjectHelper,
|
|
$resource,
|
|
$resourceCollection,
|
|
$data,
|
|
$compositeValidator,
|
|
$countryModelsCache,
|
|
$regionModelsCache,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Initialize address model
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _construct()
|
|
{
|
|
$this->_init(\Magento\Customer\Model\ResourceModel\Address::class);
|
|
}
|
|
|
|
/**
|
|
* Update Model with the data from Data Interface
|
|
*
|
|
* @param AddressInterface $address
|
|
* @return $this
|
|
* Use Api/RepositoryInterface for the operations in the Data Interfaces. Don't rely on Address Model
|
|
*/
|
|
public function updateData(AddressInterface $address)
|
|
{
|
|
// Set all attributes
|
|
$attributes = $this->dataProcessor
|
|
->buildOutputDataArray($address, \Magento\Customer\Api\Data\AddressInterface::class);
|
|
|
|
foreach ($attributes as $attributeCode => $attributeData) {
|
|
if (AddressInterface::REGION === $attributeCode) {
|
|
$this->setRegion($address->getRegion()->getRegion());
|
|
$this->setRegionCode($address->getRegion()->getRegionCode());
|
|
$this->setRegionId($address->getRegion()->getRegionId());
|
|
} else {
|
|
$this->setDataUsingMethod($attributeCode, $attributeData);
|
|
}
|
|
}
|
|
// Need to explicitly set this due to discrepancy in the keys between model and data object
|
|
$this->setIsDefaultBilling($address->isDefaultBilling());
|
|
$this->setIsDefaultShipping($address->isDefaultShipping());
|
|
$customAttributes = $address->getCustomAttributes();
|
|
if ($customAttributes !== null) {
|
|
foreach ($customAttributes as $attribute) {
|
|
$this->setData($attribute->getAttributeCode(), $attribute->getValue());
|
|
}
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Create address data object based on current address model.
|
|
*
|
|
* @param int|null $defaultBillingAddressId
|
|
* @param int|null $defaultShippingAddressId
|
|
* @return AddressInterface
|
|
* Use Api/Data/AddressInterface as a result of service operations. Don't rely on the model to provide
|
|
* the instance of Api/Data/AddressInterface
|
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
|
*/
|
|
public function getDataModel($defaultBillingAddressId = null, $defaultShippingAddressId = null)
|
|
{
|
|
if ($this->getCustomerId() || $this->getParentId()) {
|
|
$customer = $this->getCustomer();
|
|
$defaultBillingAddressId = $customer->getDefaultBilling() ?: $defaultBillingAddressId;
|
|
$defaultShippingAddressId = $customer->getDefaultShipping() ?: $defaultShippingAddressId;
|
|
}
|
|
return parent::getDataModel($defaultBillingAddressId, $defaultShippingAddressId);
|
|
}
|
|
|
|
/**
|
|
* Retrieve address customer identifier
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getCustomerId()
|
|
{
|
|
return $this->_getData('customer_id') ? $this->_getData('customer_id') : $this->getParentId();
|
|
}
|
|
|
|
/**
|
|
* Declare address customer identifier
|
|
*
|
|
* @param int $id
|
|
* @return $this
|
|
*/
|
|
public function setCustomerId($id)
|
|
{
|
|
$this->setParentId($id);
|
|
$this->setData('customer_id', $id);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Retrieve address customer
|
|
*
|
|
* @return Customer|false
|
|
*/
|
|
public function getCustomer()
|
|
{
|
|
if (!$this->getCustomerId()) {
|
|
return false;
|
|
}
|
|
if (empty($this->_customer)) {
|
|
$this->_customer = $this->_createCustomer()->load($this->getCustomerId());
|
|
}
|
|
return $this->_customer;
|
|
}
|
|
|
|
/**
|
|
* Specify address customer
|
|
*
|
|
* @param Customer $customer
|
|
* @return $this
|
|
*/
|
|
public function setCustomer(Customer $customer)
|
|
{
|
|
$this->_customer = $customer;
|
|
$this->setCustomerId($customer->getId());
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Retrieve address entity attributes
|
|
*
|
|
* @return Attribute[]
|
|
*/
|
|
public function getAttributes()
|
|
{
|
|
$attributes = $this->getData('attributes');
|
|
if ($attributes === null) {
|
|
$attributes = $this->_getResource()->loadAllAttributes($this)->getSortedAttributes();
|
|
$this->setData('attributes', $attributes);
|
|
}
|
|
return $attributes;
|
|
}
|
|
|
|
/**
|
|
* Get attributes created by default
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function getDefaultAttributeCodes()
|
|
{
|
|
return $this->_getResource()->getDefaultAttributes();
|
|
}
|
|
|
|
/**
|
|
* Clone address
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __clone()
|
|
{
|
|
$this->setId(null);
|
|
}
|
|
|
|
/**
|
|
* Return Entity Type instance
|
|
*
|
|
* @return \Magento\Eav\Model\Entity\Type
|
|
*/
|
|
public function getEntityType()
|
|
{
|
|
return $this->_getResource()->getEntityType();
|
|
}
|
|
|
|
/**
|
|
* Return Region ID
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getRegionId()
|
|
{
|
|
return (int)$this->getData('region_id');
|
|
}
|
|
|
|
/**
|
|
* Set Region ID. $regionId is automatically converted to integer
|
|
*
|
|
* @param int $regionId
|
|
* @return $this
|
|
*/
|
|
public function setRegionId($regionId)
|
|
{
|
|
$this->setData('region_id', (int)$regionId);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Create customer model
|
|
*
|
|
* @return Customer
|
|
*/
|
|
protected function _createCustomer()
|
|
{
|
|
return $this->_customerFactory->create();
|
|
}
|
|
|
|
/**
|
|
* Return Entity Type ID
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getEntityTypeId()
|
|
{
|
|
return $this->getEntityType()->getId();
|
|
}
|
|
|
|
/**
|
|
* Processing object after save data
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function afterSave()
|
|
{
|
|
$indexer = $this->indexerRegistry->get(Customer::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(Customer::CUSTOMER_GRID_INDEXER_ID);
|
|
$indexer->reindexRow($this->getCustomerId());
|
|
}
|
|
|
|
/**
|
|
* Get a list of custom attribute codes.
|
|
*
|
|
* By default, entity can be extended only using extension attributes functionality.
|
|
*
|
|
* @return string[]
|
|
* @since 100.0.6
|
|
*/
|
|
protected function getCustomAttributesCodes()
|
|
{
|
|
return array_keys($this->getAttributeList()->getAttributes());
|
|
}
|
|
|
|
/**
|
|
* Get new AttributeList dependency for application code.
|
|
*
|
|
* @return \Magento\Customer\Model\Address\CustomAttributeListInterface
|
|
* @deprecated 100.0.6
|
|
* @see not recommended way
|
|
*/
|
|
private function getAttributeList()
|
|
{
|
|
if (!$this->attributeList) {
|
|
$this->attributeList = \Magento\Framework\App\ObjectManager::getInstance()->get(
|
|
\Magento\Customer\Model\Address\CustomAttributeListInterface::class
|
|
);
|
|
}
|
|
return $this->attributeList;
|
|
}
|
|
|
|
/**
|
|
* Retrieve attribute set id for customer address.
|
|
*
|
|
* @return int
|
|
* @since 101.0.0
|
|
*/
|
|
public function getAttributeSetId()
|
|
{
|
|
return parent::getAttributeSetId() ?: AddressMetadataInterface::ATTRIBUTE_SET_ID_ADDRESS;
|
|
}
|
|
}
|