function drupal_find_theme_functions
Same name in other branches
- 7.x includes/theme.inc \drupal_find_theme_functions()
- 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.