Как мне установить тему во время запуска cron в коде моего модуля для Drupal 7
Во время запуска cron у меня есть модуль, который будет кэшировать разметку для многих узлов. Моя проблема в том, что во время этого запуска cron любая разметка из функции render не будет проходить через мои хуки тем или шаблоны.
Как выбрать тему из кода моего модуля? Есть ли крюк? Есть ли функция, где я могу указать это?
В конечном счете, я хочу иметь возможность сделать это и получить те же результаты, как если бы я выполнял это на хуке page_build:
render(node_view($node, 'teaser'));
render(node_view($node, 'mini_teaser'));
1 ответ
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;
}
}
Поскольку системный модуль реализует этот хук, если вы реализуете hook_custom_theme()
в модуле, для которого сначала выполняется ловушка (например, короткое имя модуля - custom_module), тогда системный модуль может переопределить тему, установленную вашим модулем.
Как правило, установка глобального $custom_theme
должен получить тот же эффект. Убедитесь, что заданная тема включена.