web-dev-qa-db-fra.com

Bonne façon de changer le thème Drupal par programme?

Quelle est la bonne façon de changer le thème actif Drupal par programme?

22
markdorison

Solution Drupal 6:

Vous voulez vous assurer que vous changez le global $custom_theme variable assez tôt dans l'exécution de la page.

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

Je sais que vous avez demandé comment le faire par programme, mais si c'est votre solution, pas le problème réel, vous pouvez également utiliser le module ThemeKey . Cela vous permet de définir des conditions qui, une fois remplies, modifient le thème. Vous pouvez créer des conditions basées sur les chemins, la taxonomie, le type de contenu, créer ou modifier la date et plus encore. Vous pouvez également ajouter le module Themekey Properties module pour obtenir encore plus d'options.

Encore une fois, je sais que ce n'est pas programmatique, mais je ne sais pas si la vraie question derrière votre question est de savoir comment changer les thèmes en fonction des conditions.

15
Chaulky

La meilleure façon de le faire est de créer un hook de mise à jour dans un module:

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

Dans Drupal 7, utilisez 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;
}

Adapté de <emoticode />

Renvoie le nom lisible par machine du thème à utiliser pour la page actuelle.

Les commentaires pour cette fonction méritent d'être lus:

Ce crochet peut être utilisé pour définir dynamiquement le thème de la demande de page actuelle. Il doit être utilisé par les modules qui doivent remplacer le thème en fonction des conditions dynamiques (par exemple, un module qui permet de définir le thème en fonction du rôle de l'utilisateur actuel). La valeur de retour de ce hook sera utilisée sur toutes les pages sauf celles qui ont un thème valide par page ou par section défini via une fonction de rappel de thème dans hook_menu (); les thèmes de ces pages ne peuvent être remplacés qu'à l'aide de hook_menu_alter ().

Notez que le retour de différents thèmes pour le même chemin peut ne pas fonctionner avec la mise en cache des pages. Cela risque fort d'être un problème si un utilisateur anonyme sur un chemin donné peut renvoyer différents thèmes dans différentes conditions.

Étant donné qu'un seul thème peut être utilisé à la fois, le dernier module (c'est-à-dire le plus élevé) qui renvoie un nom de thème valide à partir de ce crochet prévaudra.

7
Agi Hammerthief

Changer le thème actif via Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Changer le thème actif via un module

Les bases de la modification du thème par défaut et du thème d'administration:

// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);

Voici une petite fonction pour restaurer les thèmes en toute sécurité par défaut Drupal thèmes comme Bartik ou Garland (testé dans Drupal 6 et 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
  )));

}

Vous pouvez l'appeler dans une implémentation hook_init () (commentez-le après qu'il ne soit pas nécessaire):

/**
 * 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

Pour Drupal 8:

Dans settings.php

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

Mettre à jour la configuration par programmation:

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