base_themes)) { foreach (array_keys($theme->base_themes) as $base) { $base_theme[$base] = clone $themes[$base]; } } if (isset($theme->base_theme) && !isset($base_theme[$theme->base_theme])) { $base_theme[$theme->base_theme] = clone $themes[$theme->base_theme]; } if (isset($theme->engine)) { $theme_engine = $theme->engine; } // Include template files to let _theme_load_registry add preprocess // functions. foreach ($base_theme as $base) { include_once drupal_get_path('theme', $base->name) . '/template.php'; } include_once drupal_get_path('theme', $theme->name) . '/template.php'; // Get the theme_registry cache. $cache = _theme_load_registry($theme, $base_theme, $theme_engine); // Change the registry for hooks with a 'mail theme' element. foreach ($theme_registry as $name => $hook) { if (!empty($hook['mail theme'])) { if (isset($cache[$name])) { $cache[$name]['includes'][] = drupal_get_path('theme', $theme->name) . '/template.php'; foreach ($base_theme as $base) { $cache[$name]['includes'][] = drupal_get_path('theme', $base->name) . '/template.php'; } // Change the current registry for the new record. $theme_registry[$name] = $cache[$name]; } // Look for template suggestions. foreach ($cache as $cache_name => $cache_hook) { if (strpos($cache_name, $name . '__') !== FALSE) { $cache_hook['includes'][] = drupal_get_path('theme', $theme->name) . '/template.php'; foreach ($base_theme as $base) { $cache_hook['includes'][] = drupal_get_path('theme', $base->name) . '/template.php'; } // Change the current registry for the new record. $theme_registry[$cache_name] = $cache_hook; } } } } // Swap back to the original theme. mailsystem_theme_swap_theme($old_theme); } } } $recursion_prevention = FALSE; } /** * Helper to swap themes safely for use by mailsystem_theme_theme_registry_alter(). */ function mailsystem_theme_swap_theme($new_theme) { // Make sure the theme exists. $themes = list_themes(); if (empty($themes[$new_theme])) { return; } // Both theme/theme_key are set to the new theme. global $theme, $theme_key; $theme = $theme_key = $new_theme; // Create the base_theme_info. global $base_theme_info; $base_theme = array(); $ancestor = $theme; while ($ancestor && isset($themes[$ancestor]->base_theme)) { $ancestor = $themes[$ancestor]->base_theme; $base_theme[] = $themes[$ancestor]; } $base_theme_info = array_reverse($base_theme); // Some other theme related globals. global $theme_engine, $theme_info, $theme_path; $theme_engine = $themes[$theme]->engine; $theme_info = $themes[$theme]; $theme_path = dirname($themes[$theme]->filename); // We need to reset the drupal_alter and module_implements statics. drupal_static_reset('drupal_alter'); drupal_static_reset('module_implements'); }