/app/code/Magento/Catalog/Model/Attribute/ScopeOverriddenValue.php

https://gitlab.com/crazybutterfly815/magento2 · PHP · 181 lines · 105 code · 15 blank · 61 comment · 7 complexity · 65c0494b4ec0c022ce95dae18f030022 MD5 · raw file

  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Catalog\Model\Attribute;
  7. use Magento\Framework\EntityManager\MetadataPool;
  8. use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
  9. use Magento\Framework\Api\SearchCriteriaBuilder;
  10. use Magento\Framework\Api\FilterBuilder;
  11. use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
  12. use Magento\Store\Model\Store;
  13. use Magento\Framework\App\ResourceConnection;
  14. /**
  15. * Class ScopeOverriddenValue
  16. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  17. */
  18. class ScopeOverriddenValue
  19. {
  20. /**
  21. * @var AttributeRepository
  22. */
  23. private $attributeRepository;
  24. /**
  25. * @var MetadataPool
  26. */
  27. private $metadataPool;
  28. /**
  29. * @var SearchCriteriaBuilder
  30. */
  31. private $searchCriteriaBuilder;
  32. /**
  33. * @var array
  34. */
  35. private $attributesValues;
  36. /**
  37. * @var ResourceConnection
  38. */
  39. private $resourceConnection;
  40. /**
  41. * ScopeOverriddenValue constructor.
  42. * @param AttributeRepository $attributeRepository
  43. * @param MetadataPool $metadataPool
  44. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  45. * @param FilterBuilder $filterBuilder
  46. * @param ResourceConnection $resourceConnection
  47. */
  48. public function __construct(
  49. AttributeRepository $attributeRepository,
  50. MetadataPool $metadataPool,
  51. SearchCriteriaBuilder $searchCriteriaBuilder,
  52. FilterBuilder $filterBuilder,
  53. ResourceConnection $resourceConnection
  54. ) {
  55. $this->attributeRepository = $attributeRepository;
  56. $this->metadataPool = $metadataPool;
  57. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  58. $this->filterBuilder = $filterBuilder;
  59. $this->resourceConnection = $resourceConnection;
  60. }
  61. /**
  62. * Whether attribute value is overridden in specific store
  63. *
  64. * @param string $entityType
  65. * @param \Magento\Catalog\Model\AbstractModel $entity
  66. * @param string $attributeCode
  67. * @param int|string $storeId
  68. * @return bool
  69. */
  70. public function containsValue($entityType, $entity, $attributeCode, $storeId)
  71. {
  72. if ((int)$storeId === Store::DEFAULT_STORE_ID) {
  73. return false;
  74. }
  75. if ($this->attributesValues === null) {
  76. $this->initAttributeValues($entityType, $entity, (int)$storeId);
  77. }
  78. return isset($this->attributesValues[$storeId])
  79. && array_key_exists($attributeCode, $this->attributesValues[$storeId]);
  80. }
  81. /**
  82. * Get attribute default values
  83. *
  84. * @param string $entityType
  85. * @param \Magento\Catalog\Model\AbstractModel $entity
  86. * @return array
  87. *
  88. * @deprecated
  89. */
  90. public function getDefaultValues($entityType, $entity)
  91. {
  92. if ($this->attributesValues === null) {
  93. $this->initAttributeValues($entityType, $entity, (int)$entity->getStoreId());
  94. }
  95. return isset($this->attributesValues[Store::DEFAULT_STORE_ID])
  96. ? $this->attributesValues[Store::DEFAULT_STORE_ID]
  97. : [];
  98. }
  99. /**
  100. * @param string $entityType
  101. * @param \Magento\Catalog\Model\AbstractModel $entity
  102. * @param int $storeId
  103. * @throws \Magento\Framework\Exception\LocalizedException
  104. * @return void
  105. */
  106. private function initAttributeValues($entityType, $entity, $storeId)
  107. {
  108. $metadata = $this->metadataPool->getMetadata($entityType);
  109. /** @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute */
  110. $attributeTables = [];
  111. if ($metadata->getEavEntityType()) {
  112. foreach ($this->getAttributes($entityType) as $attribute) {
  113. if (!$attribute->isStatic()) {
  114. $attributeTables[$attribute->getBackend()->getTable()][] = $attribute->getAttributeId();
  115. }
  116. }
  117. $storeIds = [Store::DEFAULT_STORE_ID];
  118. if ($storeId !== Store::DEFAULT_STORE_ID) {
  119. $storeIds[] = $storeId;
  120. }
  121. $selects = [];
  122. foreach ($attributeTables as $attributeTable => $attributeCodes) {
  123. $select = $metadata->getEntityConnection()->select()
  124. ->from(['t' => $attributeTable], ['value' => 't.value', 'store_id' => 't.store_id'])
  125. ->join(
  126. ['a' => $this->resourceConnection->getTableName('eav_attribute')],
  127. 'a.attribute_id = t.attribute_id',
  128. ['attribute_code' => 'a.attribute_code']
  129. )
  130. ->where($metadata->getLinkField() . ' = ?', $entity->getData($metadata->getLinkField()))
  131. ->where('t.attribute_id IN (?)', $attributeCodes)
  132. ->where('t.store_id IN (?)', $storeIds);
  133. $selects[] = $select;
  134. }
  135. $unionSelect = new \Magento\Framework\DB\Sql\UnionExpression(
  136. $selects,
  137. \Magento\Framework\DB\Select::SQL_UNION_ALL
  138. );
  139. $attributes = $metadata->getEntityConnection()->fetchAll((string)$unionSelect);
  140. foreach ($attributes as $attribute) {
  141. $this->attributesValues[$attribute['store_id']][$attribute['attribute_code']] = $attribute['value'];
  142. }
  143. }
  144. }
  145. /**
  146. * @param string $entityType
  147. * @return \Magento\Eav\Api\Data\AttributeInterface[]
  148. */
  149. private function getAttributes($entityType)
  150. {
  151. $metadata = $this->metadataPool->getMetadata($entityType);
  152. $searchResult = $this->attributeRepository->getList(
  153. $metadata->getEavEntityType(),
  154. $this->searchCriteriaBuilder->addFilters(
  155. [
  156. $this->filterBuilder
  157. ->setField('is_global')
  158. ->setConditionType('in')
  159. ->setValue([ScopedAttributeInterface::SCOPE_STORE, ScopedAttributeInterface::SCOPE_WEBSITE])
  160. ->create()
  161. ]
  162. )->create()
  163. );
  164. return $searchResult->getItems();
  165. }
  166. }