Правильный способ изменить активную тему Drupal программно?

22

Как правильно изменить активную тему Drupal программно?

markdorison
источник

Ответы:

15

Drupal 6 решение:

Вы хотите убедиться, что вы изменили глобальную $custom_themeпеременную довольно рано при выполнении страницы.

global $custom_theme;
$custom_theme = 'garland';
Дейв Рид
источник
Пару хуков, которые нужно попробовать очень рано при выполнении страницы (если вы используете пользовательский модуль), это hook_boot () и hook_init ().
Дэвид Ланье
где $custom_themeопределяется? достаточно ли этого для смены темы?
Мохаммед Али Акбари
2
Пожалуйста, hook_custom_theme упомяните api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel 1.12.12
1
Не удалось воспроизвести успех. : <
Старлок
Работал на меня. Я добавил это в hook_boot ()
Марк
15

Я знаю, что вы спросили, как это сделать программно, но если это ваше решение, а не реальная проблема, вы также можете использовать модуль ThemeKey . Это позволяет вам устанавливать условия, которые, при соблюдении, меняют тему. Вы можете создавать условия, основанные на путях, таксономии, типе контента, дате создания или редактирования и многом другом. Вы также можете добавить в модуль модуля Themekey Properties, чтобы получить еще больше возможностей.

Опять же, я знаю, что это не программно, но я не уверен, что реальный вопрос, стоящий за вашим вопросом, заключается в том, как менять темы в зависимости от условий.

Chaulky
источник
4
Да, если вы хотите управлять этим через пользовательский интерфейс, я бы порекомендовал ThemeKey.
Дейв Рейд
Или, по крайней мере, проверьте drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… где ThemeKey делает свое волшебство
Capi Etheriel
@ Чолки прав: с тех пор я пользуюсь ThemeKey, это самый простой способ управлять настройками по имени пользователя, роли, странице, что угодно. Я рекомендую это.
Benj
14

Лучший способ сделать это - создать хук обновления в модуле:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
Boga
источник
Это должен быть правильный ответ ..
Ник Барретт
Это было бы правильно, если бы вы хотели изменить тему в глобальном масштабе. Из вопроса я предположил, что ФП хочет изменить тему на определенной странице или в определенном контексте.
Эван Донован
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);

Вот небольшая функция для безопасного возврата тем к темам по умолчанию на 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();
}
Sk8erPeter
источник
Это также метод, который вы бы использовали при включении темы в профиле установки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 ().

Обратите внимание, что возврат разных тем для одного и того же пути может не работать с кэшированием страниц. Это, скорее всего, будет проблемой, если анонимный пользователь по заданному пути может получить разные темы, возвращенные при разных условиях.

Поскольку одновременно может использоваться только одна тема, последний (т. Е. С наибольшим весом) модуль, который возвращает действительное имя темы из этой ловушки, будет иметь преимущественную силу.

Agi Hammerthief
источник
3

Для Drupal 8:

В settings.php

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

Обновите конфигурацию программно:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
JeroenT
источник