Converter.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Search\Request\Config;
  7. /**
  8. * Search Request xml converter
  9. */
  10. class Converter implements \Magento\Framework\Config\ConverterInterface
  11. {
  12. /**
  13. * Convert config
  14. *
  15. * @param \DOMDocument $source
  16. * @return array
  17. */
  18. public function convert($source)
  19. {
  20. /** @var \DOMNodeList $requestNodes */
  21. $requestNodes = $source->getElementsByTagName('request');
  22. $requests = [];
  23. foreach ($requestNodes as $requestNode) {
  24. $simpleXmlNode = simplexml_import_dom($requestNode);
  25. /** @var \DOMElement $requestNode */
  26. $name = $requestNode->getAttribute('query');
  27. $request = $this->mergeAttributes((array)$simpleXmlNode);
  28. $request['dimensions'] = $this->convertNodes($simpleXmlNode->dimensions, 'name');
  29. $request['queries'] = $this->convertNodes($simpleXmlNode->queries, 'name');
  30. $request['filters'] = $this->convertNodes($simpleXmlNode->filters, 'name');
  31. $request['aggregations'] = $this->convertNodes($simpleXmlNode->aggregations, 'name');
  32. $requests[$name] = $request;
  33. }
  34. return $requests;
  35. }
  36. /**
  37. * Merge attributes in node data
  38. *
  39. * @param array $data
  40. * @return array
  41. */
  42. protected function mergeAttributes($data)
  43. {
  44. if (isset($data['@attributes'])) {
  45. $data = array_merge($data, $data['@attributes']);
  46. unset($data['@attributes']);
  47. }
  48. return $data;
  49. }
  50. /**
  51. * Convert nodes to array
  52. *
  53. * @param \SimpleXMLElement $nodes
  54. * @param string $name
  55. * @return array
  56. */
  57. protected function convertNodes(\SimpleXMLElement $nodes, $name)
  58. {
  59. $list = [];
  60. if (!empty($nodes)) {
  61. /** @var \SimpleXMLElement $node */
  62. foreach ($nodes->children() as $node) {
  63. $element = $this->convertToArray($node->attributes());
  64. if ($node->count() > 0) {
  65. $element = $this->convertChildNodes($element, $node);
  66. }
  67. $type = (string)$node->attributes('xsi', true)['type'];
  68. if (!empty($type)) {
  69. $element['type'] = $type;
  70. }
  71. $list[$element[$name]] = $element;
  72. }
  73. }
  74. return $list;
  75. }
  76. /**
  77. * Deep converting simlexml element to array
  78. *
  79. * @param \SimpleXMLElement $node
  80. * @return array
  81. */
  82. protected function convertToArray(\SimpleXMLElement $node)
  83. {
  84. return $this->mergeAttributes(json_decode(json_encode($node), true));
  85. }
  86. /**
  87. * Convert child nodes to array
  88. *
  89. * @param array $element
  90. * @param \SimpleXMLElement $node
  91. * @return array
  92. */
  93. protected function convertChildNodes(array $element, \SimpleXMLElement $node)
  94. {
  95. if ($node->count() == 0) {
  96. $element[$node->getName()][] = $this->convertToArray($node);
  97. } else {
  98. foreach ($node->children() as $child) {
  99. $element = $this->convertChildNodes($element, $child);
  100. }
  101. }
  102. return $element;
  103. }
  104. }