AddressMetadata.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Customer\Model\Metadata;
  7. use Magento\Customer\Api\AddressMetadataInterface;
  8. use Magento\Customer\Model\AttributeMetadataConverter;
  9. use Magento\Customer\Model\AttributeMetadataDataProvider;
  10. use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
  11. use Magento\Framework\Api\SimpleDataObjectConverter;
  12. use Magento\Framework\Exception\NoSuchEntityException;
  13. /**
  14. * Service to fetch customer address related custom attributes
  15. */
  16. class AddressMetadata implements AddressMetadataInterface
  17. {
  18. /**
  19. * @var array
  20. */
  21. private $addressDataObjectMethods;
  22. /**
  23. * @var AttributeMetadataConverter
  24. */
  25. private $attributeMetadataConverter;
  26. /**
  27. * @var AttributeMetadataDataProvider
  28. */
  29. private $attributeMetadataDataProvider;
  30. /**
  31. * @param AttributeMetadataConverter $attributeMetadataConverter
  32. * @param AttributeMetadataDataProvider $attributeMetadataDataProvider
  33. */
  34. public function __construct(
  35. AttributeMetadataConverter $attributeMetadataConverter,
  36. AttributeMetadataDataProvider $attributeMetadataDataProvider
  37. ) {
  38. $this->attributeMetadataConverter = $attributeMetadataConverter;
  39. $this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
  40. }
  41. /**
  42. * {@inheritdoc}
  43. */
  44. public function getAttributes($formCode)
  45. {
  46. $attributes = [];
  47. $attributesFormCollection = $this->attributeMetadataDataProvider->loadAttributesCollection(
  48. AddressMetadataInterface::ENTITY_TYPE_ADDRESS,
  49. $formCode
  50. );
  51. foreach ($attributesFormCollection as $attribute) {
  52. $attributes[$attribute->getAttributeCode()] = $this->attributeMetadataConverter
  53. ->createMetadataAttribute($attribute);
  54. }
  55. if (empty($attributes)) {
  56. throw NoSuchEntityException::singleField('formCode', $formCode);
  57. }
  58. return $attributes;
  59. }
  60. /**
  61. * {@inheritdoc}
  62. */
  63. public function getAttributeMetadata($attributeCode)
  64. {
  65. /** @var AbstractAttribute $attribute */
  66. $attribute = $this->attributeMetadataDataProvider
  67. ->getAttribute(AddressMetadataInterface::ENTITY_TYPE_ADDRESS, $attributeCode);
  68. if ($attribute && ($attributeCode === 'id' || $attribute->getId() !== null)) {
  69. $attributeMetadata = $this->attributeMetadataConverter->createMetadataAttribute($attribute);
  70. return $attributeMetadata;
  71. } else {
  72. throw new NoSuchEntityException(
  73. __(
  74. 'No such entity with %fieldName = %fieldValue, %field2Name = %field2Value',
  75. [
  76. 'fieldName' => 'entityType',
  77. 'fieldValue' => AddressMetadataInterface::ENTITY_TYPE_ADDRESS,
  78. 'field2Name' => 'attributeCode',
  79. 'field2Value' => $attributeCode
  80. ]
  81. )
  82. );
  83. }
  84. }
  85. /**
  86. * {@inheritdoc}
  87. */
  88. public function getAllAttributesMetadata()
  89. {
  90. /** @var AbstractAttribute[] $attribute */
  91. $attributeCodes = $this->attributeMetadataDataProvider->getAllAttributeCodes(
  92. AddressMetadataInterface::ENTITY_TYPE_ADDRESS,
  93. AddressMetadataInterface::ATTRIBUTE_SET_ID_ADDRESS
  94. );
  95. $allAttributesMetadata = [];
  96. foreach ($attributeCodes as $attributeCode) {
  97. try {
  98. $allAttributesMetadata[] = $this->getAttributeMetadata($attributeCode);
  99. } catch (NoSuchEntityException $e) {
  100. //If no such entity, skip
  101. }
  102. }
  103. return $allAttributesMetadata;
  104. }
  105. /**
  106. * {@inheritdoc}
  107. */
  108. public function getCustomAttributesMetadata($dataObjectClassName = AddressMetadataInterface::DATA_INTERFACE_NAME)
  109. {
  110. if (!$this->addressDataObjectMethods) {
  111. $dataObjectMethods = array_flip(get_class_methods($dataObjectClassName));
  112. $baseClassDataObjectMethods = array_flip(
  113. get_class_methods(\Magento\Framework\Api\AbstractExtensibleObject::class)
  114. );
  115. $this->addressDataObjectMethods = array_diff_key($dataObjectMethods, $baseClassDataObjectMethods);
  116. }
  117. $customAttributes = [];
  118. foreach ($this->getAllAttributesMetadata() as $attributeMetadata) {
  119. $attributeCode = $attributeMetadata->getAttributeCode();
  120. $camelCaseKey = SimpleDataObjectConverter::snakeCaseToUpperCamelCase($attributeCode);
  121. $isDataObjectMethod = isset($this->addressDataObjectMethods['get' . $camelCaseKey])
  122. || isset($this->addressDataObjectMethods['is' . $camelCaseKey]);
  123. if (!$isDataObjectMethod && !$attributeMetadata->isSystem()) {
  124. $customAttributes[] = $attributeMetadata;
  125. }
  126. }
  127. return $customAttributes;
  128. }
  129. }