123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Model\Customer;
- use Magento\Customer\Api\Data\AddressInterface;
- use Magento\Customer\Api\Data\CustomerInterface;
- use Magento\Customer\Model\Address;
- use Magento\Customer\Model\Attribute;
- use Magento\Customer\Model\Customer;
- use Magento\Customer\Model\FileProcessorFactory;
- use Magento\Customer\Model\ResourceModel\Address\Attribute\Source\CountryWithWebsites;
- use Magento\Customer\Model\ResourceModel\Customer\Collection;
- use Magento\Customer\Model\ResourceModel\Customer\CollectionFactory as CustomerCollectionFactory;
- use Magento\Eav\Api\Data\AttributeInterface;
- use Magento\Eav\Model\Config;
- use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
- use Magento\Eav\Model\Entity\Type;
- use Magento\Framework\App\ObjectManager;
- use Magento\Framework\Session\SessionManagerInterface;
- use Magento\Framework\View\Element\UiComponent\ContextInterface;
- use Magento\Framework\View\Element\UiComponent\DataProvider\FilterPool;
- use Magento\Ui\Component\Form\Element\Multiline;
- use Magento\Ui\Component\Form\Field;
- use Magento\Ui\DataProvider\EavValidationRules;
- use Magento\Customer\Model\FileUploaderDataResolver;
- /**
- * Supplies the data for the customer UI component
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- * @SuppressWarnings(PHPMD.TooManyFields)
- *
- * @deprecated 102.0.1 \Magento\Customer\Model\Customer\DataProviderWithDefaultAddresses is used instead
- * @api
- * @since 100.0.2
- */
- class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
- {
- /**
- * Maximum file size allowed for file_uploader UI component
- */
- const MAX_FILE_SIZE = 2097152;
- /**
- * @var Collection
- */
- protected $collection;
- /**
- * @var Config
- */
- protected $eavConfig;
- /**
- * @var FilterPool
- */
- protected $filterPool;
- /**
- * @var array
- */
- protected $loadedData;
- /**
- * @var CountryWithWebsites
- */
- private $countryWithWebsiteSource;
- /**
- * @var \Magento\Customer\Model\Config\Share
- */
- private $shareConfig;
- /**
- * EAV attribute properties to fetch from meta storage
- * @var array
- */
- protected $metaProperties = [
- 'dataType' => 'frontend_input',
- 'visible' => 'is_visible',
- 'required' => 'is_required',
- 'label' => 'frontend_label',
- 'sortOrder' => 'sort_order',
- 'notice' => 'note',
- 'default' => 'default_value',
- 'size' => 'multiline_count',
- ];
- /**
- * Form element mapping
- *
- * @var array
- */
- protected $formElement = [
- 'text' => 'input',
- 'hidden' => 'input',
- 'boolean' => 'checkbox',
- ];
- /**
- * @var EavValidationRules
- */
- protected $eavValidationRules;
- /**
- * @var SessionManagerInterface
- * @since 100.1.0
- */
- protected $session;
- /**
- * Customer fields that must be removed
- *
- * @var array
- */
- private $forbiddenCustomerFields = [
- 'password_hash',
- 'rp_token',
- 'confirmation',
- ];
- /*
- * @var ContextInterface
- */
- private $context;
- /**
- * Allow to manage attributes, even they are hidden on storefront
- *
- * @var bool
- */
- private $allowToShowHiddenAttributes;
- /**
- * @var FileUploaderDataResolver
- */
- private $fileUploaderDataResolver;
- /**
- * @param string $name
- * @param string $primaryFieldName
- * @param string $requestFieldName
- * @param EavValidationRules $eavValidationRules
- * @param CustomerCollectionFactory $customerCollectionFactory
- * @param Config $eavConfig
- * @param FilterPool $filterPool
- * @param FileProcessorFactory $fileProcessorFactory
- * @param array $meta
- * @param array $data
- * @param ContextInterface $context
- * @param bool $allowToShowHiddenAttributes
- * @param FileUploaderDataResolver|null $fileUploaderDataResolver
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function __construct(
- $name,
- $primaryFieldName,
- $requestFieldName,
- EavValidationRules $eavValidationRules,
- CustomerCollectionFactory $customerCollectionFactory,
- Config $eavConfig,
- FilterPool $filterPool,
- FileProcessorFactory $fileProcessorFactory = null,
- array $meta = [],
- array $data = [],
- ContextInterface $context = null,
- $allowToShowHiddenAttributes = true,
- $fileUploaderDataResolver = null
- ) {
- parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
- $this->eavValidationRules = $eavValidationRules;
- $this->collection = $customerCollectionFactory->create();
- $this->collection->addAttributeToSelect('*');
- $this->eavConfig = $eavConfig;
- $this->filterPool = $filterPool;
- $this->context = $context ?: ObjectManager::getInstance()->get(ContextInterface::class);
- $this->allowToShowHiddenAttributes = $allowToShowHiddenAttributes;
- $this->fileUploaderDataResolver = $fileUploaderDataResolver
- ?: ObjectManager::getInstance()->get(FileUploaderDataResolver::class);
- $this->meta['customer']['children'] = $this->getAttributesMeta(
- $this->eavConfig->getEntityType('customer')
- );
- $this->meta['address']['children'] = $this->getAttributesMeta(
- $this->eavConfig->getEntityType('customer_address')
- );
- }
- /**
- * Get session object
- *
- * @return SessionManagerInterface
- * @deprecated 100.1.3
- * @since 100.1.0
- */
- protected function getSession()
- {
- if ($this->session === null) {
- $this->session = ObjectManager::getInstance()->get(
- \Magento\Framework\Session\SessionManagerInterface::class
- );
- }
- return $this->session;
- }
- /**
- * Get data
- *
- * @return array
- */
- public function getData()
- {
- if (isset($this->loadedData)) {
- return $this->loadedData;
- }
- $items = $this->collection->getItems();
- /** @var Customer $customer */
- foreach ($items as $customer) {
- $result['customer'] = $customer->getData();
- $this->fileUploaderDataResolver->overrideFileUploaderData($customer, $result['customer']);
- $result['customer'] = array_diff_key(
- $result['customer'],
- array_flip($this->forbiddenCustomerFields)
- );
- unset($result['address']);
- /** @var Address $address */
- foreach ($customer->getAddresses() as $address) {
- $addressId = $address->getId();
- $address->load($addressId);
- $result['address'][$addressId] = $address->getData();
- $this->prepareAddressData($addressId, $result['address'], $result['customer']);
- $this->fileUploaderDataResolver->overrideFileUploaderData($address, $result['address'][$addressId]);
- }
- $this->loadedData[$customer->getId()] = $result;
- }
- $data = $this->getSession()->getCustomerFormData();
- if (!empty($data)) {
- $customerId = isset($data['customer']['entity_id']) ? $data['customer']['entity_id'] : null;
- $this->loadedData[$customerId] = $data;
- $this->getSession()->unsCustomerFormData();
- }
- return $this->loadedData;
- }
- /**
- * Get attributes meta
- *
- * @param Type $entityType
- * @return array
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- protected function getAttributesMeta(Type $entityType)
- {
- $meta = [];
- $attributes = $entityType->getAttributeCollection();
- /* @var AbstractAttribute $attribute */
- foreach ($attributes as $attribute) {
- $this->processFrontendInput($attribute, $meta);
- $code = $attribute->getAttributeCode();
- // use getDataUsingMethod, since some getters are defined and apply additional processing of returning value
- foreach ($this->metaProperties as $metaName => $origName) {
- $value = $attribute->getDataUsingMethod($origName);
- $meta[$code]['arguments']['data']['config'][$metaName] = ($metaName === 'label') ? __($value) : $value;
- if ('frontend_input' === $origName) {
- $meta[$code]['arguments']['data']['config']['formElement'] = isset($this->formElement[$value])
- ? $this->formElement[$value]
- : $value;
- }
- }
- if ($attribute->usesSource()) {
- if ($code == AddressInterface::COUNTRY_ID) {
- $meta[$code]['arguments']['data']['config']['options'] = $this->getCountryWithWebsiteSource()
- ->getAllOptions();
- } else {
- $meta[$code]['arguments']['data']['config']['options'] = $attribute->getSource()->getAllOptions();
- }
- }
- $rules = $this->eavValidationRules->build($attribute, $meta[$code]['arguments']['data']['config']);
- if (!empty($rules)) {
- $meta[$code]['arguments']['data']['config']['validation'] = $rules;
- }
- $meta[$code]['arguments']['data']['config']['componentType'] = Field::NAME;
- $meta[$code]['arguments']['data']['config']['visible'] = $this->canShowAttribute($attribute);
- $this->fileUploaderDataResolver->overrideFileUploaderMetadata(
- $entityType,
- $attribute,
- $meta[$code]['arguments']['data']['config']
- );
- }
- $this->processWebsiteMeta($meta);
- return $meta;
- }
- /**
- * Check whether the specific attribute can be shown in form: customer registration, customer edit, etc...
- *
- * @param Attribute $customerAttribute
- * @return bool
- */
- private function canShowAttributeInForm(AbstractAttribute $customerAttribute)
- {
- $isRegistration = $this->context->getRequestParam($this->getRequestFieldName()) === null;
- if ($customerAttribute->getEntityType()->getEntityTypeCode() === 'customer') {
- return is_array($customerAttribute->getUsedInForms()) &&
- (
- (in_array('customer_account_create', $customerAttribute->getUsedInForms()) && $isRegistration) ||
- (in_array('customer_account_edit', $customerAttribute->getUsedInForms()) && !$isRegistration)
- );
- } else {
- return is_array($customerAttribute->getUsedInForms()) &&
- in_array('customer_address_edit', $customerAttribute->getUsedInForms());
- }
- }
- /**
- * Detect can we show attribute on specific form or not
- *
- * @param Attribute $customerAttribute
- * @return bool
- */
- private function canShowAttribute(AbstractAttribute $customerAttribute)
- {
- $userDefined = (bool) $customerAttribute->getIsUserDefined();
- if (!$userDefined) {
- return $customerAttribute->getIsVisible();
- }
- $canShowOnForm = $this->canShowAttributeInForm($customerAttribute);
- return ($this->allowToShowHiddenAttributes && $canShowOnForm) ||
- (!$this->allowToShowHiddenAttributes && $canShowOnForm && $customerAttribute->getIsVisible());
- }
- /**
- * Retrieve Country With Websites Source
- *
- * @return CountryWithWebsites
- * @deprecated 101.0.0
- */
- private function getCountryWithWebsiteSource()
- {
- if (!$this->countryWithWebsiteSource) {
- $this->countryWithWebsiteSource = ObjectManager::getInstance()->get(CountryWithWebsites::class);
- }
- return $this->countryWithWebsiteSource;
- }
- /**
- * Retrieve Customer Config Share
- *
- * @return \Magento\Customer\Model\Config\Share
- * @deprecated 100.1.3
- */
- private function getShareConfig()
- {
- if (!$this->shareConfig) {
- $this->shareConfig = ObjectManager::getInstance()->get(\Magento\Customer\Model\Config\Share::class);
- }
- return $this->shareConfig;
- }
- /**
- * Add global scope parameter and filter options to website meta
- *
- * @param array $meta
- * @return void
- */
- private function processWebsiteMeta(&$meta)
- {
- if (isset($meta[CustomerInterface::WEBSITE_ID]) && $this->getShareConfig()->isGlobalScope()) {
- $meta[CustomerInterface::WEBSITE_ID]['arguments']['data']['config']['isGlobalScope'] = 1;
- }
- if (isset($meta[AddressInterface::COUNTRY_ID]) && !$this->getShareConfig()->isGlobalScope()) {
- $meta[AddressInterface::COUNTRY_ID]['arguments']['data']['config']['filterBy'] = [
- 'target' => '${ $.provider }:data.customer.website_id',
- 'field' => 'website_ids'
- ];
- }
- }
- /**
- * Process attributes by frontend input type
- *
- * @param AttributeInterface $attribute
- * @param array $meta
- * @return array
- */
- private function processFrontendInput(AttributeInterface $attribute, array &$meta)
- {
- $code = $attribute->getAttributeCode();
- if ($attribute->getFrontendInput() === 'boolean') {
- $meta[$code]['arguments']['data']['config']['prefer'] = 'toggle';
- $meta[$code]['arguments']['data']['config']['valueMap'] = [
- 'true' => '1',
- 'false' => '0',
- ];
- }
- }
- /**
- * Prepare address data
- *
- * @param int $addressId
- * @param array $addresses
- * @param array $customer
- * @return void
- */
- protected function prepareAddressData($addressId, array &$addresses, array $customer)
- {
- if (isset($customer['default_billing'])
- && $addressId == $customer['default_billing']
- ) {
- $addresses[$addressId]['default_billing'] = $customer['default_billing'];
- }
- if (isset($customer['default_shipping'])
- && $addressId == $customer['default_shipping']
- ) {
- $addresses[$addressId]['default_shipping'] = $customer['default_shipping'];
- }
- foreach ($this->meta['address']['children'] as $attributeName => $attributeMeta) {
- if ($attributeMeta['arguments']['data']['config']['dataType'] === Multiline::NAME
- && isset($addresses[$addressId][$attributeName])
- && !is_array($addresses[$addressId][$attributeName])
- ) {
- $addresses[$addressId][$attributeName] = explode("\n", $addresses[$addressId][$attributeName]);
- }
- }
- }
- }
|