답변:
Drupal 6 솔루션 :
$custom_theme
페이지 실행 초기에 전역 변수를 상당히 변경해야합니다 .
global $custom_theme;
$custom_theme = 'garland';
$custom_theme
정의되어 있습니까? 테마를 변경하기에 충분합니까?
hook_custom_theme
api.drupal.org/api/drupal/modules%21system%21system.api.php/...
프로그래밍 방식으로 수행하는 방법을 물었지만 실제 문제가 아닌 솔루션 인 경우 ThemeKey 모듈을 사용할 수도 있습니다 . 이를 통해 테마가 변경 될 때 조건을 설정할 수 있습니다. 경로, 분류법, 컨텐츠 유형, 날짜 작성 또는 편집 등을 기반으로 조건을 작성할 수 있습니다. 더 많은 옵션을 얻기 위해 테마 키 속성 모듈을 추가 할 수도 있습니다.
다시 말하지만 이것은 프로그래밍 방식이 아니라는 것을 알고 있지만 귀하의 질문에 대한 실제 질문이 조건에 따라 테마를 변경하는 방법인지 확실하지 않습니다.
이를 수행하는 가장 좋은 방법은 모듈에서 업데이트 후크를 작성하는 것입니다.
function yourmodule_update_N() {
variable_set('theme_default','yourtheme');
}
drush vset theme_default garland
drush vset admin_theme garland
drush cc all
기본 테마 및 관리 테마를 변경하는 기본 사항 :
// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);
다음은 Bartik 또는 Garland와 같은 Drupal 테마를 Drupal 6 및 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
)));
}
hook_init () 구현 에서 호출 할 수 있습니다 ( 필요하지 않은 경우 주석 처리).
/**
* 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에서 다음을 사용하십시오 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 /> 에서 적응
현재 페이지에 사용할 기계 판독 가능 테마 이름을 리턴하십시오.
이 기능에 대한 주석은 읽을 가치가 있습니다.
이 후크는 현재 페이지 요청에 대한 테마를 동적으로 설정하는 데 사용될 수 있습니다. 동적 조건에 따라 테마를 대체해야하는 모듈 (예 : 현재 사용자의 역할에 따라 테마를 설정할 수있는 모듈)에서 사용해야합니다. 이 후크의 리턴 값은 hook_menu ()의 테마 콜백 함수를 통해 유효한 페이지 별 또는 섹션 별 테마가있는 페이지를 제외한 모든 페이지에서 사용됩니다. 해당 페이지의 테마는 hook_menu_alter ()를 사용하여 재정의 할 수 있습니다.
동일한 경로에 대해 다른 테마를 반환하면 페이지 캐싱에서 작동하지 않을 수 있습니다. 주어진 경로의 익명 사용자가 다른 조건에서 다른 테마를 리턴 할 수있는 경우 이는 문제 일 가능성이 높습니다.
한 번에 하나의 테마 만 사용할 수 있으므로이 후크에서 유효한 테마 이름을 반환하는 마지막 (가장 높은 가중치) 모듈이 우선합니다.