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


38

Tôi có một ví dụ Drupal đang chạy trên example.org. Trong đó có một chủ đề X được cài đặt và kích hoạt. 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 mà một 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ị bất cứ khi nào một trang trong phần này được xem (ví dụ: http://example.org/event2011/about , http://example.org/event2011/node/123 ). 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ã.


1
Bạn đang tìm kiếm để có một trang web hoàn toàn riêng biệt theo đường dẫn / event2011 / node / 123 trông giống như bạn?
Jeremy Pháp

Câu trả lời:


33

Xem xét rằng thay đổi 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/123 , thì nên đổi mã 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ệu 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ụ thể vào các trang đó 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ế.


Tôi muốn đề xuất hàm current_path () api.drupal.org/api/drupal/includes%21path.inc/feft/ trên . Bạn sẽ có một điều kiện "cho" dễ dàng hơn
augusto

22

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.


8

Ngoài ra, bạn có thể sử dụng theme callbacktùy chọn mới của hệ thống menu hook_menu_alter()như được nêu dưới đây. ps 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 truyền thống hơn 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';
  }
}
?>

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


6

Bạn có thể chỉ cần 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;)


hành động chủ đề chuyển các biến tùy chỉnh cho chủ đề, nó không thực sự thay đổi nó
Alex Weber

6

Sử dụng ThemeKey rất đơn giản và là mô-đun phổ biến và mạnh mẽ nhất cho đến nay (có hỗ trợ 8.x) cho các quy tắc chuyển đổi chủ đề cho phép tự động chọn 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 tính chất 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 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 /^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.

Giúp đỡ (7.x)

Kiểm tra video hướng dẫn của Mustardseed (7.x).

Trợ giúp thêm về chủ đề đó có thể được tìm thấy tại /admin/help/themekey.

Ngoài ra kiểm tra các câu hỏi SE khác liên quan đến .


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.


5

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 Drupal hiện tại.

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ả là khó đọc.

Hãy xem xét ví dụ sau, như đề xuất của 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 event2011 , việc sử dụng arg(0)sẽ trả về nodelàm thành phần URL đầu tiên, 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 phải làm việc với một bí danh có nhiều cách để có được 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';
  }
}

3

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ủ đề mà bạn muốn chuyển sang


1

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 dưới dạng đường dẫn Drupal)
  • Cho phép sử dụng ký tự '*' làm ký tự đại diện trong đườ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.

0

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

Tính năng, đặc điểm :

Chỉ định một chủ đề cho một trang hoặc danh sách các trang. (Đặt trang dưới dạng đường dẫn Drupal) Cho phép sử dụng ký tự '*' làm ký tự đại diện trong đườ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.

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 trang mặc định để tạo, chỉnh sửa và xem trang.

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.