it-swarm-id.com

Cara yang benar untuk mengubah tema aktif Drupal secara terprogram?

Apa cara yang benar untuk mengubah tema aktif Drupal secara terprogram?

22
markdorison

Solusi Drupal 6:

Anda ingin memastikan Anda mengubah global $custom_theme variabel cukup awal dalam eksekusi halaman.

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

Saya tahu Anda bertanya bagaimana melakukannya secara terprogram, tetapi jika itu solusi Anda, bukan masalah sebenarnya, Anda juga dapat menggunakan modul ThemeKey . Ini memungkinkan Anda untuk mengatur kondisi yang, ketika bertemu, mengubah tema. Anda dapat membuat kondisi berdasarkan jalur, taksonomi, tipe konten, buat atau edit tanggal dan banyak lagi. Anda juga dapat menambahkan modul modul Properties Themekey untuk mendapatkan lebih banyak opsi.

Sekali lagi, saya tahu ini tidak terprogram, tetapi saya tidak yakin apakah pertanyaan sesungguhnya di balik pertanyaan Anda adalah bagaimana mengubah tema berdasarkan kondisi.

15
Chaulky

Cara terbaik untuk melakukan ini adalah dengan membuat kait pembaruan dalam modul:

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

Dalam Drupal 7, gunakan 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;
}

Diadaptasi dari <emoticode />

Kembalikan nama tema yang dapat dibaca mesin untuk digunakan untuk halaman saat ini.

Komentar untuk fungsi ini mungkin layak dibaca:

Kait ini dapat digunakan untuk secara dinamis mengatur tema untuk permintaan halaman saat ini. Ini harus digunakan oleh modul yang perlu mengganti tema berdasarkan kondisi dinamis (misalnya, modul yang memungkinkan tema diatur berdasarkan peran pengguna saat ini). Nilai balik dari kail ini akan digunakan pada semua halaman kecuali yang memiliki tema per-halaman atau per-bagian yang ditetapkan melalui fungsi callback tema di hook_menu (); tema pada halaman tersebut hanya dapat diganti menggunakan hook_menu_alter ().

Perhatikan bahwa mengembalikan tema berbeda untuk jalur yang sama mungkin tidak berfungsi dengan caching halaman. Ini kemungkinan besar akan menjadi masalah jika pengguna anonim di jalur yang diberikan dapat memiliki tema yang berbeda kembali dalam kondisi yang berbeda.

Karena hanya satu tema yang dapat digunakan pada satu waktu, modul terakhir (mis., Terbobot tertinggi) yang mengembalikan nama tema yang valid dari kait ini akan menang.

7
Agi Hammerthief

Mengubah tema aktif melalui Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Mengubah tema aktif melalui modul

Dasar-dasar mengubah tema default dan tema administrasi:

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

Berikut adalah fungsi kecil untuk mengatur kembali tema dengan aman ke default Drupal tema seperti Bartik atau Garland (diuji dalam Drupal 6 dan 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
  )));

}

Anda dapat menyebutnya dalam hook_init () implementasi (beri komentar setelah itu tidak diperlukan):

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

Untuk Drupal 8:

Di settings.php

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

Perbarui konfigurasi secara programatik:

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