如何在我的Drupal 7模块代码中的cron运行期间设置主题

时间:2013-01-10 17:45:56

标签: drupal drupal-7 drupal-theming drupal-hooks drupal-render

在cron运行期间,我有一个模块可以缓存许多节点的标记。我的问题是,在此cron运行期间,渲染函数中的任何标记都不会通过我的主题钩子或模板。

从我的模块代码中,如何选择主题?有钩子吗?有没有我可以指定它的功能?

最终,我希望能够做到这一点并获得相同的结果,就像我在page_build hook上运行它一样:

render(node_view($node, 'teaser'));
render(node_view($node, 'mini_teaser'));

1 个答案:

答案 0 :(得分:0)

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应该会产生相同的效果。确保已启用正在设置的主题。