Prawidłowy sposób programowej zmiany aktywnego motywu Drupal?

22

Jaki jest prawidłowy sposób programowej zmiany aktywnego motywu Drupal?

markdorison
źródło

Odpowiedzi:

15

Rozwiązanie Drupal 6:

Chcesz się upewnić, że $custom_themezmienna globalna została zmieniona dość wcześnie na początku strony.

global $custom_theme;
$custom_theme = 'garland';
Dave Reid
źródło
Kilka haków do wypróbowania, które są bardzo wcześnie w wykonywaniu strony (jeśli używasz niestandardowego modułu), to hook_boot () i hook_init ().
David Lanier
gdzie jest $custom_themezdefiniowane? czy wystarczy zmienić motyw?
Mohammad Ali Akbari
2
Proszę wspomnieć o hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel,
1
Nie można odtworzyć sukcesu. : <
starlocke
Pracował dla mnie. Dodałem go w hook_boot ()
Mark
15

Wiem, że zapytałeś, jak to zrobić programowo, ale jeśli to twoje rozwiązanie, a nie faktyczny problem, możesz również użyć modułu ThemeKey . Pozwala to ustawić warunki, które po spełnieniu zmienią motyw. Możesz tworzyć warunki na podstawie ścieżek, systematyki, typu zawartości, tworzyć lub edytować datę i więcej. Możesz również dodać moduł modułu Themekey Properties , aby uzyskać jeszcze więcej opcji.

Znów wiem, że nie jest to programowo, ale nie jestem pewien, czy prawdziwym pytaniem jest pytanie, jak zmieniać motywy w zależności od warunków.

Chaulky
źródło
4
Tak, jeśli chcesz zarządzać tym za pomocą interfejsu użytkownika, polecam ThemeKey.
Dave Reid
Lub przynajmniej kasę drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/... gdzie ThemeKey robi swoją magię
Capi Etheriel
@Chaulky ma rację: używam ThemeKey od jakiegoś czasu, jest to najłatwiejszy sposób zarządzania dostosowaniami tematycznymi według nazwy użytkownika, roli, strony, cokolwiek chcesz. Polecam to.
Benj,
14

Najlepszym sposobem na to jest utworzenie haka aktualizacji w module:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
Boga
źródło
To powinna być prawidłowa odpowiedź.
Nick Barrett,
Byłoby to poprawne tylko, jeśli chcesz zmienić motyw globalnie. Z pytania wynikało, że PO chce zmienić temat na konkretnej stronie lub w określonym kontekście.
Evan Donovan,
7

Zmiana aktywnego motywu za pośrednictwem Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Zmiana aktywnego motywu za pomocą modułu

Podstawy zmiany domyślnego motywu i motywu administracyjnego:

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

Oto mała funkcja bezpiecznego przywracania motywów do domyślnych motywów Drupal, takich jak Bartik lub Garland (testowane w Drupal 6 i 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
  )));

}

Możesz go wywołać w implementacji hook_init () (skomentuj go, gdy nie będzie potrzebny):

/**
 * 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
źródło
Jest to również metoda, której należy użyć podczas włączania motywu w profilu instalacyjnymvariable_set('theme_default','yourtheme');
Duncanmoo
7

W Drupal 7 użyj 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;
}

Zaadaptowano z <emoticode />

Zwraca odczytywalną maszynowo nazwę motywu, który będzie używany dla bieżącej strony.

Warto przeczytać komentarze do tej funkcji:

Tego zaczepu można użyć do dynamicznego ustawienia motywu dla bieżącego żądania strony. Powinien być używany przez moduły, które muszą zastąpić kompozycję na podstawie warunków dynamicznych (na przykład moduł, który pozwala ustawić kompozycję na podstawie roli bieżącego użytkownika). Zwracana wartość tego haka będzie używana na wszystkich stronach z wyjątkiem tych, które mają poprawny zestaw motywów na stronę lub na sekcję za pomocą funkcji wywołania zwrotnego motywu w hook_menu (); motywy na tych stronach można zastąpić tylko za pomocą hook_menu_alter ().

Pamiętaj, że zwracanie różnych motywów dla tej samej ścieżki może nie działać z buforowaniem strony. Jest to najprawdopodobniej problem, jeśli anonimowy użytkownik na danej ścieżce może zwrócić różne motywy w różnych warunkach.

Ponieważ jednocześnie można używać tylko jednego motywu, zwycięży ostatni (tj. O największej wadze) moduł, który zwraca prawidłową nazwę motywu z tego haka.

Agi Hammerthief
źródło
3

W przypadku Drupal 8:

W settings.php

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

Aktualizuj programowo konfigurację:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
JeroenT
źródło