Collection.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Mview\View;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Framework\Indexer\ConfigInterface;
  9. use Magento\Framework\Indexer\IndexerInterface;
  10. class Collection extends \Magento\Framework\Data\Collection implements CollectionInterface
  11. {
  12. /**
  13. * Item object class name
  14. *
  15. * @var string
  16. */
  17. protected $_itemObjectClass = \Magento\Framework\Mview\ViewInterface::class;
  18. /**
  19. * @var \Magento\Framework\Mview\ConfigInterface
  20. */
  21. protected $config;
  22. /**
  23. * @var \Magento\Framework\Mview\View\State\CollectionFactory
  24. */
  25. protected $statesFactory;
  26. /**
  27. * @var ConfigInterface
  28. */
  29. private $indexerConfig;
  30. /**
  31. * @param \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory
  32. * @param \Magento\Framework\Mview\ConfigInterface $config
  33. * @param State\CollectionFactory $statesFactory
  34. * @param ConfigInterface $indexerConfig
  35. */
  36. public function __construct(
  37. \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
  38. \Magento\Framework\Mview\ConfigInterface $config,
  39. \Magento\Framework\Mview\View\State\CollectionFactory $statesFactory,
  40. ConfigInterface $indexerConfig = null
  41. ) {
  42. $this->config = $config;
  43. $this->statesFactory = $statesFactory;
  44. $this->indexerConfig = $indexerConfig ?: ObjectManager::getInstance()->get(ConfigInterface::class);
  45. parent::__construct($entityFactory);
  46. }
  47. /**
  48. * Load data
  49. *
  50. * @param bool $printQuery
  51. * @param bool $logQuery
  52. * @return \Magento\Framework\Mview\View\CollectionInterface
  53. *
  54. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  55. */
  56. public function loadData($printQuery = false, $logQuery = false)
  57. {
  58. if (!$this->isLoaded()) {
  59. $states = $this->statesFactory->create();
  60. foreach ($this->getOrderedViewIds() as $viewId) {
  61. /** @var \Magento\Framework\Mview\ViewInterface $view */
  62. $view = $this->getNewEmptyItem();
  63. $view = $view->load($viewId);
  64. foreach ($states->getItems() as $state) {
  65. /** @var \Magento\Framework\Mview\View\StateInterface $state */
  66. if ($state->getViewId() == $viewId) {
  67. $view->setState($state);
  68. break;
  69. }
  70. }
  71. $this->_addItem($view);
  72. }
  73. $this->_setIsLoaded(true);
  74. }
  75. return $this;
  76. }
  77. /**
  78. * Return the list of ordered view Ids according to dependencies of Indexers.
  79. *
  80. * @return array
  81. */
  82. private function getOrderedViewIds()
  83. {
  84. $orderedViewIds = [];
  85. /** @var IndexerInterface $indexer */
  86. foreach (array_keys($this->indexerConfig->getIndexers()) as $indexerId) {
  87. $indexer = $this->_entityFactory->create(IndexerInterface::class);
  88. $orderedViewIds[] = $indexer->load($indexerId)->getViewId();
  89. }
  90. $orderedViewIds = array_filter($orderedViewIds);
  91. $orderedViewIds += array_diff(array_keys($this->config->getViews()), $orderedViewIds);
  92. return $orderedViewIds;
  93. }
  94. /**
  95. * Return views by given state mode
  96. *
  97. * @param string $mode
  98. * @return \Magento\Framework\Mview\ViewInterface[]
  99. */
  100. public function getViewsByStateMode($mode)
  101. {
  102. $this->load();
  103. $result = [];
  104. foreach ($this as $view) {
  105. /** @var \Magento\Framework\Mview\ViewInterface $view */
  106. if ($view->getState()->getMode() == $mode) {
  107. $result[] = $view;
  108. }
  109. }
  110. return $result;
  111. }
  112. }