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


22

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

Câu trả lời:


15

Giải pháp Drupal 6:

Bạn muốn đảm bảo rằng bạn thay đổi $custom_themebiến toàn cục khá sớm khi thực hiện trang.

global $custom_theme;
$custom_theme = 'garland';

Một vài hook để thử rất sớm trong việc thực thi trang (nếu bạn đang sử dụng một mô-đun tùy chỉnh) là hook_boot () và hook_init ().
David Lanier

được $custom_themeđịnh nghĩa ở đâu? Là đủ để thay đổi chủ đề?
Mohammad Ali Akbari

2
Vui lòng, đề cập đến hook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/ợi
Capi Etheriel

1
Không thể tái tạo thành công. : <
starlocke

Đã làm cho tôi. Tôi đã thêm nó trong hook_boot ()
Đánh dấu

15

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 -đ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.


4
Vâng, nếu bạn muốn quản lý điều này thông qua UI, tôi khuyên dùng ThemeKey.
Dave Reid

Hoặc lúc thanh toán ít nhất drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/... nơi ThemeKey hiện magic của nó
Capi Etheriel

@Chaulky đã đúng: Tôi đang sử dụng ThemeKey một thời gian, đây là cách dễ nhất để quản lý các tùy chỉnh theo chủ đề theo tên người dùng, vai trò, trang, bất cứ điều gì bạn muốn. Tôi khuyến khích điều đó.
Benj

14

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

Đây phải là câu trả lời đúng ..
Nick Barrett

Điều này sẽ chỉ chính xác nếu bạn muốn thay đổi chủ đề trên toàn cầu. Tôi đã giả định từ câu hỏi rằng OP muốn thay đổi chủ đề trên một trang cụ thể hoặc trong một bối cảnh cụ thể.
Evan Donovan

7

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 cho các chủ đề Drupal mặc định như Bartik hoặc Garland (được 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 triển khai hook_init () (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();
}

Đây cũng là phương pháp bạn sẽ sử dụng khi bật chủ đề trong cấu hình cài đặtvariable_set('theme_default','yourtheme');
Duncanmoo

7

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ế.


3

Đối với 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.