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 ); } /** * Init 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; } /** * @inheritdoc */ 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 object handler * * @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()); } /** * @inheritdoc * @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 */ 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; } }