CreateHandler.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Eav\Model\ResourceModel;
  7. use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
  8. use Magento\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\Framework\App\ObjectManager;
  10. use Magento\Framework\EntityManager\MetadataPool;
  11. use Magento\Framework\EntityManager\Operation\AttributeInterface;
  12. use Magento\Framework\Model\Entity\ScopeResolver;
  13. /**
  14. * Class CreateHandler
  15. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  16. */
  17. class CreateHandler implements AttributeInterface
  18. {
  19. /**
  20. * @var AttributeRepository
  21. */
  22. private $attributeRepository;
  23. /**
  24. * @var MetadataPool
  25. */
  26. private $metadataPool;
  27. /**
  28. * @var SearchCriteriaBuilder
  29. */
  30. private $searchCriteriaBuilder;
  31. /**
  32. * @var AttributePersistor
  33. */
  34. private $attributePersistor;
  35. /**
  36. * @var ScopeResolver
  37. */
  38. private $scopeResolver;
  39. /**
  40. * @var AttributeLoader
  41. */
  42. private $attributeLoader;
  43. /**
  44. * @param AttributeRepository $attributeRepository
  45. * @param MetadataPool $metadataPool
  46. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  47. * @param AttributePersistor $attributePersistor
  48. * @param ScopeResolver $scopeResolver
  49. * @param AttributeLoader $attributeLoader
  50. */
  51. public function __construct(
  52. AttributeRepository $attributeRepository,
  53. MetadataPool $metadataPool,
  54. SearchCriteriaBuilder $searchCriteriaBuilder,
  55. AttributePersistor $attributePersistor,
  56. ScopeResolver $scopeResolver,
  57. AttributeLoader $attributeLoader = null
  58. ) {
  59. $this->attributeRepository = $attributeRepository;
  60. $this->metadataPool = $metadataPool;
  61. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  62. $this->attributePersistor = $attributePersistor;
  63. $this->scopeResolver = $scopeResolver;
  64. $this->attributeLoader = $attributeLoader ?: ObjectManager::getInstance()->get(AttributeLoader::class);
  65. }
  66. /**
  67. * @param string $entityType
  68. * @param int $attributeSetId
  69. * @return \Magento\Eav\Api\Data\AttributeInterface[]
  70. */
  71. protected function getAttributes($entityType, $attributeSetId = null)
  72. {
  73. return $this->attributeLoader->getAttributes($entityType, $attributeSetId);
  74. }
  75. /**
  76. * @param string $entityType
  77. * @param array $entityData
  78. * @param array $arguments
  79. * @return array
  80. * @throws \Exception
  81. * @throws \Magento\Framework\Exception\ConfigurationMismatchException
  82. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  83. */
  84. public function execute($entityType, $entityData, $arguments = [])
  85. {
  86. $metadata = $this->metadataPool->getMetadata($entityType);
  87. if ($metadata->getEavEntityType()) {
  88. $processed = [];
  89. $entityLinkField = $metadata->getLinkField();
  90. $attributeSetId = isset($entityData[AttributeLoader::ATTRIBUTE_SET_ID])
  91. ? $entityData[AttributeLoader::ATTRIBUTE_SET_ID]
  92. : null; // @todo verify is it normal to not have attribute_set_id
  93. /** @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute */
  94. foreach ($this->getAttributes($entityType, $attributeSetId) as $attribute) {
  95. if ($attribute->isStatic()) {
  96. continue;
  97. }
  98. $attributeCode = $attribute->getAttributeCode();
  99. if (isset($entityData[$attributeCode])
  100. && !is_array($entityData[$attributeCode])
  101. && !$attribute->isValueEmpty($entityData[$attributeCode])
  102. ) {
  103. $this->attributePersistor->registerInsert(
  104. $entityType,
  105. $entityData[$entityLinkField],
  106. $attributeCode,
  107. $entityData[$attributeCode]
  108. );
  109. $processed[$attributeCode] = $entityData[$attributeCode];
  110. }
  111. }
  112. $context = $this->scopeResolver->getEntityContext($entityType, $entityData);
  113. $this->attributePersistor->flush($entityType, $context);
  114. }
  115. return $entityData;
  116. }
  117. }