프로그래밍 방식으로 활성 Drupal 테마를 변경하는 올바른 방법은 무엇입니까?


22

활성 Drupal 테마를 프로그래밍 방식으로 변경하는 올바른 방법은 무엇입니까?

답변:


15

Drupal 6 솔루션 :

$custom_theme페이지 실행 초기에 전역 변수를 상당히 변경해야합니다 .

global $custom_theme;
$custom_theme = 'garland';

사용자 정의 모듈을 사용하는 경우 페이지 실행 초기에 시도해야 할 몇 가지 후크는 hook_boot () 및 hook_init ()입니다.
David Lanier

어디에 $custom_theme정의되어 있습니까? 테마를 변경하기에 충분합니까?
Mohammad Ali Akbari 2016 년


1
성공을 재현 할 수 없습니다. : <
starlocke 2016 년

나를 위해 일했다. hook_boot ()
Mark

15

프로그래밍 방식으로 수행하는 방법을 물었지만 실제 문제가 아닌 솔루션 인 경우 ThemeKey 모듈을 사용할 수도 있습니다 . 이를 통해 테마가 변경 될 때 조건을 설정할 수 있습니다. 경로, 분류법, 컨텐츠 유형, 날짜 작성 또는 편집 등을 기반으로 조건을 작성할 수 있습니다. 더 많은 옵션을 얻기 위해 테마 키 속성 모듈을 추가 할 수도 있습니다.

다시 말하지만 이것은 프로그래밍 방식이 아니라는 것을 알고 있지만 귀하의 질문에 대한 실제 질문이 조건에 따라 테마를 변경하는 방법인지 확실하지 않습니다.


4
예, UI를 통해이를 관리하려면 ThemeKey를 권장합니다.
Dave Reid

또는 최소한 checkout drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… 여기서 ThemeKey가 마법을
발휘합니다

@Chaulky는 옳습니다 : 얼마 후 ThemeKey를 사용하고 있습니다. 사용자 이름, 역할, 페이지 등 원하는대로 테마 사용자 정의를 관리하는 가장 쉬운 방법입니다. 제가 추천합니다.
Benj

14

이를 수행하는 가장 좋은 방법은 모듈에서 업데이트 후크를 작성하는 것입니다.

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

정답입니다 ..
Nick Barrett

테마를 전체적으로 변경하려는 경우에만 정확합니다. 질문에서 OP가 특정 페이지 또는 특정 컨텍스트에서 테마를 변경하기를 원한다고 가정했습니다.
Evan Donovan

7

Drush를 통해 활성 테마 변경

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');
Duncanmoo

7

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 ()를 사용하여 재정의 할 수 있습니다.

동일한 경로에 대해 다른 테마를 반환하면 페이지 캐싱에서 작동하지 않을 수 있습니다. 주어진 경로의 익명 사용자가 다른 조건에서 다른 테마를 리턴 할 수있는 경우 이는 문제 일 가능성이 높습니다.

한 번에 하나의 테마 만 사용할 수 있으므로이 후크에서 유효한 테마 이름을 반환하는 마지막 (가장 높은 가중치) 모듈이 우선합니다.


3

드루팔 8 :

settings.php에서

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

프로그래밍 방식으로 구성 업데이트 :

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.