Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
OperationDataArrayResolver.php
Go to the documentation of this file.
1 <?php
8 
15 
17 {
18  const PRIMITIVE_TYPES = [
19  'string',
20  'boolean',
21  'integer',
22  'number'
23  ];
24  const EXCEPTION_REQUIRED_DATA = "%s of key \" %s\" in \"%s\" is required by metadata, but was not provided.";
25 
32  private static $entitySequences = [];
33 
40  private $dependentEntities = [];
41 
47  public function __construct($dependentEntities = null)
48  {
49  if ($dependentEntities !== null) {
50  foreach ($dependentEntities as $entity) {
51  $this->dependentEntities[$entity->getName()] = $entity;
52  }
53  }
54  }
55 
70  public function resolveOperationDataArray($entityObject, $operationMetadata, $operation, $fromArray = false)
71  {
72  //TODO: Refactor to reduce Cyclomatic Complexity, remove SupressWarning accordingly.
73  $operationDataArray = [];
74  self::incrementSequence($entityObject->getName());
75 
76  foreach ($operationMetadata as $operationElement) {
77  if ($operationElement->getType() == OperationElementExtractor::OPERATION_OBJECT_OBJ_NAME) {
78  $entityObj = $this->resolveOperationObjectAndEntityData($entityObject, $operationElement->getValue());
79  if (null === $entityObj && $operationElement->isRequired()) {
80  throw new \Exception(sprintf(
81  self::EXCEPTION_REQUIRED_DATA,
82  $operationElement->getType(),
83  $operationElement->getKey(),
84  $entityObject->getName()
85  ));
86  } elseif (null === $entityObj) {
87  continue;
88  }
89  $operationData = $this->resolveOperationDataArray(
90  $entityObj,
91  $operationElement->getNestedMetadata(),
92  $operation,
93  $fromArray
94  );
95  if (!$fromArray) {
96  $operationDataArray[$operationElement->getKey()] = $operationData;
97  } else {
98  $operationDataArray = $operationData;
99  }
100  continue;
101  }
102 
103  $operationElementType = $operationElement->getValue();
104 
105  if (in_array($operationElementType, self::PRIMITIVE_TYPES)) {
106  $elementData = $this->resolvePrimitiveReference(
107  $entityObject,
108  $operationElement->getKey(),
109  $operationElement->getType()
110  );
111 
112  // If data was defined at all, attempt to put it into operation data array
113  // If data was not defined, and element is required, throw exception
114  // If no data is defined, don't input defaults per primitive into operation data array
115  if ($elementData != null) {
116  if (array_key_exists($operationElement->getKey(), $entityObject->getUniquenessData())) {
117  $uniqueData = $entityObject->getUniquenessDataByName($operationElement->getKey());
118  if ($uniqueData === 'suffix') {
119  $elementData .= (string)self::getSequence($entityObject->getName());
120  } else {
121  $elementData = (string)self::getSequence($entityObject->getName()) . $elementData;
122  }
123  }
124  $operationDataArray[$operationElement->getKey()] = $this->castValue(
125  $operationElementType,
126  $elementData
127  );
128  } elseif ($operationElement->isRequired()) {
129  throw new \Exception(sprintf(
130  self::EXCEPTION_REQUIRED_DATA,
131  $operationElement->getType(),
132  $operationElement->getKey(),
133  $entityObject->getName()
134  ));
135  }
136  } else {
137  $entityNamesOfType = $entityObject->getLinkedEntitiesOfType($operationElementType);
138 
139  // If an element is required by metadata, but was not provided in the entity, throw an exception
140  if ($operationElement->isRequired() && $entityNamesOfType == null) {
141  throw new \Exception(sprintf(
142  self::EXCEPTION_REQUIRED_DATA,
143  $operationElement->getType(),
144  $operationElement->getKey(),
145  $entityObject->getName()
146  ));
147  }
148  foreach ($entityNamesOfType as $entityName) {
149  $operationDataSubArray = $this->resolveNonPrimitiveElement(
150  $entityName,
151  $operationElement,
152  $operation,
153  $fromArray
154  );
155 
156  if ($operationElement->getType() == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) {
157  $operationDataArray[$operationElement->getKey()][] = $operationDataSubArray;
158  } else {
159  $operationDataArray[$operationElement->getKey()] = $operationDataSubArray;
160  }
161  }
162  }
163  }
164 
165  return $operationDataArray;
166  }
167 
179  private function resolvePrimitiveReference($entityObject, $operationKey, $operationElementType)
180  {
181  $elementData = $entityObject->getDataByName(
182  $operationKey,
184  );
185 
186  if ($elementData == null && $entityObject->getVarReference($operationKey) != null) {
187  list($type, $field) = explode(
189  $entityObject->getVarReference($operationKey)
190  );
191 
192  if ($operationElementType == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) {
193  $elementDatas = [];
194  $entities = $this->getDependentEntitiesOfType($type);
195  foreach ($entities as $entity) {
196  $elementDatas[] = $entity->getDataByName($field, EntityDataObject::CEST_UNIQUE_VALUE);
197  }
198 
199  return $elementDatas;
200  }
201 
202  $entity = $this->getDependentEntitiesOfType($type)[0];
203  $elementData = $entity->getDataByName($field, EntityDataObject::CEST_UNIQUE_VALUE);
204  }
205 
206  return $elementData;
207  }
208 
216  private function getDependentEntitiesOfType($type)
217  {
218  $entitiesOfType = [];
219 
220  foreach ($this->dependentEntities as $dependentEntity) {
221  if ($dependentEntity->getType() == $type) {
222  $entitiesOfType[] = $dependentEntity;
223  }
224  }
225 
226  return $entitiesOfType;
227  }
228 
239  private function resolveOperationObjectAndEntityData($entityObject, $operationElementValue)
240  {
241  if ($operationElementValue != $entityObject->getType()) {
242  // if we have a mismatch attempt to retrieve linked data and return just the first linkage
243  $linkName = $entityObject->getLinkedEntitiesOfType($operationElementValue);
244  if (!empty($linkName)) {
245  $linkName = $linkName[0];
246  return DataObjectHandler::getInstance()->getObject($linkName);
247  }
248  return null;
249  }
250 
251  return $entityObject;
252  }
253 
264  private function resolveNonPrimitiveElement($entityName, $operationElement, $operation, $fromArray = false)
265  {
266  $linkedEntityObj = $this->resolveLinkedEntityObject($entityName);
267 
268  // in array case
269  if (!empty($operationElement->getNestedOperationElement($operationElement->getValue()))
270  && $operationElement->getType() == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY
271  ) {
272  $operationSubArray = $this->resolveOperationDataArray(
273  $linkedEntityObj,
274  [$operationElement->getNestedOperationElement($operationElement->getValue())],
275  $operation,
276  true
277  );
278 
279  return $operationSubArray;
280  }
281 
282  $operationMetadata = OperationDefinitionObjectHandler::getInstance()->getOperationDefinition(
283  $operation,
284  $linkedEntityObj->getType()
285  )->getOperationMetadata();
286 
287  return $this->resolveOperationDataArray($linkedEntityObj, $operationMetadata, $operation, $fromArray);
288  }
289 
297  private function resolveLinkedEntityObject($entityName)
298  {
299  // check our dependent entity list to see if we have this defined
300  if (array_key_exists($entityName, $this->dependentEntities)) {
301  return $this->dependentEntities[$entityName];
302  }
303 
304  return DataObjectHandler::getInstance()->getObject($entityName);
305  }
306 
313  private static function incrementSequence($entityName)
314  {
315  if (array_key_exists($entityName, self::$entitySequences)) {
316  self::$entitySequences[$entityName]++;
317  } else {
318  self::$entitySequences[$entityName] = 1;
319  }
320  }
321 
328  private static function getSequence($entityName)
329  {
330  if (array_key_exists($entityName, self::$entitySequences)) {
331  return self::$entitySequences[$entityName];
332  }
333  return 0;
334  }
335 
336  // @codingStandardsIgnoreStart
345  private function castValue($type, $value)
346  {
347  $newVal = $value;
348 
349  if (is_array($value)) {
350  $newVals = [];
351  foreach($value as $val) {
352  $newVals[] = $this->castValue($type, $val);
353  }
354 
355  return $newVals;
356  }
357 
358  switch ($type) {
359  case 'string':
360  break;
361  case 'integer':
362  $newVal = (integer)$value;
363  break;
364  case 'boolean':
365  if (strtolower($newVal) === 'false') {
366  return false;
367  }
368  $newVal = (boolean)$value;
369  break;
370  case 'number':
371  $newVal = (float)$value;
372  break;
373  }
374 
375  return $newVal;
376  }
377  // @codingStandardsIgnoreEnd
378 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
resolveOperationDataArray($entityObject, $operationMetadata, $operation, $fromArray=false)
$type
Definition: item.phtml:13
$value
Definition: gender.phtml:16
$entity
Definition: element.phtml:22