Comment corriger par programmation le thème Drupal actif?

22

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

markdorison
la source

Réponses:

15

Solution Drupal 6:

Vous voulez vous assurer que vous modifiez la $custom_themevariable globale assez tôt dans l'exécution de la page.

global $custom_theme;
$custom_theme = 'garland';
Dave Reid
la source
Quelques hooks à essayer très tôt dans l'exécution de la page (si vous utilisez un module personnalisé) sont hook_boot () et hook_init ().
David Lanier
où est $custom_themedéfini? est-ce suffisant pour changer de thème?
Mohammad Ali Akbari
2
Veuillez mentionner hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel
1
Impossible de reproduire le succès. : <
starlocke
A travaillé pour moi. Je l'ai ajouté dans hook_boot ()
Mark
15

Je sais que vous avez demandé comment le faire par programmation, mais si c'est votre solution, et non 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 du module Themekey Properties 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.

Chaulky
la source
4
Oui, si vous souhaitez gérer cela via l'interface utilisateur, je recommanderais ThemeKey.
Dave Reid
Ou au moins commander drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… où ThemeKey fait sa magie
Capi Etheriel
@Chaulky a raison: j'utilise ThemeKey depuis un certain temps, c'est le moyen le plus simple de gérer les personnalisations de thèmes selon le nom d'utilisateur, le rôle, la page, tout ce que vous voulez. Je le recommande.
Benj
14

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');
}
Boga
la source
Cela devrait être la bonne réponse ..
Nick Barrett
Cela ne serait correct que si vous vouliez changer le thème globalement. J'avais supposé de la question que le PO voulait changer le thème sur une page particulière, ou dans un contexte particulier.
Evan Donovan
7

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é sur des thèmes Drupal par défaut 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();
}
Sk8erPeter
la source
C'est également la méthode que vous utiliseriez lors de l'activation d'un thème dans un profil d'installationvariable_set('theme_default','yourtheme');
Duncanmoo
7

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 par page ou par section valide 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.

Agi Hammerthief
la source
3

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