Який правильний спосіб змінити активну тему Drupal програмно?
Який правильний спосіб змінити активну тему Drupal програмно?
Відповіді:
Рішення Drupal 6:
Ви хочете переконатися, що ви $custom_theme
досить швидко змінили глобальну змінну на початку виконання сторінки.
global $custom_theme;
$custom_theme = 'garland';
$custom_theme
визначено? чи достатньо для зміни теми?
hook_custom_theme
Згадайте,
Я знаю, що ви запитали, як це зробити програмно, але якщо це ваше рішення, а не справжня проблема, ви також можете використовувати модуль 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
)));
}
Ви можете зателефонувати йому у впровадженні куки_ініт () (коментуйте це після того, як це не потрібно):
/**
* 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;
}
Адаптовано з <емотикода />
Поверніть машиночитану назву теми для використання на поточній сторінці.
Коментарі до цієї функції, можливо, варто прочитати:
Цей гачок можна використовувати для динамічного встановлення теми для поточного запиту на сторінку. Він повинен використовуватися модулями, які потребують переосмислення теми на основі динамічних умов (наприклад, модуль, який дозволяє встановлювати тему на основі ролі поточного користувача). Повернене значення цього гака використовуватиметься на всіх сторінках, за винятком тих, які мають дійсну тему на кожну сторінку або на секцію за допомогою функції зворотного виклику теми в mook_menu (); теми на цих сторінках можна змінити лише за допомогою гачка_menu_alter ().
Зауважте, що повернення різних тем для одного шляху може не працювати з кешуванням сторінок. Це, швидше за все, проблема, якщо анонімний користувач на певному шляху може мати різні теми, повернуті за різних умов.
Оскільки одночасно може використовуватися лише одна тема, переважатиме останній (тобто найбільш зважений) модуль, який повертає дійсне ім'я теми з цього гака.