Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
DataObjectHandler.php
Go to the documentation of this file.
1 <?php
8 
15 
17 {
18  const _ENTITY = 'entity';
19  const _NAME = 'name';
20  const _TYPE = 'type';
21  const _EXTENDS = 'extends';
22  const _DATA = 'data';
23  const _KEY = 'key';
24  const _VALUE = 'value';
25  const _UNIQUE = 'unique';
26  const _PREFIX = 'prefix';
27  const _SUFFIX = 'suffix';
28  const _ARRAY = 'array';
29  const _ITEM = 'item';
30  const _VAR = 'var';
31  const _ENTITY_TYPE = 'entityType';
32  const _ENTITY_KEY = 'entityKey';
33  const _SEPARATOR = '->';
34  const _REQUIRED_ENTITY = 'requiredEntity';
35  const DATA_NAME_ERROR_MSG = "Entity names cannot contain non alphanumeric characters.\tData='%s'";
36 
42  private static $INSTANCE;
43 
49  private $entityDataObjects = [];
50 
56  private $extendUtil;
57 
61  private function __construct()
62  {
63  $parser = ObjectManagerFactory::getObjectManager()->create(DataProfileSchemaParser::class);
64  $parserOutput = $parser->readDataProfiles();
65  if (!$parserOutput) {
66  return;
67  }
68  $this->entityDataObjects = $this->processParserOutput($parserOutput);
69  $this->extendUtil = new DataExtensionUtil();
70  }
71 
78  public static function getInstance()
79  {
80  if (!self::$INSTANCE) {
81  self::$INSTANCE = new DataObjectHandler();
82  }
83  return self::$INSTANCE;
84  }
85 
92  public function getObject($name)
93  {
94  if (array_key_exists($name, $this->entityDataObjects)) {
95  return $this->extendDataObject($this->entityDataObjects[$name]);
96  }
97 
98  return null;
99  }
100 
106  public function getAllObjects()
107  {
108  foreach ($this->entityDataObjects as $entityName => $entityObject) {
109  $this->entityDataObjects[$entityName] = $this->extendDataObject($entityObject);
110  }
111  return $this->entityDataObjects;
112  }
113 
121  private function processParserOutput($parserOutput)
122  {
123  $entityDataObjects = [];
124  $rawEntities = $parserOutput[self::_ENTITY];
125 
126  foreach ($rawEntities as $name => $rawEntity) {
127  if (preg_match('/[^a-zA-Z0-9_]/', $name)) {
128  throw new XmlException(sprintf(self::DATA_NAME_ERROR_MSG, $name));
129  }
130 
131  $type = $rawEntity[self::_TYPE] ?? null;
132  $data = [];
133  $linkedEntities = [];
134  $uniquenessData = [];
135  $vars = [];
136  $parentEntity = null;
137 
138  if (array_key_exists(self::_DATA, $rawEntity)) {
139  $data = $this->processDataElements($rawEntity);
140  $uniquenessData = $this->processUniquenessData($rawEntity);
141  }
142 
143  if (array_key_exists(self::_REQUIRED_ENTITY, $rawEntity)) {
144  $linkedEntities = $this->processLinkedEntities($rawEntity);
145  }
146 
147  if (array_key_exists(self::_ARRAY, $rawEntity)) {
148  $arrays = $rawEntity[self::_ARRAY];
149  foreach ($arrays as $array) {
150  $key = strtolower($array[self::_KEY]);
151  $data[$key] = $this->processArray($array[self::_ITEM], $data, $key);
152  }
153  }
154 
155  if (array_key_exists(self::_VAR, $rawEntity)) {
156  $vars = $this->processVarElements($rawEntity);
157  }
158 
159  if (array_key_exists(self::_EXTENDS, $rawEntity)) {
160  $parentEntity = $rawEntity[self::_EXTENDS];
161  }
162 
163  $entityDataObject = new EntityDataObject(
164  $name,
165  $type,
166  $data,
167  $linkedEntities,
168  $uniquenessData,
169  $vars,
170  $parentEntity
171  );
172 
173  $entityDataObjects[$entityDataObject->getName()] = $entityDataObject;
174  }
175 
176  return $entityDataObjects;
177  }
178 
187  private function processArray($arrayItems, $data, $key)
188  {
189  $items = [];
190  foreach ($arrayItems as $item) {
192  }
193 
194  return array_merge($items, $data[$key] ?? []);
195  }
196 
203  private function processDataElements($entityData)
204  {
205  $dataValues = [];
206  foreach ($entityData[self::_DATA] as $dataElement) {
207  $dataElementKey = strtolower($dataElement[self::_KEY]);
208  $dataElementValue = $dataElement[self::_VALUE] ?? "";
209  $dataValues[$dataElementKey] = $dataElementValue;
210  }
211  return $dataValues;
212  }
213 
220  private function processUniquenessData($entityData)
221  {
222  $uniquenessValues = [];
223  foreach ($entityData[self::_DATA] as $dataElement) {
224  if (array_key_exists(self::_UNIQUE, $dataElement)) {
225  $dataElementKey = strtolower($dataElement[self::_KEY]);
226  $uniquenessValues[$dataElementKey] = $dataElement[self::_UNIQUE];
227  }
228  }
229  return $uniquenessValues;
230  }
231 
238  private function processLinkedEntities($entityData)
239  {
240  $linkedEntities = [];
241  foreach ($entityData[self::_REQUIRED_ENTITY] as $linkedEntity) {
242  $linkedEntityName = $linkedEntity[self::_VALUE];
243  $linkedEntityType = $linkedEntity[self::_TYPE];
244 
245  $linkedEntities[$linkedEntityName] = $linkedEntityType;
246  }
247  return $linkedEntities;
248  }
249 
256  private function processVarElements($entityData)
257  {
258  $vars = [];
259  foreach ($entityData[self::_VAR] as $varElement) {
260  $varKey = $varElement[self::_KEY];
261  $varValue = $varElement[self::_ENTITY_TYPE] . self::_SEPARATOR . $varElement[self::_ENTITY_KEY];
262  $vars[$varKey] = $varValue;
263  }
264  return $vars;
265  }
266 
273  private function extendDataObject($dataObject)
274  {
275  if ($dataObject->getParentName() != null) {
276  return $this->extendUtil->extendEntity($dataObject);
277  }
278  return $dataObject;
279  }
280 }
$type
Definition: item.phtml:13
$items
if(!isset($_GET['name'])) $name
Definition: log.php:14