web-dev-qa-db-ja.com

プログラムでアクティブなDrupalテーマを変更する正しい方法?

プログラムでアクティブなDrupalテーマを変更する正しい方法は何ですか?

22
markdorison

Drupal 6ソリューション:

グローバルを変更することを確認したい $custom_theme ページ実行のかなり早い段階で変数。

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

プログラムでそれを行う方法を尋ねたのはわかっていますが、それがあなたの解決策であり、実際の問題ではない場合は、 ThemeKeyモジュール を使用することもできます。これにより、条件を満たすとテーマを変更する条件を設定できます。パス、分類法、コンテンツタイプ、作成日または編集日などに基づいて条件を作成できます。 Themekeyプロパティモジュール モジュールに追加して、さらに多くのオプションを取得することもできます。

繰り返しになりますが、これはプログラム上ではないことはわかっていますが、質問の背後にある本当の質問が、条件に基づいてテーマを変更する方法であるかどうかはわかりません。

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()。を使用してのみオーバーライドできます。

同じパスに対して異なるテーマを返すと、ページキャッシングでは機能しない場合があります。これは、特定のパスの匿名ユーザーが異なる条件下で異なるテーマを返す可能性がある場合に問題になる可能性が最も高くなります。

一度に使用できるテーマは1つだけなので、このフックから有効なテーマ名を返す最後の(つまり、最も重みの大きい)モジュールが優先されます。

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