| 7 theme.inc | drupal_find_theme_templates($cache, $extension, $path) |
| 6 theme.inc | drupal_find_theme_templates($cache, $extension, $path) |
| 8 theme.inc | drupal_find_theme_templates($cache, $extension, $path) |
Allows themes and/or theme engines to easily discover overridden templates.
Parameters
$cache: The existing cache of theme hooks to test against.
$extension: The extension that these templates will have.
$path: The path to search.
1 call to drupal_find_theme_templates()
- phptemplate_theme in themes/
engines/ phptemplate/ phptemplate.engine - Implements hook_theme().
File
- includes/
theme.inc, line 1284 - The theme system, which controls the output of Drupal.
Code
function drupal_find_theme_templates($cache, $extension, $path) {
$implementations = array();
// Collect paths to all sub-themes grouped by base themes. These will be
// used for filtering. This allows base themes to have sub-themes in its
// folder hierarchy without affecting the base themes template discovery.
$theme_paths = array();
foreach (list_themes() as $theme_info) {
if (!empty($theme_info->base_theme)) {
$theme_paths[$theme_info->base_theme][$theme_info->name] = dirname($theme_info->filename);
}
}
foreach ($theme_paths as $basetheme => $subthemes) {
foreach ($subthemes as $subtheme => $subtheme_path) {
if (isset($theme_paths[$subtheme])) {
$theme_paths[$basetheme] = array_merge($theme_paths[$basetheme], $theme_paths[$subtheme]);
}
}
}
global $theme;
$subtheme_paths = isset($theme_paths[$theme]) ? $theme_paths[$theme] : array();
// Escape the periods in the extension.
$regex = '/' . str_replace('.', '\.', $extension) . '$/';
// Get a listing of all template files in the path to search.
$files = drupal_system_listing($regex, $path, 'name', 0);
// Find templates that implement registered theme hooks and include that in
// what is returned so that the registry knows that the theme has this
// implementation.
foreach ($files as $template => $file) {
// Ignore sub-theme templates for the current theme.
if (strpos($file->uri, str_replace($subtheme_paths, '', $file->uri)) !== 0) {
continue;
}
// Chop off the remaining extensions if there are any. $template already
// has the rightmost extension removed, but there might still be more,
// such as with .tpl.php, which still has .tpl in $template at this point.
if (($pos = strpos($template, '.')) !== FALSE) {
$template = substr($template, 0, $pos);
}
// Transform - in filenames to _ to match function naming scheme
// for the purposes of searching.
$hook = strtr($template, '-', '_');
if (isset($cache[$hook])) {
$implementations[$hook] = array(
'template' => $template,
'path' => dirname($file->uri),
);
}
}
// Find templates that implement possible "suggestion" variants of registered
// theme hooks and add those as new registered theme hooks. See
// drupal_find_theme_functions() for more information about suggestions and
// the use of 'pattern' and 'base hook'.
$patterns = array_keys($files);
foreach ($cache as $hook => $info) {
$pattern = isset($info['pattern']) ? $info['pattern'] : ($hook . '__');
if (!isset($info['base hook']) && !empty($pattern)) {
// Transform _ in pattern to - to match file naming scheme
// for the purposes of searching.
$pattern = strtr($pattern, '_', '-');
$matches = preg_grep('/^' . $pattern . '/', $patterns);
if ($matches) {
foreach ($matches as $match) {
$file = substr($match, 0, strpos($match, '.'));
// Put the underscores back in for the hook name and register this
// pattern.
$arg_name = isset($info['variables']) ? 'variables' : 'render element';
$implementations[strtr($file, '-', '_')] = array(
'template' => $file,
'path' => dirname($files[$match]->uri),
$arg_name => $info[$arg_name],
'base hook' => $hook,
);
}
}
}
}
return $implementations;
}
Comments
doesn't work if template engine has single dot in extension
PermalinkIf template extension is simple (e.g. smarty engine has just '.tpl') "suggestion" returned whith empty key ...
in this case this function needs to be corrected:
instead of line:
$file = substr($match, 0, strpos($match, '.'));
I placed:
$file = (($pos = strpos($match, '.')) !== FALSE) ? substr($match, 0, strpos($match, '.')) : $match;