ReaderPool.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\View\Layout;
  7. use Magento\Framework\View\Layout;
  8. /**
  9. * Class Pool
  10. */
  11. class ReaderPool implements ReaderInterface
  12. {
  13. /**
  14. * @var array
  15. */
  16. protected $readers;
  17. /**
  18. * @var Layout\ReaderInterface[]
  19. */
  20. protected $nodeReaders = [];
  21. /**
  22. * Object Manager
  23. *
  24. * @var \Magento\Framework\View\Layout\ReaderFactory
  25. */
  26. protected $readerFactory;
  27. /**
  28. * Constructor
  29. *
  30. * @param Layout\ReaderFactory $readerFactory
  31. * @param array $readers
  32. */
  33. public function __construct(
  34. Layout\ReaderFactory $readerFactory,
  35. array $readers = []
  36. ) {
  37. $this->readerFactory = $readerFactory;
  38. $this->readers = $readers;
  39. }
  40. /**
  41. * Add reader to the pool
  42. *
  43. * @param Layout\ReaderInterface $reader
  44. * @return $this
  45. */
  46. public function addReader(Layout\ReaderInterface $reader)
  47. {
  48. foreach ($reader->getSupportedNodes() as $nodeName) {
  49. $this->nodeReaders[$nodeName] = $reader;
  50. }
  51. return $this;
  52. }
  53. /**
  54. * {@inheritdoc}
  55. *
  56. * @return string[]
  57. */
  58. public function getSupportedNodes()
  59. {
  60. return array_keys($this->nodeReaders);
  61. }
  62. /**
  63. * Register supported nodes and readers
  64. *
  65. * @param array $readers
  66. * @return void
  67. */
  68. protected function prepareReader($readers)
  69. {
  70. if (empty($this->nodeReaders)) {
  71. /** @var $reader Layout\ReaderInterface */
  72. foreach ($readers as $readerClass) {
  73. $reader = $this->readerFactory->create($readerClass);
  74. $this->addReader($reader);
  75. }
  76. }
  77. }
  78. /**
  79. * Traverse through all nodes
  80. *
  81. * @param Reader\Context $readerContext
  82. * @param Layout\Element $element
  83. * @return $this
  84. */
  85. public function interpret(Reader\Context $readerContext, Layout\Element $element)
  86. {
  87. $this->prepareReader($this->readers);
  88. /** @var $node Layout\Element */
  89. foreach ($element as $node) {
  90. $nodeName = $node->getName();
  91. if (!isset($this->nodeReaders[$nodeName])) {
  92. continue;
  93. }
  94. /** @var $reader Layout\ReaderInterface */
  95. $reader = $this->nodeReaders[$nodeName];
  96. $reader->interpret($readerContext, $node, $element);
  97. }
  98. return $this;
  99. }
  100. }