Qual è il modo corretto per cambiare il tema Drupal attivo a livello di codice?
Qual è il modo corretto per cambiare il tema Drupal attivo a livello di codice?
Risposte:
Soluzione Drupal 6:
Vuoi assicurarti di cambiare la $custom_theme
variabile globale abbastanza presto nell'esecuzione della pagina.
global $custom_theme;
$custom_theme = 'garland';
$custom_theme
definito? è sufficiente per cambiare tema?
hook_custom_theme
api.drupal.org/api/drupal/modules%21system%21system.api.php/…
So che hai chiesto come farlo programmaticamente, ma nel caso in cui questa sia la tua soluzione, non il problema reale, puoi anche usare il modulo ThemeKey . Ciò consente di impostare condizioni che, una volta soddisfatte, cambiano il tema. Puoi creare condizioni in base a percorsi, tassonomia, tipo di contenuto, creare o modificare la data e altro. Puoi anche aggiungere il modulo del modulo Proprietà del tasto di scelta rapida per ottenere ancora più opzioni.
Ancora una volta, so che questo non è programmaticamente, ma non sono sicuro che la vera domanda dietro la tua domanda sia come cambiare i temi in base alle condizioni.
Il modo migliore per farlo è creare un hook di aggiornamento in un modulo:
function yourmodule_update_N() {
variable_set('theme_default','yourtheme');
}
drush vset theme_default garland
drush vset admin_theme garland
drush cc all
Nozioni di base sulla modifica del tema predefinito e del tema di amministrazione:
// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);
Ecco una piccola funzione per riportare i temi in modo sicuro ai temi Drupal predefiniti come Bartik o Garland (testati in 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
)));
}
Puoi chiamarlo in un'implementazione hook_init () (commentalo quando non è necessario):
/**
* 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');
In Drupal 7, usa 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;
}
Adattato da <emoticode />
Restituisce il nome leggibile dal computer del tema da utilizzare per la pagina corrente.
Vale la pena leggere i commenti per questa funzione:
Questo hook può essere utilizzato per impostare dinamicamente il tema per la richiesta di pagina corrente. Dovrebbe essere utilizzato da moduli che devono sovrascrivere il tema in base a condizioni dinamiche (ad esempio, un modulo che consente di impostare il tema in base al ruolo dell'utente corrente). Il valore di ritorno di questo hook verrà utilizzato su tutte le pagine tranne quelle che hanno un set di temi valido per pagina o per sezione tramite una funzione di richiamata del tema in hook_menu (); i temi in quelle pagine possono essere sovrascritti solo usando hook_menu_alter ().
Si noti che la restituzione di temi diversi per lo stesso percorso potrebbe non funzionare con la memorizzazione nella cache della pagina. È molto probabile che ciò costituisca un problema se un utente anonimo su un determinato percorso potrebbe avere temi diversi restituiti in condizioni diverse.
Poiché è possibile utilizzare un solo tema alla volta, prevarrà l'ultimo modulo (ovvero il più ponderato) che restituisce un nome di tema valido da questo hook.