Richtige Möglichkeit, das aktive Drupal-Thema programmgesteuert zu ändern?

22

Was ist der richtige Weg, um das aktive Drupal-Thema programmgesteuert zu ändern?

Markdorison
quelle

Antworten:

15

Drupal 6 Lösung:

Sie möchten sicherstellen, dass Sie die globale $custom_themeVariable relativ früh in der Seitenausführung ändern .

global $custom_theme;
$custom_theme = 'garland';
Dave Reid
quelle
Ein paar Hooks, die sehr früh in der Seitenausführung sind (wenn Sie ein benutzerdefiniertes Modul verwenden), sind hook_boot () und hook_init ().
David Lanier
wo ist $custom_themedefiniert reicht es zum themenwechsel?
Mohammad Ali Akbari
2
Bitte erwähnen Sie hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel
1
Konnte den Erfolg nicht reproduzieren. : <
starlocke
Hat für mich gearbeitet. Ich habe es in hook_boot ()
Mark
15

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.

Chaulky
quelle
4
Ja, wenn Sie dies über die Benutzeroberfläche verwalten möchten, würde ich ThemeKey empfehlen.
Dave Reid
Oder sehen Sie sich zumindest drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… an, wo ThemeKey seine Magie
entfaltet
@Chaulky hat recht: Ich verwende ThemeKey seit einiger Zeit. Es ist der einfachste Weg, die Anpassungen der Themes nach Benutzername, Rolle, Seite und nach Belieben zu verwalten. Ich empfehle es.
Benj
14

Am besten erstellen Sie dazu einen Update-Hook in einem Modul:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
Boga
quelle
Dies sollte die richtige Antwort sein.
Nick Barrett
Dies wäre nur dann richtig, wenn Sie das Thema global ändern möchten. Ich hatte von der Frage ausgegangen, dass das OP das Thema auf einer bestimmten Seite oder in einem bestimmten Kontext ändern wollte.
Evan Donovan
7

Ändern des aktiven Themas über Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Ändern des aktiven Themas über ein Modul

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();
}
Sk8erPeter
quelle
Dies ist auch die Methode, die Sie verwenden würden, wenn Sie ein Thema in einem Installationsprofil variable_set('theme_default','yourtheme');
aktivieren
7

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.

Agi Hammerthief
quelle
3

Für Drupal 8:

In settings.php

$config['system.theme']['default'] = 'my_custom_theme';

Aktualisiere die Konfiguration programmatisch:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
JeroenT
quelle