it-swarm-vi.com

Làm cách nào để thay đổi chủ đề dựa trên URL?

Tôi có một Drupal dụ chạy trên example.org. Đã cài đặt và kích hoạt chủ đề X. Bây giờ trong một khoảng thời gian giới hạn, một sự kiện được cho là sẽ được tổ chức trên trang web có phần đặc biệt được "khắc ra." Tất cả những điều liên quan đến sự kiện đó sẽ được gửi tới example.org/event2011.

Tôi muốn có một chủ đề khác được hiển thị mỗi khi một trang trong phần này được xem (ví dụ http://example.org/event2011/about , http://example.org/event2011/nút/12 ). Làm thế nào để làm điều đó?

Tôi đã trải qua nhiều mô-đun, nhưng không có mô-đun nào hỗ trợ Drupal 7. Tốt hơn là tôi muốn nó được thực hiện bằng cách sử dụng các mô-đun và không muốn thay đổi bất cứ điều gì của tôi ở cấp mã .

38
Samyak Bhuta

Xem xét rằng sự thay đổi là trong một khoảng thời gian giới hạn và việc triển khai mã đó không phải là difficulT, tôi đề nghị thực hiện một mô-đun tùy chỉnh thay đổi chủ đề đang được sử dụng cho các trang cụ thể.

Nó là đủ để thực hiện hook_custom_theme() như sau:

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

Nếu bạn chỉ cần thay đổi chủ đề cho http://example.com/event2011 , nhưng không phải cho http://example.com/event2011/node/12 , sau đó mã nên được thay đổi thành

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

Đối với việc sử dụng các cuộc gọi lại chủ đề trong định nghĩa của một cuộc gọi lại menu, tài liệ nói:

Theo nguyên tắc chung, việc sử dụng các hàm gọi lại chủ đề nên được giới hạn ở các trang có chức năng được liên kết chặt chẽ với một chủ đề cụ thể, vì chúng chỉ có thể bị ghi đè bởi các mô-đun nhắm mục tiêu các trang đó trong hook_menu_alter(). Các mô-đun triển khai chức năng chuyển đổi chủ đề chung hơn (ví dụ: mô-đun cho phép chủ đề được đặt tự động dựa trên vai trò của người dùng hiện tại) nên sử dụng hook_custom_theme() thay thế.

33
kiamlaluno

Một giải pháp tùy chỉnh như các bình luận khác gợi ý có lẽ là tốt nhất, nhưng nếu bạn thực sự muốn sử dụng một mô-đun, đặt cược tốt nhất của bạn là ThemeKey . Tính đến ngày 23/11, nó đã có một bản phát hành ổn định.

22
tim.plunkett

Ngoài ra, bạn có thể sử dụng tùy chọn theme callback Mới của hệ thống menu hook_menu_alter() như được nêu dưới đây. p.s Checkout hook_menu () để biết thêm chi tiết về 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();
}
?>

Ngoài ra, cũng có một ví dụ về việc sử dụng hook_custom_theme() truyền thống hơn

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

Lấy từ: http://drupal.org/node/224333#custom_theme

8
electblake

Sử dụng ThemeKey là đơn giản và là mô-đun phổ biến và mạnh mẽ nhất cho đến nay (có hỗ trợ cho 8.x) để chuyển đổi chủ đề quy tắc cho phép tự động lựa chọn một chủ đề tùy thuộc vào đường dẫn hiện tại, thuật ngữ phân loại, ngôn ngữ, loại nút và nhiều, nhiều thuộc tính khác. Nó cũng có thể dễ dàng được mở rộng để hỗ trợ các thuộc tính bổ sung được hiển thị bởi các mô-đun khác. Bên cạnh các tính năng tiêu chuẩn, ThemeKey sẽ tự động mở rộng các tính năng của nhiều mô-đun đóng góp và có các mô-đun mở rộng nó.

Cách sử dụng (7.x)

Sau khi kích hoạt mô-đun, đi đến admin/config/user-interface/themekey. Có nhiều tùy chọn để chuyển đổi chủ đề, nhưng có lẽ bạn sẽ quan tâm với path:node_alias, vì vậy hãy đặt giá trị như bạn muốn như bạn nói/my_url và sau đó chọn chủ đề bạn muốn bật tại url này. Bạn cũng có thể sử dụng các ký tự đại diện như web/* hoặc là /^web/.*.

Kiểm tra: Cách tải một chủ đề cho đường dẫn

Sử dụng nâng cao

ThemeKey 7.x chứa một mô-đun tùy chọn có tên là ThemeKey Ví dụ để trình bày cho các nhà phát triển cách mở rộng ThemeKey.

Trợ giúp (7.x)

Hãy xem video hướng dẫn của Mustardseed (7.x).

Có thể tìm thêm trợ giúp về chủ đề đó tại /admin/help/themekey.

Đồng thời kiểm tra các câu hỏi SE khác liên quan đến themekey .


Ngoài ra, còn có Switchtheme (7.x) có thêm một khối để cho phép người dùng chuyển đổi giữa các chủ đề được bật.

6
kenorb

Bạn chỉ có thể sử dụng Ngữ cảnh và sử dụng chủ đề để được áp dụng khi đường dẫn là/event2011/bạn có thể đơn giản đặt đường dẫn trong điều kiện của cotext và thay đổi chủ đề trong hành động của nội dung. Điều này là bạn có thể rất dễ dàng chuyển đổi giữa các chủ đề trên một trang web dựa trên URL. Thậm chí hoạt động cho điện thoại di động;)

6
Amitav Roy

Khi sử dụng bí danh URL hoặc mô-đun Pathauto , hãy lưu ý đến sự tinh tế và khác biệt khi sử dụng các thành phần của đường dẫn hiện tại Drupal.

Có những tình huống mà bạn có thể không muốn sử dụng arg () . Trên thực tế, tài liệu API Drupal thực sự đề nghị tránh sử dụng chức năng này khi có thể, vì mã kết quả rất khó đọc.

Hãy xem xét ví dụ sau, như được đề xuất bởi kiamlaluno :

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

Trong Drupal 7, nếu một nút có bí danh là event2011, sử dụng arg(0) sẽ trả về node làm đầu tiên Thành phần URL, trái ngược với bí danh.

print_r(arg(0));

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

Thay vào đó, nếu bạn cần làm việc với bí danh thì có một số cách để lấy URL hiện tại trong Drupal , bao gồm menu_get_object(), current_path(), request_path() và những người khác.

Đây là một ví dụ được làm việc lại sử dụng bí danh làm trình kích hoạt để chuyển đổi chủ đề:

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

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

Cách chuyển đổi chủ đề tùy thuộc vào vai trò của người dùng:

Tạo một mô-đun tùy chỉnh và sao chép và dán như sau:

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

Bạn phải thay thế:

mymodule => với tên mô-đun của bạn

vai trò đặc biệt của tôi => với tên của vai trò mà người dùng của bạn sẽ cần phải có để họ thấy một chủ đề khác.

mytheme => với tên của chủ đề bạn muốn chuyển sang

3
drupalfever

Bạn có thể sử dụng mô đun Chủ đề trang để đạt được chính xác điều đó

Mô-đun Chủ đề Trang là một mô-đun đơn giản và dễ sử dụng, cho phép sử dụng các chủ đề khác với mặc định của trang trên các trang cụ thể.

Đặc trưng

  • Chỉ định một chủ đề cho một trang hoặc danh sách các trang. (Đặt trang là a Drupal)
  • Cho phép sử dụng ký tự '*' làm ký tự đại diện trong các đường dẫn Drupal.
  • Cho phép sắp xếp các chủ đề. (Nếu các trang được xác định một số, chủ đề đầu tiên trong danh sách sẽ được sử dụng)
  • Cho phép bật/tắt một chủ đề.
  • Drupal người mới thân thiện.
1
IT Pro Manager

Bạn có thể sử dụng mô-đun chủ đề trang để đạt được chính xác điều đó: Mô-đun chủ đề trang là một mô-đun đơn giản và dễ sử dụng, cho phép sử dụng các chủ đề khác với mặc định của trang trên các trang cụ thể.

Đặc trưng :

Chỉ định một chủ đề cho một trang hoặc danh sách các trang. (Đặt trang là a Drupal) Cho phép sử dụng ký tự '*' làm ký tự đại diện trong Drupal. Cho phép sắp xếp chủ đề. (Nếu trang là một số định nghĩa, chủ đề đầu tiên trong danh sách sẽ được sử dụng) Cho phép bật/tắt một chủ đề. Drupal người mới thân thiện.

như bạn có thể sử dụng: Các phần có hầu hết các tính năng tương tự như Chủ đề trang, nhưng thêm lựa chọn dựa trên vai trò và khu vực "đoạn trích php" để chọn chủ đề.

nhưng nếu bạn muốn sử dụng các chủ đề khác với trang mặc định trong việc tạo, chỉnh sửa và xem trang, bạn có thể sử dụng Chủ đề nội dung cho phép sử dụng các chủ đề khác với mặc định của trang về tạo, chỉnh sửa nội dung và chỉnh sửa nội dung xem trang.

0
onlink