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


22

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

Відповіді:


15

Рішення Drupal 6:

Ви хочете переконатися, що ви $custom_themeдосить швидко змінили глобальну змінну на початку виконання сторінки.

global $custom_theme;
$custom_theme = 'garland';

Кілька гачків, які слід спробувати на початку виконання сторінки (якщо ви користуєтеся спеціальним модулем), є hook_boot () та ho__it ().
Девід Ланьє

де $custom_themeвизначено? чи достатньо для зміни теми?
Мохаммед Алі Акбарі

2
hook_custom_theme Згадайте,
Capi Etheriel

1
Не вдалося відтворити успіх. : <
starlocke

Працювали для мене. Я додав його у mock_boot ()
Марк

15

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

Знову ж таки, я знаю, що це не програмно, але я не впевнений, що справжнє питання, що стоїть за вашим запитанням, полягає в тому, як змінювати теми на основі умов.


4
Так, якщо ви хочете керувати цим через інтерфейс, я рекомендую ThemeKey.
Дейв Рейд

Або принаймні замовити drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/… де ThemeKey робить свою магію
Capi Etheriel

@Chaulky правий: я використовую ThemeKey з деякого часу, це найпростіший спосіб керувати налаштуваннями тематики за іменем користувача, роллю, сторінкою, що завгодно. Рекомендую.
Benj

14

Найкращий спосіб зробити це - створити гачок оновлення в модулі:

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

Це має бути правильна відповідь ..
Нік Барретт

Це було б правильно, лише якщо ви хочете змінити тему глобально. З питання я припустив, що ОП хоче змінити тему на певній сторінці або в певному контексті.
Еван Донован

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

}

Ви можете зателефонувати йому у впровадженні куки_ініт () (коментуйте це після того, як це не потрібно):

/**
 * 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;
}

Адаптовано з <емотикода />

Поверніть машиночитану назву теми для використання на поточній сторінці.

Коментарі до цієї функції, можливо, варто прочитати:

Цей гачок можна використовувати для динамічного встановлення теми для поточного запиту на сторінку. Він повинен використовуватися модулями, які потребують переосмислення теми на основі динамічних умов (наприклад, модуль, який дозволяє встановлювати тему на основі ролі поточного користувача). Повернене значення цього гака використовуватиметься на всіх сторінках, за винятком тих, які мають дійсну тему на кожну сторінку або на секцію за допомогою функції зворотного виклику теми в mook_menu (); теми на цих сторінках можна змінити лише за допомогою гачка_menu_alter ().

Зауважте, що повернення різних тем для одного шляху може не працювати з кешуванням сторінок. Це, швидше за все, проблема, якщо анонімний користувач на певному шляху може мати різні теми, повернуті за різних умов.

Оскільки одночасно може використовуватися лише одна тема, переважатиме останній (тобто найбільш зважений) модуль, який повертає дійсне ім'я теми з цього гака.


3

Для Drupal 8:

В налаштуваннях.php

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

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

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.