Làm cách nào để thêm các lớp vào thẻ BODY một cách linh hoạt dựa trên đường dẫn / độ sâu của trang?


22

Làm thế nào để thêm các lớp vào thẻ body một cách linh hoạt như ví dụ dưới đây?

-Home
-Cities      
--Melbourne       <body class="melbourne">
--- Công viên chủ đề       <body class="melbourne theme_parks">
--- Nhà hàng       <body class="melbourne restaurants">
- New York       <body class="new_york">
--- Công viên chủ đề       <body class="new_york theme_parks">
--- Nhà hàng       <body class="new_york restaurants">
- Liên hệ với chúng tôi       <body class="contact_us">

Drupal newbie ở đây và không có nền tảng lập trình. Do đó, tôi đánh giá cao nếu bạn có thể càng chi tiết càng tốt khi chia sẻ giải pháp.

Câu trả lời:


37

Để giải thích câu trả lời của Nikhil Mohan, bạn có thể triển khai template_preprocess_html()bên trong tệp template.php của chủ đề. Đọc tài liệu về Ghi đè đầu ra theo chủ đề để hiểu những điều cơ bản về những gì đang diễn ra ở đây.

Trong hàm này, bạn có quyền truy cập vào biến $vars['classes_array']chứa danh sách các lớp sẽ được áp dụng cho <body>thẻ HTML trên trang.

Thật không may, thông tin về vị trí của trang hiện tại trong menu không có sẵn ngay lập tức. Bạn có thể sử dụng menu_get_item()và sau đó menu_get_ancestors()để có được thông tin này, nhưng đó là rất nhiều khả năng xử lý cho một cái gì đó mà chúng ta có thể có được với cách tiếp cận simpiler.

Giả sử bạn đang sử dụng mô-đun pathauto để tự động tạo các đường dẫn ngữ nghĩa cho các trang nội dung của bạn dựa trên đường dẫn menu (nghĩa là trang Công viên chủ đề Melbourne của bạn sẽ có đường dẫn 'melbourne / theme_parks'), bạn có thể sử dụng đường dẫn của trang để tạo các lớp bạn đang tìm:

function THEMENAME_preprocess_html(&$vars) {
  $path = drupal_get_path_alias();
  $aliases = explode('/', $path);

  foreach($aliases as $alias) {
    $vars['classes_array'][] = drupal_clean_css_identifier($alias);
  } 
}

Đó là nó. Bây giờ Drupal sẽ xem xét bí danh đường dẫn của trang hiện tại và thêm một lớp vào <body>thẻ cho mỗi đoạn của bí danh đường dẫn.


1
Nếu các đường dẫn không hoạt động, thì phân tích cú pháp menu_get_active_breadcrumb cũng là một tùy chọn. Nó có khả năng trong staticbộ đệm tại thời điểm đó, vì vậy hầu như không có phí.
mpdon Arena

3
Cảm ơn tất cả các bạn, đặc biệt là @sheena_d vì lời giải thích cũng như mã! Phải thực hiện một chút tìm kiếm về cách làm cho nó hoạt động trên Omega Theme và quản lý để làm cho nó hoạt động: D Đây là dòng để làm cho nó hoạt động trên Omega Theme: $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
kyooriouskoala



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.