protected Registry::postProcessExtension(array &$cache, ActiveTheme $theme)
Completes the theme registry adding discovered functions and hooks.
Parameters
array $cache: The theme registry as documented in \Drupal\Core\Theme\Registry::processExtension().
\Drupal\Core\Theme\ActiveTheme $theme: Current active theme.
See also
::processExtension()
File
- core/lib/Drupal/Core/Theme/Registry.php, line 635
Class
- Registry
- Defines the theme registry service.
Namespace
Drupal\Core\Theme
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 71 72 73 74 75 76 77 78 79 80 81 82 | protected function postProcessExtension( array & $cache , ActiveTheme $theme ) { $grouped_functions = $this ->getPrefixGroupedUserFunctions(); // Gather prefixes. This will be used to limit the found functions to the // expected naming conventions. $prefixes = array_keys (( array ) $this ->moduleHandler->getModuleList()); foreach ( array_reverse ( $theme ->getBaseThemes()) as $base ) { $prefixes [] = $base ->getName(); } if ( $theme ->getEngine()) { $prefixes [] = $theme ->getEngine() . '_engine' ; } $prefixes [] = $theme ->getName(); // Collect all variable preprocess functions in the correct order. $suggestion_level = []; $matches = []; // Look for functions named according to the pattern and add them if they // have matching hooks in the registry. foreach ( $prefixes as $prefix ) { // Grep only the functions which are within the prefix group. list( $first_prefix , ) = explode ( '_' , $prefix , 2); if (!isset( $grouped_functions [ $first_prefix ])) { continue ; } // Add the function and the name of the associated theme hook to the list // of preprocess functions grouped by suggestion specificity if a matching // base hook is found. foreach ( $grouped_functions [ $first_prefix ] as $candidate ) { if (preg_match( "/^{$prefix}_preprocess_(((?:[^_]++|_(?!_))+)__.*)/" , $candidate , $matches )) { if (isset( $cache [ $matches [2]])) { $level = substr_count( $matches [1], '__' ); $suggestion_level [ $level ][ $candidate ] = $matches [1]; } } } } // Add missing variable preprocessors. This is needed for modules that do // not explicitly register the hook. For example, when a theme contains a // variable preprocess function but it does not implement a template, it // will go missing. This will add the expected function. It also allows // modules or themes to have a variable process function based on a pattern // even if the hook does not exist. ksort( $suggestion_level ); foreach ( $suggestion_level as $level => $item ) { foreach ( $item as $preprocessor => $hook ) { if (isset( $cache [ $hook ][ 'preprocess functions' ]) && !in_array( $hook , $cache [ $hook ][ 'preprocess functions' ])) { // Add missing preprocessor to existing hook. $cache [ $hook ][ 'preprocess functions' ][] = $preprocessor ; } elseif (!isset( $cache [ $hook ]) && strpos ( $hook , '__' )) { // Process non-existing hook and register it. // Look for a previously defined hook that is either a less specific // suggestion hook or the base hook. $this ->completeSuggestion( $hook , $cache ); $cache [ $hook ][ 'preprocess functions' ][] = $preprocessor ; } } } // Inherit all base hook variable preprocess functions into suggestion // hooks. This ensures that derivative hooks have a complete set of variable // preprocess functions. foreach ( $cache as $hook => $info ) { // The 'base hook' is only applied to derivative hooks already registered // from a pattern. This is typically set from // drupal_find_theme_functions() and drupal_find_theme_templates(). if (isset( $info [ 'incomplete preprocess functions' ])) { $this ->completeSuggestion( $hook , $cache ); unset( $cache [ $hook ][ 'incomplete preprocess functions' ]); } // Optimize the registry. if (isset( $cache [ $hook ][ 'preprocess functions' ]) && empty ( $cache [ $hook ][ 'preprocess functions' ])) { unset( $cache [ $hook ][ 'preprocess functions' ]); } // Ensure uniqueness. if (isset( $cache [ $hook ][ 'preprocess functions' ])) { $cache [ $hook ][ 'preprocess functions' ] = array_unique ( $cache [ $hook ][ 'preprocess functions' ]); } } } |
Please login to continue.