在 cron 运行期间,我有一个模块可以缓存许多节点的标记。我的问题是,在这个 cron 运行期间,来自渲染函数的任何标记都不会通过我的主题挂钩或模板。
从我的模块代码中,如何选择主题?有钩子吗?有没有可以指定的功能?
最终,我希望能够做到这一点并获得与在 page_build 挂钩上运行它相同的结果:
render(node_view($node, 'teaser'));
render(node_view($node, 'mini_teaser'));
在 cron 运行期间,我有一个模块可以缓存许多节点的标记。我的问题是,在这个 cron 运行期间,来自渲染函数的任何标记都不会通过我的主题挂钩或模板。
从我的模块代码中,如何选择主题?有钩子吗?有没有可以指定的功能?
最终,我希望能够做到这一点并获得与在 page_build 挂钩上运行它相同的结果:
render(node_view($node, 'teaser'));
render(node_view($node, 'mini_teaser'));
Drupal 7 有一个钩子,允许模块更改当前启用的主题:hook_custom_theme()。
请注意,用于调用该挂钩的代码如下。(参见menu_get_custom_theme()。)
// First allow modules to dynamically set a custom theme for the current
// page. Since we can only have one, the last module to return a valid
// theme takes precedence.
$custom_themes = array_filter(module_invoke_all('custom_theme'), 'drupal_theme_access');
if (!empty($custom_themes)) {
$custom_theme = array_pop($custom_themes);
}
// If there is a theme callback function for the current page, execute it.
// If this returns a valid theme, it will override any theme that was set
// by a hook_custom_theme() implementation above.
$router_item = menu_get_item();
if (!empty($router_item['access']) && !empty($router_item['theme_callback']) && function_exists($router_item['theme_callback'])) {
$theme_name = call_user_func_array($router_item['theme_callback'], $router_item['theme_arguments']);
if (drupal_theme_access($theme_name)) {
$custom_theme = $theme_name;
}
}
由于 System 模块实现了该钩子,如果您hook_custom_theme()
在首先执行该钩子的模块中实现(例如,模块的短名称是 custom_module),那么 System 模块可以覆盖您的模块设置的主题。
一般来说,设置全局$custom_theme
应该会得到相同的效果。确保正在设置的主题已启用。