Was ist der richtige Weg, um das aktive Drupal-Thema programmgesteuert zu ändern?
Was ist der richtige Weg, um das aktive Drupal-Thema programmgesteuert zu ändern?
Antworten:
Drupal 6 Lösung:
Sie möchten sicherstellen, dass Sie die globale $custom_theme
Variable relativ früh in der Seitenausführung ändern .
global $custom_theme;
$custom_theme = 'garland';
$custom_theme
definiert reicht es zum themenwechsel?
hook_custom_theme
api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Ich weiß, dass Sie gefragt haben, wie man das programmatisch macht, aber falls dies Ihre Lösung ist und nicht das eigentliche Problem, können Sie auch das ThemeKey-Modul verwenden . Auf diese Weise können Sie Bedingungen festlegen, bei deren Einhaltung das Thema geändert wird. Sie können Bedingungen basierend auf Pfaden, Taxonomie, Inhaltstyp, Erstellungsdatum oder Bearbeitungsdatum usw. festlegen. Sie können auch das Modul "Themekey Properties" hinzufügen , um noch mehr Optionen zu erhalten.
Wiederum weiß ich, dass dies nicht programmatisch ist, aber ich bin nicht sicher, ob die eigentliche Frage hinter Ihrer Frage ist, wie Themen basierend auf Bedingungen geändert werden können.
Am besten erstellen Sie dazu einen Update-Hook in einem Modul:
function yourmodule_update_N() {
variable_set('theme_default','yourtheme');
}
drush vset theme_default garland
drush vset admin_theme garland
drush cc all
Die Grundlagen zum Ändern des Standarddesigns und des Verwaltungsthemas:
// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);
Hier ist eine kleine Funktion, um die Themen sicher auf Standard-Drupal-Themen wie Bartik oder Garland zurückzusetzen (getestet in Drupal 6 und 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
)));
}
Sie können es in einer Implementierung von hook_init () aufrufen ( kommentieren Sie es aus, wenn es nicht benötigt wird):
/**
* 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 verwenden Sie 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;
}
Angepasst von <emoticode />
Geben Sie den maschinenlesbaren Namen des Themas zurück, das für die aktuelle Seite verwendet werden soll.
Die Kommentare zu dieser Funktion können lesenswert sein:
Dieser Hook kann verwendet werden, um das Thema für die aktuelle Seitenanforderung dynamisch festzulegen. Es sollte von Modulen verwendet werden, die das Thema basierend auf dynamischen Bedingungen überschreiben müssen (z. B. ein Modul, mit dem das Thema basierend auf der Rolle des aktuellen Benutzers festgelegt werden kann). Der Rückgabewert dieses Hooks wird auf allen Seiten verwendet, mit Ausnahme derer, für die über eine Theme-Callback-Funktion in hook_menu () ein gültiges Pro-Seite- oder Pro-Abschnitt-Theme festgelegt wurde. Die Themen auf diesen Seiten können nur mit hook_menu_alter () überschrieben werden.
Beachten Sie, dass das Zurückgeben verschiedener Designs für denselben Pfad möglicherweise nicht mit dem Seiten-Caching funktioniert. Dies ist höchstwahrscheinlich ein Problem, wenn ein anonymer Benutzer auf einem bestimmten Pfad unter verschiedenen Bedingungen unterschiedliche Themen zurückgeben kann.
Da jeweils nur ein Thema verwendet werden kann, hat das letzte (dh am höchsten gewichtete) Modul Vorrang, das einen gültigen Themennamen von diesem Hook zurückgibt.