Qual é a maneira correta de alterar o tema ativo do Drupal programaticamente?
Qual é a maneira correta de alterar o tema ativo do Drupal programaticamente?
Respostas:
Solução Drupal 6:
Você deseja certificar-se de alterar a $custom_theme
variável global bastante cedo na execução da página.
global $custom_theme;
$custom_theme = 'garland';
$custom_theme
definido? é suficiente para mudar o tema?
hook_custom_theme
api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Sei que você perguntou como fazê-lo programaticamente, mas, se essa é a sua solução, não o problema real, você também pode usar o módulo ThemeKey . Isso permite definir condições que, quando atendidas, alteram o tema. Você pode criar condições com base em caminhos, taxonomia, tipo de conteúdo, criar ou editar data e muito mais. Você também pode adicionar o módulo Modulekey Properties para obter ainda mais opções.
Novamente, eu sei que isso não é programaticamente, mas não tenho certeza se a verdadeira questão por trás da sua pergunta é como alterar os temas com base nas condições.
A melhor maneira de fazer isso é criar um gancho de atualização em um módulo:
function yourmodule_update_N() {
variable_set('theme_default','yourtheme');
}
drush vset theme_default garland
drush vset admin_theme garland
drush cc all
Noções básicas de alteração do tema padrão e do tema de administração:
// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);
Aqui está uma pequena função para restaurar os temas com segurança para os temas padrão do Drupal, como Bartik ou Garland (testados no Drupal 6 e 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
)));
}
Você pode chamá-lo em uma implementação hook_init () (comente depois que não for necessário):
/**
* 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');
No Drupal 7, use 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;
}
Adaptado de <emoticode />
Retorne o nome legível por máquina do tema a ser usado na página atual.
Vale a pena ler os comentários para esta função:
Esse gancho pode ser usado para definir dinamicamente o tema para a solicitação de página atual. Ele deve ser usado por módulos que precisam substituir o tema com base em condições dinâmicas (por exemplo, um módulo que permite que o tema seja definido com base na função do usuário atual). O valor de retorno desse gancho será usado em todas as páginas, exceto aquelas que possuem um tema válido por página ou por seção, através de uma função de retorno de chamada de tema em hook_menu (); os temas nessas páginas só podem ser substituídos usando hook_menu_alter ().
Observe que o retorno de temas diferentes para o mesmo caminho pode não funcionar com o cache da página. É mais provável que seja um problema se um usuário anônimo em um determinado caminho puder ter temas diferentes retornados sob condições diferentes.
Como apenas um tema pode ser usado por vez, o último módulo (ou seja, com maior peso) que retorna um nome de tema válido desse gancho prevalecerá.