Etkin Drupal temasını programlı olarak değiştirmenin doğru yolu mu?


22

Etkin Drupal temasını programlı olarak değiştirmenin doğru yolu nedir?

Yanıtlar:


15

Drupal 6 çözümü:

Genel $custom_themedeğişkeni sayfa yürütme işleminin başında oldukça değiştirdiğinizden emin olmak istersiniz .

global $custom_theme;
$custom_theme = 'garland';

Denemek için birkaç sayfa kancalama işleminde çok erken (özel bir modül kullanıyorsanız) hook_boot () ve hook_init ().
David Lanier

nerede $custom_themetanımlanır tema değiştirmek için yeterli mi?
Mohammad Ali Akbari,


1
Başarı yeniden üretilemedi. : <
starlocke

Benim için çalıştı. Hook_boot () '
Mark

15

Programatik olarak nasıl yapılacağını sorduğunuzu biliyorum, ancak çözümünüz olması durumunda asıl sorun değil, ThemeKey modülünü de kullanabilirsiniz . Bu, bir araya geldiğinde temayı değiştiren koşulları belirlemenizi sağlar. Yollara, taksonomiye, içerik türüne, tarih oluşturmaya veya düzenlemeye vb. Dayalı koşullar koyabilirsiniz. Daha fazla seçenek elde etmek için Themekey Properties modül modülüne de ekleyebilirsiniz .

Yine, bunun programsal olarak olmadığını biliyorum, ancak sorunuzun ardındaki asıl sorunun, temaları koşullara göre nasıl değiştireceğinden emin değilim.


4
Evet, bu UI üzerinden yönetmek istiyorsanız, ThemeKey tavsiye ederim.
Dave Reid

Ya da en kasada aynı drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/... ThemeKey büyü yapar nerede
Capi Etheriel

@Chaulky haklı: Bir süredir ThemeKey kullanıyorum, kullanıcı adı, rol, sayfa ve istediğiniz şekilde tema özelleştirmelerini yönetmenin en kolay yoludur. Bunu öneririm.
Benj

14

Bunu yapmanın en iyi yolu bir modülde güncelleme kancası oluşturmaktır:

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

Bu doğru cevap olmalı ..
Nick Barrett

Bu, temayı genel olarak değiştirmek istemeniz durumunda doğru olacaktır. OP'nin temayı belirli bir sayfada veya belirli bir bağlamda değiştirmek istediği sorusundan varsaymıştım.
Evan Donovan

7

Drush ile aktif temayı değiştirme

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Bir modül aracılığıyla aktif temayı değiştirme

Varsayılan tema ve yönetim temasını değiştirmenin temelleri:

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

Temaları, Bartik veya Garland gibi varsayılan Drupal temalarına (Drupal 6 ve 7'de test edilmiştir) güvenli bir şekilde ayarlamak için küçük bir işlev:

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

}

Bir hook_init () uygulamasında çağırabilirsiniz ( gerekli olmadığında yorum yapın):

/**
 * Implements hook_init()
 */
function TESTMODULE_init() {  
  // ATTENTION! Comment out the following line if it's not needed anymore!
  TESTMODULE_set_active_theme_to_default();
}

Bu aynı zamanda yükleme profilinde bir temayı etkinleştirirken kullanacağınız yöntemdirvariable_set('theme_default','yourtheme');
Duncanmoo

7

Drupal 7'de şunu kullanın 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;
}

<Emoticode /> ' dan uyarlanmıştır

Geçerli sayfa için kullanılacak temanın makine tarafından okunabilir adını döndürün.

Bu işlevin yorumları okumaya değer olabilir:

Bu kanca, geçerli sayfa isteğinin temasını dinamik olarak ayarlamak için kullanılabilir. Dinamik koşullara dayalı temayı geçersiz kılacak modüller tarafından kullanılmalıdır (örneğin, temanın geçerli kullanıcının rolüne göre ayarlanmasına izin veren bir modül). Bu kancanın dönüş değeri, hook_menu () 'daki bir tema geri çağırma işlevi aracılığıyla belirlenen geçerli bir sayfa başına veya bölüm başı teması olmayanlar dışındaki tüm sayfalarda kullanılacaktır; Bu sayfalardaki temalar sadece hook_menu_alter () kullanılarak geçersiz kılınabilir.

Aynı yol için farklı temalar döndürmenin sayfa önbelleğe alma ile çalışmayabileceğini unutmayın. Belirli bir yoldaki anonim bir kullanıcının farklı koşullar altında döndürülen farklı temaları olması durumunda, bu muhtemelen bir sorun olabilir.

Bir seferde yalnızca bir tema kullanılabildiğinden, bu kancadan geçerli bir tema adı döndüren son (yani en yüksek ağırlıklı) modül geçerli olacaktır.


3

Drupal 8 için:

Settings.php içinde

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

Config programatik olarak güncelle:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.