Converter.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Mview\Config;
  7. use Magento\Framework\Mview\View\SubscriptionInterface;
  8. class Converter implements \Magento\Framework\Config\ConverterInterface
  9. {
  10. /**
  11. * Convert dom node tree to array
  12. *
  13. * @param \DOMDocument $source
  14. * @return array
  15. * @throws \InvalidArgumentException
  16. */
  17. public function convert($source)
  18. {
  19. $output = [];
  20. $xpath = new \DOMXPath($source);
  21. $views = $xpath->evaluate('/config/view');
  22. /** @var $viewNode \DOMNode */
  23. foreach ($views as $viewNode) {
  24. $data = [];
  25. $viewId = $this->getAttributeValue($viewNode, 'id');
  26. $data['view_id'] = $viewId;
  27. $data['action_class'] = $this->getAttributeValue($viewNode, 'class');
  28. $data['group'] = $this->getAttributeValue($viewNode, 'group');
  29. $data['subscriptions'] = [];
  30. /** @var $childNode \DOMNode */
  31. foreach ($viewNode->childNodes as $childNode) {
  32. if ($childNode->nodeType != XML_ELEMENT_NODE) {
  33. continue;
  34. }
  35. $data = $this->convertChild($childNode, $data);
  36. }
  37. $output[$viewId] = $data;
  38. }
  39. return $output;
  40. }
  41. /**
  42. * Get attribute value
  43. *
  44. * @param \DOMNode $input
  45. * @param string $attributeName
  46. * @param mixed $default
  47. * @return null|string
  48. */
  49. protected function getAttributeValue(\DOMNode $input, $attributeName, $default = null)
  50. {
  51. $node = $input->attributes->getNamedItem($attributeName);
  52. return $node ? $node->nodeValue : $default;
  53. }
  54. /**
  55. * Convert child from dom to array
  56. *
  57. * @param \DOMNode $childNode
  58. * @param array $data
  59. * @return array
  60. */
  61. protected function convertChild(\DOMNode $childNode, $data)
  62. {
  63. switch ($childNode->nodeName) {
  64. case 'subscriptions':
  65. /** @var $subscription \DOMNode */
  66. foreach ($childNode->childNodes as $subscription) {
  67. if ($subscription->nodeType != XML_ELEMENT_NODE || $subscription->nodeName != 'table') {
  68. continue;
  69. }
  70. $name = $this->getAttributeValue($subscription, 'name');
  71. $column = $this->getAttributeValue($subscription, 'entity_column');
  72. $subscriptionModel = $this->getAttributeValue($subscription, 'subscription_model');
  73. if (!empty($subscriptionModel)
  74. && !in_array(
  75. SubscriptionInterface::class,
  76. class_implements(ltrim($subscriptionModel, '\\'))
  77. )
  78. ) {
  79. throw new \InvalidArgumentException(
  80. 'Subscription model must implement ' . SubscriptionInterface::class
  81. );
  82. }
  83. $data['subscriptions'][$name] = [
  84. 'name' => $name,
  85. 'column' => $column,
  86. 'subscription_model' => $subscriptionModel
  87. ];
  88. }
  89. break;
  90. }
  91. return $data;
  92. }
  93. }