it-swarm-ko.tech

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

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

22
markdorison

Drupal 6 솔루션 :

전역을 변경하고 싶습니다 $custom_theme 페이지 실행 초기에 변수입니다.

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

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

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

15
Chaulky

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

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

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

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

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

7
Agi Hammerthief

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

다음은 테마를 기본값으로 안전하게 다시 설정하는 작은 기능입니다. Drupal Bartik 또는 Garland와 같은 테마 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();
}
7
Sk8erPeter

Drupal 8 :)의 경우

Settings.php에서

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

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

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