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

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

22 голоса | спросил markdorison 3 MaramThu, 03 Mar 2011 03:37:33 +03002011-03-03T03:37:33+03:0003 2011, 03:37:33

6 ответов


15

Решение Drupal 6:

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

$custom_theme
ответил Dave Reid 3 MaramThu, 03 Mar 2011 03:44:17 +03002011-03-03T03:44:17+03:0003 2011, 03:44:17
15

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

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

ответил Chaulky 3 MaramThu, 03 Mar 2011 04:50:57 +03002011-03-03T04:50:57+03:0004 2011, 04:50:57
14

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

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
ответил Boga 12 WedEurope/Moscow2012-12-12T18:51:03+04:00Europe/Moscow12bEurope/MoscowWed, 12 Dec 2012 18:51:03 +0400 2012, 18:51:03
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 1 SatEurope/Moscow2012-12-01T17:59:23+04:00Europe/Moscow12bEurope/MoscowSat, 01 Dec 2012 17:59:23 +0400 2012, 17:59:23
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 8 PMpTue, 08 Apr 2014 12:47:42 +040047Tuesday 2014, 12:47:42
3

Для Drupal 8:

В settings.php

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

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

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
ответил JeroenT 21 +03002016-10-21T10:55:59+03:00312016bEurope/MoscowFri, 21 Oct 2016 10:55:59 +0300 2016, 10:55:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132