¿Forma correcta de cambiar el tema activo de Drupal mediante programación?

22

¿Cuál es la forma correcta de cambiar el tema activo de Drupal mediante programación?

Markdorison
fuente

Respuestas:

15

Solución Drupal 6:

Desea asegurarse de cambiar la $custom_themevariable global bastante temprano en la ejecución de la página.

global $custom_theme;
$custom_theme = 'garland';
Dave Reid
fuente
Un par de ganchos para probar que son muy tempranos en la ejecución de la página (si está utilizando un módulo personalizado) son hook_boot () y hook_init ().
David Lanier
donde se $custom_themedefine ¿Es suficiente para cambiar de tema?
Mohammad Ali Akbari
2
Por favor, mencione hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel
1
No se pudo reproducir el éxito. : <
starlocke
Trabajó para mi. Lo agregué en hook_boot ()
Mark
15

Sé que preguntaste cómo hacerlo programáticamente, pero en caso de que esa sea tu solución, no el problema real, también puedes usar el módulo ThemeKey . Esto le permite establecer condiciones que, cuando se cumplen, cambian el tema. Puede crear condiciones basadas en rutas, taxonomía, tipo de contenido, fecha de creación o edición y más. También puede agregar el módulo de módulo de Propiedades Themekey para obtener aún más opciones.

Una vez más, sé que esto no es programáticamente, pero no estoy seguro de si la verdadera pregunta detrás de su pregunta es cómo cambiar los temas según las condiciones.

Chaulky
fuente
44
Sí, si desea administrar esto a través de la interfaz de usuario, le recomendaría ThemeKey.
Dave Reid
O al menos pagar drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… donde ThemeKey hace su magia
Capi Etheriel
@Chaulky tiene razón: estoy usando ThemeKey desde hace un tiempo, es la forma más fácil de administrar las personalizaciones de temas según el nombre de usuario, el rol, la página, lo que quieras. Lo recomiendo.
Benj
14

La mejor manera de hacer esto es crear un enlace de actualización en un módulo:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
Boga
fuente
Esta debería ser la respuesta correcta ..
Nick Barrett
Esto solo sería correcto si quisieras cambiar el tema globalmente. Supuse por la pregunta que el OP quería cambiar el tema en una página en particular, o en un contexto particular.
Evan Donovan
7

Cambiar el tema activo a través de Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Cambiar el tema activo a través de un módulo

Los conceptos básicos para cambiar el tema predeterminado y el tema de administración:

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

Aquí hay una pequeña función para restablecer los temas de forma segura a los temas predeterminados de Drupal como Bartik o Garland (probado en Drupal 6 y 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
  )));

}

Puede llamarlo en una implementación hook_init () (coméntelo después de que no sea necesario):

/**
 * 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
fuente
Este es también el método que usaría al habilitar un tema en un perfil de instalaciónvariable_set('theme_default','yourtheme');
Duncanmoo
7

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

Devuelve el nombre legible por máquina del tema para usar en la página actual.

Los comentarios para esta función pueden valer la pena leer:

Este enlace se puede usar para establecer dinámicamente el tema para la solicitud de página actual. Debería ser utilizado por módulos que necesiten anular el tema en función de condiciones dinámicas (por ejemplo, un módulo que permita establecer el tema en función del rol del usuario actual).El valor de retorno de este enlace se utilizará en todas las páginas, excepto en aquellas que tengan un tema válido por página o por sección establecido a través de una función de devolución de llamada de tema en hook_menu (); los temas en esas páginas solo pueden anularse usando hook_menu_alter ().

Tenga en cuenta que devolver diferentes temas para la misma ruta puede no funcionar con el almacenamiento en caché de la página. Es muy probable que esto sea un problema si un usuario anónimo en una ruta determinada podría tener diferentes temas devueltos en diferentes condiciones.

Como solo se puede usar un tema a la vez, prevalecerá el último módulo (es decir, el más ponderado) que devuelve un nombre de tema válido de este enlace.

Agi Hammerthief
fuente
3

Para Drupal 8:

En settings.php

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

Actualizar la configuración mediante programación:

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