web-gelistirme-sc.com

Etkin Drupal temayı programlı olarak değiştirmenin doğru yolu?

Active Drupal temayı programlı olarak değiştirmenin doğru yolu nedir?

22
markdorison

Drupal 6 çözümü:

Global olanı değiştirdiğinizden emin olmak istersiniz $custom_theme Değişken, sayfa yürütülmesinde oldukça erken.

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

Programlı olarak nasıl yapılacağını sorduğunuzu biliyorum, ancak çözümünüz değil, asıl sorun değil, ThemeKey modülü öğesini de kullanabilirsiniz. Bu, karşılandığında temayı değiştiren koşulları ayarlamanıza olanak tanır. Yollara, sınıflandırmaya, içerik türüne, tarih oluşturma veya düzenlemeye ve daha fazlasına dayalı koşullar yapabilirsiniz. Daha da fazla seçenek elde etmek için Themekey Properties module modülüne de ekleyebilirsiniz.

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

15
Chaulky

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

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

Drupal 7 içinde hook_custom_theme() kullanın:

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

<ifadeler />

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

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

Bu kanca, geçerli sayfa isteği için temayı dinamik olarak ayarlamak için kullanılabilir. Dinamik koşullara göre temayı geçersiz kılması gereken 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 () içindeki bir tema geri arama işlevi aracılığıyla geçerli bir sayfa başına veya bölüm başına tema ayarlanmış olanlar hariç tüm sayfalarda kullanılacaktır; bu sayfalardaki temalar yalnızca hook_menu_alter () kullanılarak geçersiz kılınabilir.

Aynı yol için farklı temalar döndürmenin sayfa önbelleğe almayla ç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ı varsa, bu muhtemelen bir sorundur.

Bir seferde yalnızca bir tema kullanılabileceğ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.

7
Agi Hammerthief

Etkin temayı Drush ile değiştirme

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Etkin temayı bir modül aracılığıyla değiştirme

Varsayılan temayı 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ı varsayılan olarak güvenli bir şekilde ayarlamak için küçük bir işlev var Drupal temalar (Drupal 6 ve 7'de test edilmiştir):

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

}

Bunu 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();
}
7
Sk8erPeter

Drupal 8 için:

Settings.php içinde

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

Yapılandırmayı programlı olarak güncelle:

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