WebsiteDimensionProvider.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Store\Model\Indexer;
  8. use Magento\Framework\Indexer\Dimension;
  9. use Magento\Store\Model\ResourceModel\Website\CollectionFactory as WebsiteCollectionFactory;
  10. use Magento\Framework\Indexer\DimensionFactory;
  11. use Magento\Framework\Indexer\DimensionProviderInterface;
  12. use Magento\Store\Model\Store;
  13. class WebsiteDimensionProvider implements DimensionProviderInterface
  14. {
  15. /**
  16. * Name for website dimension for multidimensional indexer
  17. * 'ws' - stands for 'website_store'
  18. */
  19. const DIMENSION_NAME = 'ws';
  20. /**
  21. * @var WebsiteCollectionFactory
  22. */
  23. private $collectionFactory;
  24. /**
  25. * @var \SplFixedArray
  26. */
  27. private $websitesDataIterator;
  28. /**
  29. * @var DimensionFactory
  30. */
  31. private $dimensionFactory;
  32. /**
  33. * @param WebsiteCollectionFactory $collectionFactory
  34. * @param DimensionFactory $dimensionFactory
  35. */
  36. public function __construct(WebsiteCollectionFactory $collectionFactory, DimensionFactory $dimensionFactory)
  37. {
  38. $this->dimensionFactory = $dimensionFactory;
  39. $this->collectionFactory = $collectionFactory;
  40. }
  41. /**
  42. * @return Dimension[]|\Traversable
  43. */
  44. public function getIterator(): \Traversable
  45. {
  46. foreach ($this->getWebsites() as $website) {
  47. yield $this->dimensionFactory->create(self::DIMENSION_NAME, (string)$website);
  48. }
  49. }
  50. /**
  51. * @return array
  52. */
  53. private function getWebsites(): array
  54. {
  55. if ($this->websitesDataIterator === null) {
  56. $websites = $this->collectionFactory->create()
  57. ->addFieldToFilter('code', ['neq' => Store::ADMIN_CODE])
  58. ->getAllIds();
  59. $this->websitesDataIterator = is_array($websites) ? $websites : [];
  60. }
  61. return $this->websitesDataIterator;
  62. }
  63. }