ThemeModular.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\View\File\Collector;
  7. use Magento\Framework\Component\ComponentRegistrar;
  8. use Magento\Framework\Component\ComponentRegistrarInterface;
  9. use Magento\Framework\Filesystem\Directory\ReadFactory;
  10. use Magento\Framework\View\Design\ThemeInterface;
  11. use Magento\Framework\View\File\CollectorInterface;
  12. use Magento\Framework\View\File\Factory as FileFactory;
  13. use Magento\Framework\View\Helper\PathPattern;
  14. /**
  15. * Source of modular view files introduced by a theme
  16. */
  17. class ThemeModular implements CollectorInterface
  18. {
  19. /**
  20. * @var PathPattern
  21. */
  22. private $pathPatternHelper;
  23. /**
  24. * @var FileFactory
  25. */
  26. private $fileFactory;
  27. /**
  28. * @var ReadFactory
  29. */
  30. private $readDirFactory;
  31. /**
  32. * @var ComponentRegistrarInterface
  33. */
  34. private $componentRegistrar;
  35. /**
  36. * @var string
  37. */
  38. private $subDir;
  39. /**
  40. * Constructor
  41. *
  42. * @param FileFactory $fileFactory
  43. * @param ReadFactory $readDirFactory
  44. * @param ComponentRegistrarInterface $componentRegistrar
  45. * @param PathPattern $pathPatternHelper
  46. * @param string $subDir
  47. */
  48. public function __construct(
  49. FileFactory $fileFactory,
  50. ReadFactory $readDirFactory,
  51. ComponentRegistrarInterface $componentRegistrar,
  52. PathPattern $pathPatternHelper,
  53. $subDir = ''
  54. ) {
  55. $this->pathPatternHelper = $pathPatternHelper;
  56. $this->fileFactory = $fileFactory;
  57. $this->readDirFactory = $readDirFactory;
  58. $this->componentRegistrar = $componentRegistrar;
  59. $this->subDir = $subDir ? $subDir . '/' : '';
  60. }
  61. /**
  62. * Retrieve files
  63. *
  64. * @param \Magento\Framework\View\Design\ThemeInterface $theme
  65. * @param string $filePath
  66. * @return \Magento\Framework\View\File[]
  67. */
  68. public function getFiles(ThemeInterface $theme, $filePath)
  69. {
  70. $namespace = $module = '*';
  71. $themePath = $theme->getFullPath();
  72. if (empty($themePath)) {
  73. return [];
  74. }
  75. $themeAbsolutePath = $this->componentRegistrar->getPath(ComponentRegistrar::THEME, $themePath);
  76. if (!$themeAbsolutePath) {
  77. return [];
  78. }
  79. $themeDir = $this->readDirFactory->create($themeAbsolutePath);
  80. $files = $themeDir->search("{$namespace}_{$module}/{$this->subDir}$filePath");
  81. $result = [];
  82. $pattern = "#/(?<moduleName>[^/]+)/{$this->subDir}"
  83. . $this->pathPatternHelper->translatePatternFromGlob($filePath) . "$#i";
  84. foreach ($files as $file) {
  85. $filename = $themeDir->getAbsolutePath($file);
  86. if (!preg_match($pattern, $filename, $matches)) {
  87. continue;
  88. }
  89. $result[] = $this->fileFactory->create($filename, $matches['moduleName'], $theme);
  90. }
  91. return $result;
  92. }
  93. }