ฉันจะเปลี่ยนธีมตาม URL ได้อย่างไร


38

ฉันมีอินสแตนซ์ของ Drupal ทำงานบน example.org ซึ่งมี Theme X ติดตั้งและเปิดใช้งาน ตอนนี้ในระยะเวลาที่ จำกัด เหตุการณ์ที่ควรจะจัดขึ้นในเว็บไซต์ที่มีส่วนพิเศษที่ได้รับ "แกะสลักออก" ทุกสิ่งที่เกี่ยวข้องกับเหตุการณ์นั้นจะไปที่ example.org/event2011

ฉันต้องการให้มีชุดรูปแบบที่แตกต่างกันที่จะแสดงเมื่อใดก็ตามที่มีการดูหน้าเว็บในส่วนนี้ (เช่นhttp://example.org/event2011/about , http://example.org/event2011/node/123 ) ฉันจะทำอย่างไร

ฉันผ่านหลาย ๆ โมดูลแล้ว แต่ก็ไม่มีใครสนับสนุน Drupal 7 โดยเฉพาะอย่างยิ่งฉันอยากให้มันใช้โมดูลและไม่ต้องการเปลี่ยนแปลงตนเองในระดับรหัส


1
คุณกำลังมองหาเว็บไซต์แยกต่างหากภายใต้ path / event2011 / node / 123 หรือไม่?
Jeremy French

คำตอบ:


33

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

มันก็เพียงพอที่จะดำเนินการhook_custom_theme()ดังต่อไปนี้:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'the theme to use for that page';
  }
}

หากคุณต้องการเปลี่ยนธีมเฉพาะสำหรับhttp://example.com/event2011แต่ไม่ใช่สำหรับhttp://example.com/event2011/node/123รหัสนั้นควรเปลี่ยนเป็น

function mymodule_custom_theme() {
  if (arg(0) == 'event2011' && !arg(1)) {
    return 'the theme to use for that page';
  }
}

สำหรับการใช้ชุดรูปแบบการโทรกลับในคำจำกัดความของการเรียกกลับเมนูเอกสารกล่าวว่า:

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


ฉันจะแนะนำ current_path () ฟังก์ชันapi.drupal.org/api/drupal/includes%21path.inc/function/... คุณจะมีเงื่อนไข "สำหรับ" ได้ง่ายขึ้น
สิงหาคม

22

วิธีการแก้ปัญหาที่กำหนดเองเช่นความคิดเห็นอื่น ๆ แสดงให้เห็นน่าจะดีที่สุด แต่ถ้าคุณอยากที่จะใช้โมดูลทางออกที่ดีที่สุดของคุณคือThemeKey ตั้งแต่วันที่ 5/23/11 มีการปล่อยที่เสถียร


8

หรือคุณสามารถใช้theme callbackตัวเลือกใหม่ของระบบเมนูhook_menu_alter()ตามที่อธิบายไว้ด้านล่าง ps Checkout hook_menu ()สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับtheme callback

<?php
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
  // Set the theme callback function for all node pages. As per the
  // standard behavior for hook_menu() properties, this will be
  // inherited by all paths underneath node/%node as well, unless
  // they define their own theme callback.
  $items['node/%node']['theme callback'] = 'mymodule_default_node_theme';

  // Set a different theme callback for node edit pages, and pass
  // along the node object to this function so we can make decisions
  // based on it.
  $items['node/%node/edit']['theme callback'] = 'mymodule_edit_node_theme';
  $items['node/%node/edit']['theme arguments'] = array(1);
}
/**
* Defaults to using the 'some_theme' theme for node pages.
*/
function mymodule_default_node_theme() {
  return 'some_theme';
}

/**
* For editing page nodes, uses the 'some_other_theme' theme.
*/
function mymodule_edit_node_theme($node) {
  return $node->type == 'page' ? 'some_other_theme' : mymodule_default_node_theme();
}
?>

นอกจากนี้ยังมีตัวอย่างของการใช้แบบดั้งเดิมมากขึ้น hook_custom_theme()

<?php 
/**
* Implements hook_custom_theme().
*/
function mymodule_custom_theme() {
  // check path using arg(0)
  // check $user
  // do whatever special checking you want and simply return theme key (name of theme folder most of the time)
    return 'special_theme';
  }
}
?>

นำมาจาก: http://drupal.org/node/224333#custom_theme


6

คุณสามารถใช้บริบทและใช้ชุดรูปแบบเพื่อนำไปใช้เมื่อเส้นทางคือ / event2011 / คุณสามารถกำหนดเส้นทางให้อยู่ในสภาพของ cotext และเปลี่ยนธีมในการกระทำของเนื้อหา นี่คือคุณสามารถสลับระหว่างชุดรูปแบบบนไซต์ตาม URL ได้อย่างง่ายดาย แม้ใช้งานได้กับโทรศัพท์มือถือ;)


การกระทำของชุดรูปแบบจะส่งผ่านตัวแปรที่กำหนดเองไปยังชุดรูปแบบ แต่จริงๆแล้วมันจะไม่เปลี่ยนเลย
Alex Weber

6

การใช้ThemeKeyนั้นง่ายและเป็นโมดูลที่ได้รับความนิยมและทรงพลังที่สุด (ด้วยการสนับสนุน 8.x) สำหรับกฎการสลับธีมซึ่งอนุญาตให้เลือกธีมโดยอัตโนมัติขึ้นอยู่กับพา ธ ปัจจุบันเงื่อนไขการใช้ภาษาภาษาโหนดประเภทและอื่น ๆ คุณสมบัติอื่น ๆ อีกมากมาย นอกจากนี้ยังสามารถขยายได้อย่างง่ายดายเพื่อรองรับคุณสมบัติเพิ่มเติมที่เปิดเผยโดยโมดูลอื่น นอกเหนือจากคุณสมบัติมาตรฐาน ThemeKey จะขยายคุณสมบัติของโมดูล contrib โดยอัตโนมัติและมีโมดูลที่ขยายเพิ่มเติม

การใช้งาน (7.x)

admin/config/user-interface/themekeyหลังจากเปิดใช้งานโมดูลไป มีตัวเลือกมากมายสำหรับการสลับธีม แต่คุณอาจสนใจpath:node_aliasดังนั้นให้ตั้งค่าตามที่คุณต้องการเช่นคุณพูด / my_url แล้วเลือกธีมที่คุณต้องการเปิดใช้งานที่ url นี้ นอกจากนี้คุณยังสามารถใช้สัญลักษณ์แทนเช่นหรือweb/*/^web/.*

ตรวจสอบ: โหลดธีมสำหรับพา ธ อย่างไร

การใช้งานขั้นสูง

ThemeKey 7.x มีโมดูลเสริมที่เรียกว่า ThemeKey Example เพื่อสาธิตวิธีการขยาย ThemeKey ให้กับนักพัฒนา

ช่วยเหลือ (7.x)

ลองดูวิดีโอบทแนะนำโดย Mustardseed (7.x)

/admin/help/themekeyความช่วยเหลือเพิ่มเติมในหัวข้อที่สามารถพบได้ที่

ตรวจสอบคำถาม SE อื่น ๆ ที่เกี่ยวข้องกับรูปแบบ


นอกจากนี้ยังมีSwitchtheme (7.x) ซึ่งเพิ่มบล็อกเพื่อให้ผู้ใช้สามารถสลับระหว่างธีมที่เปิดใช้งาน


5

เมื่อใช้ชื่อแทน URLหรือโมดูล Pathautoให้ระวังรายละเอียดปลีกย่อยและความแตกต่างเมื่อใช้ส่วนประกอบของเส้นทาง Drupal ปัจจุบัน

มีสถานการณ์ที่คุณอาจไม่ต้องการที่จะใช้หาเรื่อง () อันที่จริงแล้วเอกสารของ Drupal API แนะนำให้หลีกเลี่ยงการใช้ฟังก์ชั่นนี้หากทำได้เนื่องจากโค้ดที่อ่านยาก

ลองพิจารณาตัวอย่างต่อไปนี้ตามที่kiamlalunoเสนอ:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

ใน Drupal 7 หากโหนดมีนามแฝงของevent2011 การใช้arg(0)จะส่งคืนnodeเป็นองค์ประกอบ URL แรกซึ่งตรงข้ามกับนามแฝง

print_r(arg(0));

Array
(
    [0] => node
    [1] => 150
)

แต่ถ้าคุณจำเป็นต้องทำงานร่วมกับนามแฝงมีหลายวิธีที่จะได้รับ URL ปัจจุบันใน Drupalรวมทั้งmenu_get_object(), current_path(), request_path()และอื่น ๆ

ต่อไปนี้เป็นตัวอย่างการทำงานซ้ำที่ใช้นามแฝงเป็นทริกเกอร์สำหรับเปลี่ยนธีม:

function mymodule_custom_theme() {
  $current_page_path = explode('/', request_path());      

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

3

วิธีเปลี่ยนธีมขึ้นอยู่กับบทบาทของผู้ใช้:

สร้างโมดูลที่กำหนดเองและคัดลอกและวางต่อไปนี้:

<?php
/**
 * Implementation of hook_init().
 */
function mymodule_init() {
  global $custom_theme, $user;
  if (in_array('my special role', $user->roles)) {
    $custom_theme = 'mytheme';
  }
}
?>

คุณต้องแทนที่:

mymodule => พร้อมชื่อโมดูลของคุณ

บทบาทพิเศษของฉัน => พร้อมชื่อของบทบาทที่ผู้ใช้ของคุณจะต้องมีเพื่อให้พวกเขาเห็นธีมที่แตกต่าง

mytheme => ด้วยชื่อของชุดรูปแบบที่คุณต้องการเปลี่ยนเป็น


1

คุณสามารถใช้โมดูลชุดรูปแบบหน้าเพื่อให้บรรลุอย่างนั้น

โมดูลชุดรูปแบบหน้าเป็นโมดูลที่ใช้งานง่ายและสะดวกซึ่งอนุญาตให้ใช้ชุดรูปแบบที่แตกต่างจากค่าเริ่มต้นของไซต์ในหน้าเฉพาะ

คุณสมบัติ

  • กำหนดธีมให้กับหน้าเดียวหรือรายการหน้า (ตั้งค่าหน้าเป็นเส้นทาง Drupal)
  • อนุญาตให้ใช้อักขระ '*' เป็นอักขระตัวแทนในเส้นทาง Drupal
  • อนุญาตให้จัดเรียงธีม (หากมีการกำหนดหลายหน้าธีมแรกในรายการจะถูกนำมาใช้)
  • อนุญาตให้เปิด / ปิดธีม
  • สามเณร Drupal เป็นมิตร

0

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

คุณสมบัติ:

กำหนดธีมให้กับหน้าเดียวหรือรายการหน้า (ตั้งค่าหน้าเป็นเส้นทาง Drupal) อนุญาตให้ใช้อักขระ '*' เป็นอักขระตัวแทนในเส้นทาง Drupal อนุญาตให้จัดเรียงธีม (หากมีการกำหนดหลายหน้าธีมแรกในรายการจะถูกนำมาใช้) อนุญาตให้เปิด / ปิดธีม สามเณร Drupal เป็นมิตร

ตามที่คุณจะสามารถใช้: ส่วนที่มีคุณสมบัติส่วนใหญ่เหมือนกับชุดรูปแบบหน้า แต่เพิ่มการเลือกตามบทบาทและพื้นที่ "ข้อมูลโค้ด" เพื่อเลือกชุดรูปแบบ

แต่ถ้าคุณต้องการใช้ชุดรูปแบบที่แตกต่างจากค่าเริ่มต้นของไซต์ในการสร้างเนื้อหาการแก้ไขและการดูหน้าคุณสามารถใช้ ชุดรูปแบบเนื้อหาที่อนุญาตให้ใช้ชุดรูปแบบที่แตกต่างจากค่าเริ่มต้นของไซต์ในการสร้างการแก้ไขและการดูหน้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.