AssetResolver::getCssAssets

public AssetResolver::getCssAssets(AttachedAssetsInterface $assets, $optimize)

Returns the CSS assets for the current response's libraries.

It returns the CSS assets in order, according to the SMACSS categories specified in the assets' weights:

This ensures proper cascading of styles so themes can easily override module styles through CSS selectors.

Themes may replace module-defined CSS files by adding a stylesheet with the same filename. For example, themes/bartik/system-menus.css would replace modules/system/system-menus.css. This allows themes to override complete CSS files, rather than specific selectors, when necessary.

Also invokes hook_css_alter(), to allow CSS assets to be altered.

Parameters

\Drupal\Core\Asset\AttachedAssetsInterface $assets: The assets attached to the current response.

bool $optimize: Whether to apply the CSS asset collection optimizer, to return an optimized CSS asset collection rather than an unoptimized one.

Return value

array A (possibly optimized) collection of CSS assets.

Overrides AssetResolverInterface::getCssAssets

See also

https://www.drupal.org/node/1887918#separate-concerns

File

core/lib/Drupal/Core/Asset/AssetResolver.php, line 112

Class

AssetResolver
The default asset resolver.

Namespace

Drupal\Core\Asset

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public function getCssAssets(AttachedAssetsInterface $assets, $optimize) {
  $theme_info = $this->themeManager->getActiveTheme();
  // Add the theme name to the cache key since themes may implement
  // hook_library_info_alter().
  $libraries_to_load = $this->getLibrariesToLoad($assets);
  $cid = 'css:' . $theme_info->getName() . ':' . Crypt::hashBase64(serialize($libraries_to_load)) . (int) $optimize;
  if ($cached = $this->cache->get($cid)) {
    return $cached->data;
  }
 
  $css = [];
  $default_options = [
    'type' => 'file',
    'group' => CSS_AGGREGATE_DEFAULT,
    'weight' => 0,
    'media' => 'all',
    'preprocess' => TRUE,
    'browsers' => [],
  ];
 
  foreach ($libraries_to_load as $library) {
    list($extension, $name) = explode('/', $library, 2);
    $definition = $this->libraryDiscovery->getLibraryByName($extension, $name);
    if (isset($definition['css'])) {
      foreach ($definition['css'] as $options) {
        $options += $default_options;
        $options['browsers'] += [
          'IE' => TRUE,
          '!IE' => TRUE,
        ];
 
        // Files with a query string cannot be preprocessed.
        if ($options['type'] === 'file' && $options['preprocess'] && strpos($options['data'], '?') !== FALSE) {
          $options['preprocess'] = FALSE;
        }
 
        // Always add a tiny value to the weight, to conserve the insertion
        // order.
        $options['weight'] += count($css) / 1000;
 
        // CSS files are being keyed by the full path.
        $css[$options['data']] = $options;
      }
    }
  }
 
  // Allow modules and themes to alter the CSS assets.
  $this->moduleHandler->alter('css', $css, $assets);
  $this->themeManager->alter('css', $css, $assets);
 
  // Sort CSS items, so that they appear in the correct order.
  uasort($css, 'static::sort');
 
  // Allow themes to remove CSS files by CSS files full path and file name.
  // @todo Remove in Drupal 9.0.x.
  if ($stylesheet_remove = $theme_info->getStyleSheetsRemove()) {
    foreach ($css as $key => $options) {
      if (isset($stylesheet_remove[$key])) {
        unset($css[$key]);
      }
    }
  }
 
  if ($optimize) {
    $css = \Drupal::service('asset.css.collection_optimizer')->optimize($css);
  }
  $this->cache->set($cid, $css, CacheBackendInterface::CACHE_PERMANENT, ['library_info']);
 
  return $css;
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.