function drupal_find_theme_functions

Same name and namespace in other branches
  1. 7.x includes/theme.inc \drupal_find_theme_functions()
  2. 8.9.x core/includes/theme.inc \drupal_find_theme_functions()

Allows themes and/or theme engines to discover overridden theme functions.

@internal only exists to support discovery of deprecated theme functions, will be removed in Drupal 10.0.0.

Parameters

array $cache: The existing cache of theme hooks to test against.

array $prefixes: An array of prefixes to test, in reverse order of importance.

Return value

array The functions found, suitable for returning from hook_theme;

2 calls to drupal_find_theme_functions()
nyan_cat_theme in core/modules/system/tests/themes/engines/nyan_cat/nyan_cat.engine
Implements hook_theme().
twig_theme in core/themes/engines/twig/twig.engine
Implements hook_theme().

File

core/includes/theme.inc, line 140

Code

function drupal_find_theme_functions($cache, $prefixes) {
    $implementations = [];
    $grouped_functions = \Drupal::service('theme.registry')->getPrefixGroupedUserFunctions($prefixes);
    foreach ($cache as $hook => $info) {
        foreach ($prefixes as $prefix) {
            // Find theme functions that implement possible "suggestion" variants of
            // registered theme hooks and add those as new registered theme hooks.
            // The 'pattern' key defines a common prefix that all suggestions must
            // start with. The default is the name of the hook followed by '__'. A
            // 'base hook' key is added to each entry made for a found suggestion,
            // so that common functionality can be implemented for all suggestions of
            // the same base hook. To keep things simple, deep hierarchy of
            // suggestions is not supported: each suggestion's 'base hook' key
            // refers to a base hook, not to another suggestion, and all suggestions
            // are found using the base hook's pattern, not a pattern from an
            // intermediary suggestion.
            $pattern = $info['pattern'] ?? $hook . '__';
            // Grep only the functions which are within the prefix group.
            [
                $first_prefix,
            ] = explode('_', $prefix, 2);
            if (!isset($info['base hook']) && !empty($pattern) && isset($grouped_functions[$first_prefix])) {
                $matches = preg_grep('/^' . $prefix . '_' . $pattern . '/', $grouped_functions[$first_prefix]);
                if ($matches) {
                    foreach ($matches as $match) {
                        $new_hook = substr($match, strlen($prefix) + 1);
                        $arg_name = isset($info['variables']) ? 'variables' : 'render element';
                        $implementations[$new_hook] = [
                            'function' => $match,
                            $arg_name => $info[$arg_name],
                            'base hook' => $hook,
                        ];
                    }
                }
            }
            // Find theme functions that implement registered theme hooks and include
            // that in what is returned so that the registry knows that the theme has
            // this implementation.
            if (function_exists($prefix . '_' . $hook)) {
                $implementations[$hook] = [
                    'function' => $prefix . '_' . $hook,
                ];
            }
        }
    }
    return $implementations;
}

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