Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ScopeOverriddenValue.php
Go to the documentation of this file.
1 <?php
8 
10 use Magento\Eav\Api\AttributeRepositoryInterface as AttributeRepository;
16 
22 {
26  private $attributeRepository;
27 
31  private $metadataPool;
32 
36  private $searchCriteriaBuilder;
37 
41  private $attributesValues;
42 
46  private $resourceConnection;
47 
56  public function __construct(
57  AttributeRepository $attributeRepository,
58  MetadataPool $metadataPool,
59  SearchCriteriaBuilder $searchCriteriaBuilder,
60  FilterBuilder $filterBuilder,
61  ResourceConnection $resourceConnection
62  ) {
63  $this->attributeRepository = $attributeRepository;
64  $this->metadataPool = $metadataPool;
65  $this->searchCriteriaBuilder = $searchCriteriaBuilder;
66  $this->filterBuilder = $filterBuilder;
67  $this->resourceConnection = $resourceConnection;
68  }
69 
80  {
81  if ((int)$storeId === Store::DEFAULT_STORE_ID) {
82  return false;
83  }
84  if ($this->attributesValues === null) {
85  $this->initAttributeValues($entityType, $entity, (int)$storeId);
86  }
87 
88  return isset($this->attributesValues[$storeId])
89  && array_key_exists($attributeCode, $this->attributesValues[$storeId]);
90  }
91 
102  {
103  if ($this->attributesValues === null) {
104  $this->initAttributeValues($entityType, $entity, (int)$entity->getStoreId());
105  }
106 
107  return isset($this->attributesValues[Store::DEFAULT_STORE_ID])
108  ? $this->attributesValues[Store::DEFAULT_STORE_ID]
109  : [];
110  }
111 
119  private function initAttributeValues($entityType, $entity, $storeId)
120  {
121  $metadata = $this->metadataPool->getMetadata($entityType);
123  $attributeTables = [];
124  if ($metadata->getEavEntityType()) {
125  foreach ($this->getAttributes($entityType) as $attribute) {
126  if (!$attribute->isStatic()) {
127  $attributeTables[$attribute->getBackend()->getTable()][] = $attribute->getAttributeId();
128  }
129  }
130  $storeIds = [Store::DEFAULT_STORE_ID];
132  $storeIds[] = $storeId;
133  }
134  $selects = [];
135  foreach ($attributeTables as $attributeTable => $attributeCodes) {
136  $select = $metadata->getEntityConnection()->select()
137  ->from(['t' => $attributeTable], ['value' => 't.value', 'store_id' => 't.store_id'])
138  ->join(
139  ['a' => $this->resourceConnection->getTableName('eav_attribute')],
140  'a.attribute_id = t.attribute_id',
141  ['attribute_code' => 'a.attribute_code']
142  )
143  ->where($metadata->getLinkField() . ' = ?', $entity->getData($metadata->getLinkField()))
144  ->where('t.attribute_id IN (?)', $attributeCodes)
145  ->where('t.store_id IN (?)', $storeIds);
146  $selects[] = $select;
147  }
148 
149  $unionSelect = new \Magento\Framework\DB\Sql\UnionExpression(
150  $selects,
151  \Magento\Framework\DB\Select::SQL_UNION_ALL
152  );
153  $attributes = $metadata->getEntityConnection()->fetchAll((string)$unionSelect);
154  foreach ($attributes as $attribute) {
155  $this->attributesValues[$attribute['store_id']][$attribute['attribute_code']] = $attribute['value'];
156  }
157  }
158  }
159 
164  private function getAttributes($entityType)
165  {
166  $metadata = $this->metadataPool->getMetadata($entityType);
167  $searchResult = $this->attributeRepository->getList(
168  $metadata->getEavEntityType(),
169  $this->searchCriteriaBuilder->addFilters(
170  [
171  $this->filterBuilder
172  ->setField('is_global')
173  ->setConditionType('in')
175  ->create()
176  ]
177  )->create()
178  );
179  return $searchResult->getItems();
180  }
181 }
$attributeCode
Definition: extend.phtml:12
const SQL_UNION_ALL
Definition: Select.php:69
$entity
Definition: element.phtml:22
$attributes
Definition: matrix.phtml:13
$searchCriteriaBuilder
containsValue($entityType, $entity, $attributeCode, $storeId)
__construct(AttributeRepository $attributeRepository, MetadataPool $metadataPool, SearchCriteriaBuilder $searchCriteriaBuilder, FilterBuilder $filterBuilder, ResourceConnection $resourceConnection)