Theme.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * Theme data helper
  8. */
  9. namespace Magento\Theme\Helper;
  10. class Theme extends \Magento\Framework\App\Helper\AbstractHelper
  11. {
  12. /**
  13. * Layout merge factory
  14. *
  15. * @var \Magento\Framework\View\Layout\ProcessorFactory
  16. */
  17. protected $_layoutProcessorFactory;
  18. /**
  19. * @var \Magento\Framework\View\Asset\Repository
  20. */
  21. protected $_assetRepo;
  22. /**
  23. * @param \Magento\Framework\App\Helper\Context $context
  24. * @param \Magento\Framework\View\Layout\ProcessorFactory $layoutProcessorFactory
  25. * @param \Magento\Framework\View\Asset\Repository $assetRepo
  26. */
  27. public function __construct(
  28. \Magento\Framework\App\Helper\Context $context,
  29. \Magento\Framework\View\Layout\ProcessorFactory $layoutProcessorFactory,
  30. \Magento\Framework\View\Asset\Repository $assetRepo
  31. ) {
  32. $this->_layoutProcessorFactory = $layoutProcessorFactory;
  33. $this->_assetRepo = $assetRepo;
  34. parent::__construct($context);
  35. }
  36. /**
  37. * Get CSS files of a given theme
  38. *
  39. * Returns an associative array of local assets with FileId used as keys:
  40. * array('Magento_Catalog::widgets.css' => \Magento\Framework\View\Asset\LocalInterface)
  41. * The array will be sorted by keys
  42. *
  43. * @param \Magento\Framework\View\Design\ThemeInterface $theme
  44. * @return \Magento\Framework\View\Asset\LocalInterface[]
  45. */
  46. public function getCssAssets($theme)
  47. {
  48. /** @var $layoutProcessor \Magento\Framework\View\Layout\ProcessorInterface */
  49. $layoutProcessor = $this->_layoutProcessorFactory->create(['theme' => $theme]);
  50. $layoutElement = $layoutProcessor->getFileLayoutUpdatesXml();
  51. /**
  52. * XPath selector to get CSS files from layout added for HEAD block directly
  53. */
  54. $xpathSelectorBlocks = '//block[@class="Magento\Theme\Block\Html\Head"]' .
  55. '/block[@class="Magento\Theme\Block\Html\Head\Css"]/arguments/argument[@name="file"]';
  56. /**
  57. * XPath selector to get CSS files from layout added for HEAD block using reference
  58. */
  59. $xpathSelectorRefs = '//referenceBlock[@name="head"]' .
  60. '/block[@class="Magento\Theme\Block\Html\Head\Css"]/arguments/argument[@name="file"]';
  61. $elements = array_merge(
  62. $layoutElement->xpath($xpathSelectorBlocks) ?: [],
  63. $layoutElement->xpath($xpathSelectorRefs) ?: []
  64. );
  65. $params = [
  66. 'area' => $theme->getArea(),
  67. 'themeModel' => $theme,
  68. ];
  69. $result = [];
  70. foreach ($elements as $fileId) {
  71. $fileId = (string)$fileId;
  72. $result[$fileId] = $this->_assetRepo->createAsset($fileId, $params);
  73. }
  74. ksort($result);
  75. return $result;
  76. }
  77. }