Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Converter.php
Go to the documentation of this file.
1 <?php
7 
11 
12 class Converter implements ConverterInterface
13 {
21  public function convert($source)
22  {
23  $output = [];
24  $xpath = new \DOMXPath($source);
25  $indexers = $xpath->evaluate('/config/indexer');
27  foreach ($indexers as $indexerNode) {
28  $data = [];
29  $indexerId = $this->getAttributeValue($indexerNode, 'id');
30  $data['indexer_id'] = $indexerId;
31  $data['primary'] = $this->getAttributeValue($indexerNode, 'primary');
32  $data['view_id'] = $this->getAttributeValue($indexerNode, 'view_id');
33  $data['action_class'] = $this->getAttributeValue($indexerNode, 'class');
34  $data['shared_index'] = $this->getAttributeValue($indexerNode, 'shared_index');
35  $data['title'] = '';
36  $data['description'] = '';
37  $data['dependencies'] = [];
38 
40  foreach ($indexerNode->childNodes as $childNode) {
41  if ($childNode->nodeType != XML_ELEMENT_NODE) {
42  continue;
43  }
45  $data = $this->convertChild($childNode, $data);
46  }
47  $output[$indexerId] = $data;
48  }
49  $output = $this->sortByDependencies($output);
50 
51  return $output;
52  }
53 
62  protected function getAttributeValue(\DOMNode $input, $attributeName, $default = null)
63  {
64  $node = $input->attributes->getNamedItem($attributeName);
65  return $node ? $node->nodeValue : $default;
66  }
67 
75  protected function convertChild(\DOMElement $childNode, $data)
76  {
77  $data['fieldsets'] = isset($data['fieldsets']) ? $data['fieldsets'] : [];
78  switch ($childNode->nodeName) {
79  case 'title':
80  $data['title'] = $childNode->nodeValue;
81  break;
82  case 'description':
83  $data['description'] = $childNode->nodeValue;
84  break;
85  case 'saveHandler':
86  $data['saveHandler'] = $this->getAttributeValue($childNode, 'class');
87  break;
88  case 'structure':
89  $data['structure'] = $this->getAttributeValue($childNode, 'class');
90  break;
91  case 'fieldset':
92  $data = $this->convertFieldset($childNode, $data);
93  break;
94  case 'dependencies':
95  $data = $this->convertDependencies($childNode, $data);
96  break;
97  }
98  return $data;
99  }
100 
109  protected function convertFieldset(\DOMElement $node, $data)
110  {
111  $data['fieldsets'] = isset($data['fieldsets']) ? $data['fieldsets'] : [];
112 
113  $data['fieldsets'][$this->getAttributeValue($node, 'name')] = [
114  'source' => $this->getAttributeValue($node, 'source'),
115  'name' => $this->getAttributeValue($node, 'name'),
116  'provider' => $this->getAttributeValue($node, 'provider'),
117  'fields' => [],
118  ];
119  foreach ($node->childNodes as $childNode) {
120  if ($childNode->nodeType != XML_ELEMENT_NODE) {
121  continue;
122  }
123  switch ($childNode->nodeName) {
124  case 'field':
125  $data['fieldsets'][$this->getAttributeValue($node, 'name')] = $this->convertField(
126  $childNode,
127  $data['fieldsets'][$this->getAttributeValue($node, 'name')]
128  );
129  break;
130  case 'reference':
131  $data['fieldsets'][$this->getAttributeValue($node, 'name')]['references'] =
132  isset($data['fieldsets'][$this->getAttributeValue($node, 'name')]['references'])
133  ? $data['fieldsets'][$this->getAttributeValue($node, 'name')]['references']
134  : [];
135  $data['fieldsets'][$this->getAttributeValue($node, 'name')]['references']
136  [$this->getAttributeValue($childNode, 'fieldset')] =
137  isset(
138  $data['fieldsets'][$this->getAttributeValue($node, 'name')]
139  ['references'][$this->getAttributeValue($childNode, 'fieldset')]
140  )
141  ? $data['fieldsets'][$this->getAttributeValue($node, 'name')]
142  ['references'][$this->getAttributeValue($childNode, 'fieldset')]
143  : [];
144  $data['fieldsets'][$this->getAttributeValue($node, 'name')]['references']
145  [$this->getAttributeValue($childNode, 'fieldset')] = [
146  'fieldset' => $this->getAttributeValue($childNode, 'fieldset'),
147  'from' => $this->getAttributeValue($childNode, 'from'),
148  'to' => $this->getAttributeValue($childNode, 'to'),
149  ];
150  $this->addVirtualField(
151  $this->getAttributeValue($childNode, 'fieldset'),
152  $this->getAttributeValue($childNode, 'to'),
153  $data
154  );
155  $this->addVirtualField(
156  $this->getAttributeValue($node, 'name'),
157  $this->getAttributeValue($childNode, 'from'),
158  $data
159  );
160  break;
161  }
162  }
163  return $this->sorting($data);
164  }
165 
173  private function convertDependencies(\DOMElement $node, array $data): array
174  {
175  $data['dependencies'] = $data['dependencies'] ?? [];
176 
178  foreach ($node->childNodes as $childNode) {
179  switch ($childNode->nodeName) {
180  case 'indexer':
181  $indexerId = $this->getAttributeValue($childNode, 'id');
182  $data['dependencies'][] = $indexerId;
183  break;
184  }
185  }
186  return $data;
187  }
188 
197  protected function addVirtualField($fieldset, $field, $data)
198  {
199  if (!isset($data['fieldsets'][$fieldset]['fields'][$field])) {
200  $data['fieldsets'][$fieldset]['fields'][$field] = [
201  'type' => 'virtual',
202  'name' => $field,
203  ];
204  }
205  }
206 
214  protected function convertField(\DOMElement $node, $data)
215  {
216  $data['fields'][$this->getAttributeValue($node, 'name')] = [
217  'name' => $this->getAttributeValue($node, 'name'),
218  'handler' => $this->getAttributeValue($node, 'handler'),
219  'origin' => $this->getAttributeValue($node, 'origin') ?: $this->getAttributeValue($node, 'name'),
220  'dataType' => $this->getAttributeValue($node, 'dataType'),
221  'type' => $node->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'type'),
222  ];
223 
224  $data['fields'][$this->getAttributeValue($node, 'name')]['filters'] = [];
226  foreach ($node->childNodes as $childNode) {
227  if ($childNode->nodeType != XML_ELEMENT_NODE) {
228  continue;
229  }
230  $data['fields'][$this->getAttributeValue($node, 'name')]['filters'][]
231  = $this->getAttributeValue($childNode, 'class');
232  }
233  return $data;
234  }
235 
243  protected function getTranslatedNodeValue(\DOMNode $node)
244  {
245  $value = $node->nodeValue;
246  if ($this->getAttributeValue($node, 'translate') == 'true') {
247  $value = new \Magento\Framework\Phrase($value);
248  }
249  return $value;
250  }
251 
258  protected function sorting($data)
259  {
260  usort($data['fieldsets'], function ($current, $parent) use ($data) {
261  if (!isset($current['references']) && $data['primary'] == $current['name']
262  || isset($parent['references'][$current['name']])
263  ) {
264  return -1;
265  } elseif (!isset($parent['references']) || isset($current['references'][$parent['name']])) {
266  return 1;
267  } else {
268  return 0;
269  }
270  });
271  return $data;
272  }
273 
282  private function sortByDependencies(array $indexers): array
283  {
284  $expanded = [];
285  foreach (array_keys($indexers) as $indexerId) {
286  $expanded[] = [
287  'indexerId' => $indexerId,
288  'dependencies' => $this->expandDependencies($indexers, $indexerId),
289  ];
290  }
295  $maxIndex = count($expanded) - 1;
296  for ($i = 0; $i < $maxIndex; $i++) {
297  for ($j = $i + 1; $j <= $maxIndex; $j++) {
298  if (in_array($expanded[$j]['indexerId'], $expanded[$i]['dependencies'], true)) {
299  $temp = $expanded[$i];
300  $expanded[$i] = $expanded[$j];
301  $expanded[$j] = $temp;
302  }
303  }
304  }
305 
306  $orderedIndexerIds = array_map(
307  function ($item) {
308  return $item['indexerId'];
309  },
310  $expanded
311  );
312 
313  $result = [];
314  foreach ($orderedIndexerIds as $indexerId) {
315  $result[$indexerId] = $indexers[$indexerId];
316  $result[$indexerId]['dependencies'] = array_values(
317  array_intersect($orderedIndexerIds, $result[$indexerId]['dependencies'] ?? [])
318  );
319  }
320 
321  return $result;
322  }
323 
333  private function expandDependencies(array $list, string $indexerId, array $accumulated = []): array
334  {
335  $accumulated[] = $indexerId;
336  $result = $list[$indexerId]['dependencies'] ?? [];
337  foreach ($result as $relatedIndexerId) {
338  if (in_array($relatedIndexerId, $accumulated)) {
339  throw new ConfigurationMismatchException(
340  new Phrase(
341  "Circular dependency references from '%indexerId' to '%relatedIndexerId'.",
342  [
343  'indexerId' => $indexerId,
344  'relatedIndexerId' => $relatedIndexerId,
345  ]
346  )
347  );
348  }
349  if (!isset($list[$relatedIndexerId])) {
350  throw new ConfigurationMismatchException(
351  new Phrase(
352  "Dependency declaration '%relatedIndexerId' in "
353  . "'%indexerId' to the non-existing indexer.",
354  [
355  'indexerId' => $indexerId,
356  'relatedIndexerId' => $relatedIndexerId,
357  ]
358  )
359  );
360  }
361  $relatedResult = $this->expandDependencies($list, $relatedIndexerId, $accumulated);
362  $result = array_unique(array_merge($result, $relatedResult));
363  }
364  return $result;
365  }
366 }
addVirtualField($fieldset, $field, $data)
Definition: Converter.php:197
convertChild(\DOMElement $childNode, $data)
Definition: Converter.php:75
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$source
Definition: source.php:23
getAttributeValue(\DOMNode $input, $attributeName, $default=null)
Definition: Converter.php:62
$value
Definition: gender.phtml:16
$i
Definition: gallery.phtml:31
convertFieldset(\DOMElement $node, $data)
Definition: Converter.php:109