Converter.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Paypal\Model\Config\Rules;
  7. use Magento\Framework\Config\ConverterInterface;
  8. /**
  9. * Class Converter
  10. */
  11. class Converter implements ConverterInterface
  12. {
  13. /**
  14. * Convert dom document
  15. *
  16. * @param \DOMDocument $source
  17. * @return array
  18. */
  19. public function convert($source)
  20. {
  21. $result = [];
  22. if ($source->documentElement->hasChildNodes()) {
  23. /** @var \DOMElement $child */
  24. foreach ($source->documentElement->childNodes as $child) {
  25. if ($this->hasNodeElement($child)) {
  26. $id = $child->getAttribute('id');
  27. $result[$id] = [
  28. 'events' => [],
  29. 'relations' => []
  30. ];
  31. /** @var \DOMElement $paymentChild */
  32. foreach ($child->childNodes as $paymentChild) {
  33. switch ($paymentChild->nodeName) {
  34. case 'events':
  35. $selector = $paymentChild->getAttribute('selector');
  36. $result[$id]['events'][$selector] = $this->createEvents($paymentChild);
  37. break;
  38. case 'relation':
  39. $result[$id]['relations'] += $this->createRelation($paymentChild);
  40. break;
  41. }
  42. }
  43. }
  44. }
  45. }
  46. return $result;
  47. }
  48. /**
  49. * Creating events
  50. *
  51. * @param \DOMElement $node
  52. * @return array
  53. */
  54. protected function createEvents(\DOMElement $node)
  55. {
  56. $result = [];
  57. foreach ($node->childNodes as $child) {
  58. /** @var \DOMElement $child */
  59. if ($this->hasNodeElement($child)) {
  60. $result[$child->getAttribute('name')] = [
  61. 'value' => $child->getAttribute('value'),
  62. 'include' => $child->getAttribute('include'),
  63. 'predicate' => $this->createPredicate($child),
  64. ];
  65. }
  66. }
  67. return $result;
  68. }
  69. /**
  70. * Creating configuration for function predicate
  71. *
  72. * @param \DOMElement $node
  73. * @return array
  74. */
  75. protected function createPredicate(\DOMElement $node)
  76. {
  77. $result = [];
  78. foreach ($node->childNodes as $child) {
  79. /** @var \DOMElement $child */
  80. if ($this->hasNodeElement($child)) {
  81. $result = [
  82. 'name' => $child->getAttribute('name'),
  83. 'message' => __($child->getAttribute('message')),
  84. 'event' => $child->getAttribute('event'),
  85. 'argument' => $this->createArgument($child),
  86. ];
  87. }
  88. }
  89. return $result;
  90. }
  91. /**
  92. * Creating relationships
  93. *
  94. * @param \DOMElement $node
  95. * @return array
  96. */
  97. protected function createRelation(\DOMElement $node)
  98. {
  99. $result = [];
  100. foreach ($node->childNodes as $child) {
  101. /** @var \DOMElement $child */
  102. if ($this->hasNodeElement($child)) {
  103. $result[$child->getAttribute('type')][] = [
  104. 'event' => $child->getAttribute('event'),
  105. 'argument' => $this->createArgument($child),
  106. ];
  107. }
  108. }
  109. return [$node->getAttribute('target') => $result];
  110. }
  111. /**
  112. * Create argument
  113. *
  114. * @param \DOMElement $node
  115. * @return array
  116. */
  117. protected function createArgument(\DOMElement $node)
  118. {
  119. $result = [];
  120. foreach ($node->childNodes as $child) {
  121. /** @var \DOMElement $child */
  122. if ($this->hasNodeElement($child)) {
  123. $result[$child->getAttribute('name')] = $child->textContent;
  124. }
  125. }
  126. return $result;
  127. }
  128. /**
  129. * Check whether the node has DOMElement
  130. *
  131. * @param \DOMNode $node
  132. * @return bool
  133. */
  134. protected function hasNodeElement(\DOMNode $node)
  135. {
  136. switch ($node->nodeType) {
  137. case XML_TEXT_NODE:
  138. case XML_COMMENT_NODE:
  139. case XML_CDATA_SECTION_NODE:
  140. return false;
  141. }
  142. return true;
  143. }
  144. }