class JsCollectionGrouper

Same name in other branches
  1. 9 core/lib/Drupal/Core/Asset/JsCollectionGrouper.php \Drupal\Core\Asset\JsCollectionGrouper
  2. 8.9.x core/lib/Drupal/Core/Asset/JsCollectionGrouper.php \Drupal\Core\Asset\JsCollectionGrouper
  3. 11.x core/lib/Drupal/Core/Asset/JsCollectionGrouper.php \Drupal\Core\Asset\JsCollectionGrouper

Groups JavaScript assets.

Hierarchy

Expanded class hierarchy of JsCollectionGrouper

1 string reference to 'JsCollectionGrouper'
core.services.yml in core/core.services.yml
core/core.services.yml
1 service uses JsCollectionGrouper
asset.js.collection_grouper in core/core.services.yml
Drupal\Core\Asset\JsCollectionGrouper

File

core/lib/Drupal/Core/Asset/JsCollectionGrouper.php, line 8

Namespace

Drupal\Core\Asset
View source
class JsCollectionGrouper implements AssetCollectionGrouperInterface {
    
    /**
     * {@inheritdoc}
     *
     * Puts multiple items into the same group if they are groupable. Items of
     * the 'file' type are groupable if their 'preprocess' flag is TRUE. Items of
     * the 'external' type are not groupable.
     *
     * Also ensures that the process of grouping items does not change their
     * relative order. This requirement may result in multiple groups for the same
     * type, if needed to accommodate other items in between.
     */
    public function group(array $js_assets) {
        $groups = [];
        // If a group can contain multiple items, we track the information that must
        // be the same for each item in the group, so that when we iterate the next
        // item, we can determine if it can be put into the current group, or if a
        // new group needs to be made for it.
        $current_group_keys = NULL;
        $index = -1;
        foreach ($js_assets as $item) {
            switch ($item['type']) {
                case 'file':
                    // Group file items if their 'preprocess' flag is TRUE.
                    // Help ensure maximum reuse of aggregate files by only grouping
                    // together items that share the same 'group' value.
                    $group_keys = $item['preprocess'] ? [
                        $item['type'],
                        $item['group'],
                    ] : FALSE;
                    break;
                case 'external':
                    // Do not group external items.
                    $group_keys = FALSE;
                    break;
            }
            // If the group keys don't match the most recent group we're working with,
            // then a new group must be made.
            if ($group_keys !== $current_group_keys) {
                $index++;
                // Initialize the new group with the same properties as the first item
                // being placed into it. The item's 'data' and 'weight' properties are
                // unique to the item and should not be carried over to the group.
                $groups[$index] = $item;
                unset($groups[$index]['data'], $groups[$index]['weight']);
                $groups[$index]['items'] = [];
                $current_group_keys = $group_keys ? $group_keys : NULL;
            }
            // Add the item to the current group.
            $groups[$index]['items'][] = $item;
        }
        return $groups;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
JsCollectionGrouper::group public function Puts multiple items into the same group if they are groupable. Items of
the 'file' type are groupable if their 'preprocess' flag is TRUE. Items of
the 'external' type are not groupable.
Overrides AssetCollectionGrouperInterface::group

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.