Как правильно изменить активную тему Drupal программно?
Как правильно изменить активную тему Drupal программно?
Ответы:
Drupal 6 решение:
Вы хотите убедиться, что вы изменили глобальную $custom_theme
переменную довольно рано при выполнении страницы.
global $custom_theme;
$custom_theme = 'garland';
$custom_theme
определяется? достаточно ли этого для смены темы?
hook_custom_theme
упомяните api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Я знаю, что вы спросили, как это сделать программно, но если это ваше решение, а не реальная проблема, вы также можете использовать модуль ThemeKey . Это позволяет вам устанавливать условия, которые, при соблюдении, меняют тему. Вы можете создавать условия, основанные на путях, таксономии, типе контента, дате создания или редактирования и многом другом. Вы также можете добавить в модуль модуля Themekey Properties, чтобы получить еще больше возможностей.
Опять же, я знаю, что это не программно, но я не уверен, что реальный вопрос, стоящий за вашим вопросом, заключается в том, как менять темы в зависимости от условий.
Лучший способ сделать это - создать хук обновления в модуле:
function yourmodule_update_N() {
variable_set('theme_default','yourtheme');
}
drush vset theme_default garland
drush vset admin_theme garland
drush cc all
Основы изменения темы по умолчанию и темы администрирования:
// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);
Вот небольшая функция для безопасного возврата тем к темам по умолчанию на Drupal, таким как Bartik или Garland (протестировано в Drupal 6 и 7):
/**
* Set the active Drupal themes (the default and the administration theme) to default ones.
* Tested in Drupal 6, 7 (but possibly working in version 8 too according to the documentations [some similarities between 7 and 8]).
*/
function TESTMODULE_set_active_theme_to_default($affect_admin_theme = TRUE) {
// Provides a list of currently available themes.
$list_themes = list_themes(TRUE);
// 6, 7, 8, etc.
$major_version = (int)VERSION;
$theme_default = isset($list_themes['bartik']) ? 'bartik' : 'garland';
$admin_theme = isset($list_themes['seven']) ? 'seven' : 'garland';
// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland if argument is TRUE
if($affect_admin_theme){
variable_set('admin_theme', $admin_theme);
}
// if Switchtheme module (https://drupal.org/project/switchtheme) is enabled, use it
if (module_exists('switchtheme')) {
if (empty($_GET['theme']) || $_GET['theme'] !== $theme_default) {
$query = array(
'theme' => $theme_default
);
// in D6, drupal_goto's second argument is the query string,
// in >=D7, a more general $options array is used
if($major_version < 7){
$options = $query;
}
else{
$options = array('query' => $query);
}
drupal_goto($_GET['q'], $options);
}
}
drupal_set_message(t('Default theme has been changed to %theme_default, administration theme has been changed to %admin_theme.', array(
'%theme_default' => $theme_default,
'%admin_theme' => $admin_theme
)));
}
Вы можете вызвать это в реализации hook_init () (закомментируйте, когда это не нужно):
/**
* Implements hook_init()
*/
function TESTMODULE_init() {
// ATTENTION! Comment out the following line if it's not needed anymore!
TESTMODULE_set_active_theme_to_default();
}
variable_set('theme_default','yourtheme');
В Drupal 7 используйте hook_custom_theme()
:
/**
* Implements hook_custom_theme()
* Switch theme for a mobile browser
* @return string The theme to use
*/
function mymodule_custom_theme() {
//dpm($_SERVER['HTTP_USER_AGENT']);
$theme = 'bartik'; // core theme, used as fallback
$themes_available = list_themes(); // get available themes
if (preg_match("/Mobile|Android|BlackBerry|iPhone|Windows Phone/", $_SERVER['HTTP_USER_AGENT'])) {
if (array_key_exists('custommobiletheme', $themes_available)) $theme = 'custommobiletheme';
else { drupal_set_message("Unable to switch to mobile theme, because it is not installed.", 'warning'); }
}
else if (array_key_exists('nonmobiletheme', $themes_available)) $theme = 'nonmobiletheme';
// else, fall back to bartik
return $theme;
}
Адаптировано из <emoticode />
Возвратите машиночитаемое имя темы для использования на текущей странице.
Возможно, стоит прочитать комментарии к этой функции:
Этот хук может использоваться для динамической установки темы для текущего запроса страницы. Он должен использоваться модулями, которым необходимо переопределить тему в зависимости от динамических условий (например, модуль, который позволяет устанавливать тему в зависимости от роли текущего пользователя). Возвращаемое значение этой ловушки будет использоваться на всех страницах, кроме тех, которые имеют допустимую тему для каждой страницы или для раздела, установленную с помощью функции обратного вызова темы в hook_menu (); темы на этих страницах могут быть переопределены только с помощью hook_menu_alter ().
Обратите внимание, что возврат разных тем для одного и того же пути может не работать с кэшированием страниц. Это, скорее всего, будет проблемой, если анонимный пользователь по заданному пути может получить разные темы, возвращенные при разных условиях.
Поскольку одновременно может использоваться только одна тема, последний (т. Е. С наибольшим весом) модуль, который возвращает действительное имя темы из этой ловушки, будет иметь преимущественную силу.