it-swarm-vi.com

Cách chính xác để thay đổi chủ đề Drupal theo chương trình?

Cách chính xác để thay đổi chủ đề Drupal theo chương trình là gì?

22
markdorison

Giải pháp Drupal 6:

Bạn muốn chắc chắn rằng bạn thay đổi toàn cầu $custom_theme biến khá sớm trong thực thi trang.

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

Tôi biết bạn đã hỏi cách thực hiện theo chương trình, nhưng trong trường hợp đó là giải pháp của bạn, không phải là vấn đề thực tế, bạn cũng có thể sử dụng mô-đun ThemeKey . Điều này cho phép bạn đặt các điều kiện, khi được đáp ứng, sẽ thay đổi chủ đề. Bạn có thể tạo điều kiện dựa trên đường dẫn, phân loại, loại nội dung, tạo hoặc chỉnh sửa ngày và hơn thế nữa. Bạn cũng có thể thêm vào mô-đun mô-đun Themekey Properties để có thêm nhiều tùy chọn.

Một lần nữa, tôi biết điều này không phải là lập trình, nhưng tôi không chắc câu hỏi thực sự đằng sau câu hỏi của bạn là làm thế nào để thay đổi chủ đề dựa trên các điều kiện.

15
Chaulky

Cách tốt nhất để làm điều này là tạo một móc cập nhật trong một mô-đun:

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

Trong Drupal 7, sử dụng 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;
}

Chuyển thể từ <biểu tượng cảm xúc />

Trả lại tên có thể đọc được của chủ đề để sử dụng cho trang hiện tại.

Các ý kiến ​​cho chức năng này có thể đáng đọc:

Móc này có thể được sử dụng để tự động đặt chủ đề cho yêu cầu trang hiện tại. Nó nên được sử dụng bởi các mô-đun cần ghi đè chủ đề dựa trên các điều kiện động (ví dụ: mô-đun cho phép đặt chủ đề dựa trên vai trò của người dùng hiện tại). Giá trị trả về của hook này sẽ được sử dụng trên tất cả các trang trừ những trang có chủ đề hợp lệ trên mỗi trang hoặc mỗi phần thông qua chức năng gọi lại chủ đề trong hook_menu (); các chủ đề trên các trang đó chỉ có thể được ghi đè bằng hook_menu_alter ().

Lưu ý rằng việc trả về các chủ đề khác nhau cho cùng một đường dẫn có thể không hoạt động với bộ đệm ẩn trang. Đây rất có thể là một vấn đề nếu một người dùng ẩn danh trên một đường dẫn cụ thể có thể có các chủ đề khác nhau được trả về trong các điều kiện khác nhau.

Vì chỉ có một chủ đề có thể được sử dụng tại một thời điểm, mô-đun cuối cùng (nghĩa là có trọng số cao nhất) trả về tên chủ đề hợp lệ từ móc này sẽ chiếm ưu thế.

7
Agi Hammerthief

Thay đổi chủ đề hoạt động thông qua Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Thay đổi chủ đề hoạt động thông qua một mô-đun

Những điều cơ bản của việc thay đổi chủ đề mặc định và chủ đề quản trị:

// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);

Đây là một chức năng nhỏ để đặt lại các chủ đề một cách an toàn về mặc định Drupal chủ đề như Bartik hoặc Vòng hoa (đã thử nghiệm trong Drupal 6 và 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
  )));

}

Bạn có thể gọi nó trong một hook_init () triển khai (nhận xét nó sau khi không cần thiết):

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

Cho Drupal 8:

Trong cài đặt.php

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

Cập nhật cấu hình theo chương trình:

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