Cara yang benar untuk mengubah tema Drupal yang aktif secara terprogram?

22

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

markdorison
sumber

Jawaban:

15

Solusi Drupal 6:

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

global $custom_theme;
$custom_theme = 'garland';
Dave Reid
sumber
Beberapa kait untuk dicoba yang sangat awal dalam eksekusi halaman (jika Anda menggunakan modul khusus) adalah hook_boot () dan hook_init ().
David Lanier
dimana $custom_themedidefinisikan? apakah cukup untuk mengubah tema?
Mohammad Ali Akbari
2
Tolong, sebutkan hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel
1
Tidak dapat mereproduksi kesuksesan. : <
starlocke
Bekerja untukku. Saya menambahkannya di hook_boot ()
Mark
15

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 Properti 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.

Chaulky
sumber
4
Ya jika Anda ingin mengelola ini melalui UI, saya akan merekomendasikan ThemeKey.
Dave Reid
Atau setidaknya checkout drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… di mana ThemeKey melakukan keajaibannya
Capi Etheriel
@Chaulky benar: Saya menggunakan ThemeKey sejak beberapa saat, ini adalah cara termudah untuk mengatur penyesuaian tema berdasarkan nama pengguna, peran, halaman, apa pun yang Anda inginkan. Saya merekomendasikannya.
Benj
14

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

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
Boga
sumber
Ini seharusnya jawaban yang benar ..
Nick Barrett
Ini hanya akan benar jika Anda ingin mengubah tema secara global. Saya berasumsi dari pertanyaan bahwa OP ingin mengubah tema pada halaman tertentu, atau dalam konteks tertentu.
Evan Donovan
7

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 tema Drupal default 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 implementasi hook_init () (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();
}
Sk8erPeter
sumber
Ini juga metode yang akan Anda gunakan ketika mengaktifkan tema di profil instalvariable_set('theme_default','yourtheme');
Duncanmoo
7

Di 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:

Pengait 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 valid yang ditetapkan melalui fungsi callback tema di hook_menu (); tema pada halaman tersebut hanya dapat diganti menggunakan hook_menu_alter ().

Perhatikan bahwa mengembalikan tema yang 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 dikembalikan dalam kondisi yang berbeda.

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

Agi Hammerthief
sumber
3

Untuk Drupal 8:

Dalam settings.php

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

Perbarui konfigurasi secara programatik:

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