Maneira correta de alterar o tema ativo do Drupal programaticamente?

22

Qual é a maneira correta de alterar o tema ativo do Drupal programaticamente?

markdorison
fonte

Respostas:

15

Solução Drupal 6:

Você deseja certificar-se de alterar a $custom_themevariável global bastante cedo na execução da página.

global $custom_theme;
$custom_theme = 'garland';
Dave Reid
fonte
Alguns ganchos para tentar que estão muito adiantados na execução da página (se você estiver usando um módulo personalizado) são hook_boot () e hook_init ().
David Lanier
onde é $custom_themedefinido? é suficiente para mudar o tema?
Mohammad Ali Akbari
2
Por favor, mencione hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel
1
Não foi possível reproduzir o sucesso. : <
starlocke 13/06
Trabalhou para mim. Eu adicionei-lo em hook_boot ()
Mark
15

Sei que você perguntou como fazê-lo programaticamente, mas, se essa é a sua solução, não o problema real, você também pode usar o módulo ThemeKey . Isso permite definir condições que, quando atendidas, alteram o tema. Você pode criar condições com base em caminhos, taxonomia, tipo de conteúdo, criar ou editar data e muito mais. Você também pode adicionar o módulo Modulekey Properties para obter ainda mais opções.

Novamente, eu sei que isso não é programaticamente, mas não tenho certeza se a verdadeira questão por trás da sua pergunta é como alterar os temas com base nas condições.

Chaulky
fonte
4
Sim, se você deseja gerenciar isso por meio da interface do usuário, recomendo o ThemeKey.
Dave Reid
Ou, pelo menos, check-out drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/... onde ThemeKey faz a sua magia
Capi Etheriel
@Chaulky está certo: estou usando o ThemeKey há algum tempo, é a maneira mais fácil de gerenciar personalizações de temas em nome de usuário, função, página, o que você quiser. Eu recomendo.
1113 Benj
14

A melhor maneira de fazer isso é criar um gancho de atualização em um módulo:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
Boga
fonte
Esta deve ser a resposta correta ..
Nick Barrett
Isso só seria correto se você quisesse alterar o tema globalmente. Eu tinha assumido pela pergunta que o OP queria mudar o tema em uma página específica ou em um contexto específico.
Evan Donovan
7

Alterando o tema ativo via Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Alterando o tema ativo por meio de um módulo

Noções básicas de alteração do tema padrão e do tema de administração:

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

Aqui está uma pequena função para restaurar os temas com segurança para os temas padrão do Drupal, como Bartik ou Garland (testados no 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
  )));

}

Você pode chamá-lo em uma implementação hook_init () (comente depois que não for necessário):

/**
 * 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
fonte
Este é também o método que você usaria ao ativar um tema em um perfil de instalarvariable_set('theme_default','yourtheme');
Duncanmoo
7

No Drupal 7, use 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;
}

Adaptado de <emoticode />

Retorne o nome legível por máquina do tema a ser usado na página atual.

Vale a pena ler os comentários para esta função:

Esse gancho pode ser usado para definir dinamicamente o tema para a solicitação de página atual. Ele deve ser usado por módulos que precisam substituir o tema com base em condições dinâmicas (por exemplo, um módulo que permite que o tema seja definido com base na função do usuário atual). O valor de retorno desse gancho será usado em todas as páginas, exceto aquelas que possuem um tema válido por página ou por seção, através de uma função de retorno de chamada de tema em hook_menu (); os temas nessas páginas só podem ser substituídos usando hook_menu_alter ().

Observe que o retorno de temas diferentes para o mesmo caminho pode não funcionar com o cache da página. É mais provável que seja um problema se um usuário anônimo em um determinado caminho puder ter temas diferentes retornados sob condições diferentes.

Como apenas um tema pode ser usado por vez, o último módulo (ou seja, com maior peso) que retorna um nome de tema válido desse gancho prevalecerá.

Agi Hammerthief
fonte
3

Para o Drupal 8:

Em settings.php

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

Atualize a configuração programaticamente:

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