it-swarm.it

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

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

22
markdorison

Soluzione Drupal 6:

Vuoi assicurarti di cambiare il globale $custom_theme variabile abbastanza presto nell'esecuzione della pagina.

global $custom_theme;
$custom_theme = 'garland';
15
Dave Reid

So che hai chiesto come farlo in modo programmatico, ma nel caso in cui questa sia la tua soluzione, non il problema reale, puoi anche usare modulo ThemeKey . Ciò consente di impostare condizioni che, se 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 Modulo Proprietà tasti 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.

15
Chaulky

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

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

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 tema in hook_menu (); i temi di 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.

Dato che è possibile utilizzare solo un tema alla volta, prevarrà l'ultimo modulo (ovvero il peso più elevato) che restituisce un nome di tema valido da questo hook.

7
Agi Hammerthief

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

Le basi per cambiare il tema predefinito e il 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 ripristinare i temi in modo sicuro sul valore predefinito Drupal come Bartik o Garland (testato 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();
}
7
Sk8erPeter

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();
3
JeroenT