วิธีที่ถูกต้องในการเปลี่ยนชุดรูปแบบ Drupal ที่ใช้งานโดยทางโปรแกรมหรือไม่


22

วิธีที่ถูกต้องในการเปลี่ยนชุดรูปแบบ Drupal ที่ใช้งานโดยทางโปรแกรมคืออะไร

คำตอบ:


15

โซลูชัน Drupal 6:

คุณต้องการตรวจสอบให้แน่ใจว่าคุณเปลี่ยน$custom_themeตัวแปรโกลบอลในช่วงต้นของการเรียกใช้หน้าเว็บ

global $custom_theme;
$custom_theme = 'garland';

มีตะขอสองอันที่จะลองใช้ในการเรียกใช้หน้าเว็บ (ถ้าคุณใช้โมดูลที่กำหนดเอง) ซึ่ง ได้แก่ hook_boot () และ hook_init ()
David Lanier

ที่ถูก$custom_themeกำหนดไว้? มันเพียงพอสำหรับการเปลี่ยนธีมหรือไม่?
Mohammad Ali Akbari

2
กรุณาพูดถึงhook_custom_theme api.drupal.org/api/drupal/modules%21system%21system.api.php/…
Capi Etheriel

1
ไม่สามารถทำซ้ำความสำเร็จ : <
starlocke

ทำงานให้ฉัน ฉันเพิ่มมันในhook_boot ()
Mark

15

ฉันรู้ว่าคุณถามว่าจะทำอย่างไรในทางโปรแกรม แต่ในกรณีที่เป็นทางออกของคุณไม่ใช่ปัญหาจริงคุณสามารถใช้โมดูล ThemeKeyได้ สิ่งนี้อนุญาตให้คุณตั้งเงื่อนไขซึ่งเมื่อพบจะเปลี่ยนธีม คุณสามารถกำหนดเงื่อนไขตามเส้นทางอนุกรมวิธานประเภทเนื้อหาสร้างหรือแก้ไขวันที่และอื่น ๆ คุณยังสามารถเพิ่มในโมดูลโมดูลThemekeyเพื่อรับตัวเลือกเพิ่มเติม

อีกครั้งฉันรู้ว่านี่ไม่ใช่เชิงโปรแกรม แต่ฉันไม่แน่ใจว่าคำถามจริงที่อยู่เบื้องหลังคำถามของคุณคือวิธีการเปลี่ยนธีมตามเงื่อนไข


4
ใช่ถ้าคุณต้องการจัดการสิ่งนี้ผ่าน UI ฉันขอแนะนำ ThemeKey
Dave Reid

หรืออย่างน้อยก็เช็คเอาท์drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:/…โดยที่ ThemeKey ทำเวทมนต์
Capi Etheriel

@Chaulky ถูกต้อง: ฉันใช้ ThemeKey มาระยะหนึ่งแล้วมันเป็นวิธีที่ง่ายที่สุดในการจัดการการกำหนดค่าเองตามชื่อผู้ใช้บทบาทหน้าหรืออะไรก็ตามที่คุณต้องการ ฉันแนะนำมัน
เบ็ก

14

วิธีที่ดีที่สุดในการทำเช่นนี้คือการสร้างเบ็ดการอัพเดทในโมดูล:

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

นี้ควรจะเป็นคำตอบที่ถูกต้อง ..
นิคบาร์เร็ตต์

สิ่งนี้จะถูกต้องถ้าคุณต้องการเปลี่ยนชุดรูปแบบทั่วโลก ฉันสันนิษฐานจากคำถามที่ว่า OP ต้องการเปลี่ยนธีมในหน้าใดหน้าหนึ่งหรือในบริบทเฉพาะ
Evan Donovan

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

นี่เป็นวิธีการที่คุณจะใช้เมื่อเปิดใช้งานชุดรูปแบบในโปรไฟล์การติดตั้ง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;
}

ดัดแปลงมาจาก<อิโมติคอน />

ส่งคืนชื่อธีมที่เครื่องสามารถอ่านได้เพื่อใช้สำหรับหน้าปัจจุบัน

ความคิดเห็นสำหรับฟังก์ชั่นนี้อาจคุ้มค่าที่จะอ่าน:

hook นี้สามารถใช้เพื่อตั้งค่าธีมสำหรับคำขอหน้าปัจจุบัน ควรใช้โดยโมดูลที่ต้องการแทนที่ธีมตามเงื่อนไขแบบไดนามิก (ตัวอย่างเช่นโมดูลที่อนุญาตให้ธีมตั้งค่าตามบทบาทของผู้ใช้ปัจจุบัน) ค่าส่งคืนของ hook นี้จะถูกใช้ในทุกหน้ายกเว้นที่มีชุดรูปแบบต่อหน้าหรือต่อส่วนที่ถูกต้องผ่านฟังก์ชั่นการโทรกลับใน hook_menu (); ธีมในหน้าเหล่านั้นสามารถเขียนทับได้โดยใช้ hook_menu_alter ()

โปรดทราบว่าการส่งคืนธีมที่แตกต่างกันสำหรับเส้นทางเดียวกันอาจใช้ไม่ได้กับการแคชหน้า นี่น่าจะเป็นปัญหามากที่สุดหากผู้ใช้ที่ไม่ระบุชื่อบนเส้นทางที่กำหนดสามารถส่งคืนธีมต่าง ๆ ภายใต้เงื่อนไขที่ต่างกัน

เนื่องจากสามารถใช้ชุดรูปแบบได้ครั้งละหนึ่งเท่านั้นเท่านั้นโมดูลสุดท้าย (กล่าวคือน้ำหนักสูงสุด) ซึ่งส่งคืนชื่อชุดรูปแบบที่ถูกต้องจาก hook นี้จะมีผลบังคับใช้มากกว่า


3

สำหรับ Drupal 8:

ใน settings.php

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

อัปเดตการกำหนดค่าโดยทางโปรแกรม:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.