Modo corretto per cambiare il tema Drupal attivo a livello di codice?


22

Qual è il modo corretto per cambiare il tema Drupal attivo a livello di codice?

Risposte:


15

Soluzione Drupal 6:

Vuoi assicurarti di cambiare la $custom_themevariabile globale abbastanza presto nell'esecuzione della pagina.

global $custom_theme;
$custom_theme = 'garland';

Un paio di hook da provare che sono molto presto nell'esecuzione della pagina (se stai usando un modulo personalizzato) sono hook_boot () e hook_init ().
David Lanier,

dove è $custom_themedefinito? è sufficiente per cambiare tema?
Mohammad Ali Akbari,


1
Impossibile riprodurre il successo. : <
starlocke,

Ha funzionato per me. L'ho aggiunto in hook_boot ()
Mark

15

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.


4
Sì, se vuoi gestirlo attraverso l'interfaccia utente, consiglierei ThemeKey.
Dave Reid,


@Chaulky ha ragione: sto usando ThemeKey da un po ', è il modo più semplice per gestire le personalizzazioni dei temi su nome utente, ruolo, pagina, qualunque cosa tu voglia. Lo consiglio.
Benj,

14

Il modo migliore per farlo è creare un hook di aggiornamento in un modulo:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}

Questa dovrebbe essere la risposta corretta ..
Nick Barrett,

Ciò sarebbe corretto solo se si desidera modificare il tema a livello globale. Dalla domanda avevo ipotizzato che l'OP volesse cambiare il tema su una determinata pagina o in un contesto particolare.
Evan Donovan,

7

Modifica del tema attivo tramite Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Modifica del tema attivo tramite un modulo

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();
}

Questo è anche il metodo che variable_set('theme_default','yourtheme');
useresti

7

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.


3

Per Drupal 8:

In settings.php

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

Aggiorna la configurazione a livello di codice:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.