Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
JoinProcessor.php
Go to the documentation of this file.
1 <?php
8 
15 
20 {
26  protected $objectManager;
27 
31  private $typeProcessor;
32 
36  private $extensionAttributesFactory;
37 
41  private $joinProcessorHelper;
42 
51  public function __construct(
53  TypeProcessor $typeProcessor,
54  ExtensionAttributesFactory $extensionAttributesFactory,
55  JoinProcessorHelper $joinProcessorHelper
56  ) {
57  $this->objectManager = $objectManager;
58  $this->typeProcessor = $typeProcessor;
59  $this->extensionAttributesFactory = $extensionAttributesFactory;
60  $this->joinProcessorHelper = $joinProcessorHelper;
61  }
62 
66  public function process(DbCollection $collection, $extensibleEntityClass = null)
67  {
68  $extensibleEntityClass = $extensibleEntityClass ?: $collection->getItemObjectClass();
69  $joinDirectives = $this->getJoinDirectivesForType($extensibleEntityClass);
70 
71  foreach ($joinDirectives as $attributeCode => $directive) {
73  $joinData = $this->joinProcessorHelper->getJoinDataInterface();
74  $joinData->setAttributeCode($attributeCode)
75  ->setReferenceTable($directive[Converter::JOIN_REFERENCE_TABLE])
76  ->setReferenceTableAlias($this->getReferenceTableAlias($attributeCode))
77  ->setReferenceField($directive[Converter::JOIN_REFERENCE_FIELD])
78  ->setJoinField($directive[Converter::JOIN_ON_FIELD]);
79  $joinData->setSelectFields(
80  $this->joinProcessorHelper->getSelectFieldsMap($attributeCode, $directive[Converter::JOIN_FIELDS])
81  );
82  $collection->joinExtensionAttribute($joinData, $this);
83  }
84  }
85 
92  private function getReferenceTableAlias($attributeCode)
93  {
94  return 'extension_attribute_' . $attributeCode;
95  }
96 
100  public function extractExtensionAttributes($extensibleEntityClass, array $data)
101  {
102  if (!$this->isExtensibleAttributesImplemented($extensibleEntityClass)) {
103  /* do nothing as there are no extension attributes */
104  return $data;
105  }
106 
107  $joinDirectives = $this->getJoinDirectivesForType($extensibleEntityClass);
108  $extensionData = [];
109  foreach ($joinDirectives as $attributeCode => $directive) {
110  $this->populateAttributeCodeWithDirective(
112  $directive,
113  $data,
114  $extensionData,
115  $extensibleEntityClass
116  );
117  }
118  if (!empty($extensionData)) {
119  $extensionAttributes = $this->extensionAttributesFactory->create($extensibleEntityClass, $extensionData);
121  }
122  return $data;
123  }
124 
135  private function populateAttributeCodeWithDirective(
137  $directive,
138  &$data,
139  &$extensionData,
140  $extensibleEntityClass
141  ) {
142  $attributeType = $directive[Converter::DATA_TYPE];
143  $selectFields = $this->joinProcessorHelper
144  ->getSelectFieldsMap($attributeCode, $directive[Converter::JOIN_FIELDS]);
145 
146  foreach ($selectFields as $selectField) {
147  $internalAlias = $selectField[JoinDataInterface::SELECT_FIELD_INTERNAL_ALIAS];
148  if (isset($data[$internalAlias])) {
149  if ($this->typeProcessor->isArrayType($attributeType)) {
150  throw new \LogicException(
151  sprintf(
152  'Join directives cannot be processed for attribute (%s) of extensible entity (%s),'
153  . ' which has an Array type (%s).',
155  $this->extensionAttributesFactory->getExtensibleInterfaceName($extensibleEntityClass),
156  $attributeType
157  )
158  );
159  } elseif ($this->typeProcessor->isTypeSimple($attributeType)) {
160  $extensionData['data'][$attributeCode] = $data[$internalAlias];
161  unset($data[$internalAlias]);
162  break;
163  } else {
164  if (!isset($extensionData['data'][$attributeCode])) {
165  $extensionData['data'][$attributeCode] = $this->objectManager->create($attributeType);
166  }
167  $setterName = $selectField[JoinDataInterface::SELECT_FIELD_SETTER];
168  $extensionData['data'][$attributeCode]->$setterName($data[$internalAlias]);
169  unset($data[$internalAlias]);
170  }
171  }
172  }
173  }
174 
183  private function getJoinDirectivesForType($extensibleEntityClass)
184  {
185  $extensibleInterfaceName = $this->extensionAttributesFactory
186  ->getExtensibleInterfaceName($extensibleEntityClass);
187  $extensibleInterfaceName = ltrim($extensibleInterfaceName, '\\');
188  $config = $this->joinProcessorHelper->getConfigData();
189  if (!isset($config[$extensibleInterfaceName])) {
190  return [];
191  }
192 
193  $typeAttributesConfig = $config[$extensibleInterfaceName];
194  $joinDirectives = [];
195  foreach ($typeAttributesConfig as $attributeCode => $attributeConfig) {
196  if (isset($attributeConfig[Converter::JOIN_DIRECTIVE])) {
197  $joinDirectives[$attributeCode] = $attributeConfig[Converter::JOIN_DIRECTIVE];
198  $joinDirectives[$attributeCode][Converter::DATA_TYPE] = $attributeConfig[Converter::DATA_TYPE];
199  }
200  }
201 
202  return $joinDirectives;
203  }
204 
211  private function isExtensibleAttributesImplemented($typeName)
212  {
213  try {
214  $this->extensionAttributesFactory->getExtensibleInterfaceName($typeName);
215  return true;
216  } catch (\LogicException $e) {
217  return false;
218  }
219  }
220 }
__construct(\Magento\Framework\ObjectManagerInterface $objectManager, TypeProcessor $typeProcessor, ExtensionAttributesFactory $extensionAttributesFactory, JoinProcessorHelper $joinProcessorHelper)
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
process(DbCollection $collection, $extensibleEntityClass=null)
extractExtensionAttributes($extensibleEntityClass, array $data)
$config
Definition: fraud_order.php:17
$attributeCode
Definition: extend.phtml:12
$extensionAttributes
Definition: payment.php:22
$extensionAttributesFactory