Etkin Drupal temasını programlı olarak değiştirmenin doğru yolu nedir?
Etkin Drupal temasını programlı olarak değiştirmenin doğru yolu nedir?
Yanıtlar:
Drupal 6 çözümü:
Genel $custom_theme
değ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';
$custom_theme
tanımlanır tema değiştirmek için yeterli mi?
hook_custom_theme
api.drupal.org/api/drupal/modules%21system%21system.api.php/…
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.
Bunu yapmanın en iyi yolu bir modülde güncelleme kancası oluşturmaktır:
function yourmodule_update_N() {
variable_set('theme_default','yourtheme');
}
drush vset theme_default garland
drush vset admin_theme garland
drush cc all
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();
}
variable_set('theme_default','yourtheme');
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.