Các khu vực có thể được in trong một mẫu nút?


25

Các khu vực có thể được in trong một mẫu nút hoặc các khu vực được giới hạn chặt chẽ với các mẫu trang?

Câu trả lời:


48

Bạn có thể in các vùng bên trong bất kỳ mẫu nào, nhưng chúng không có sẵn trong hộp trong node.tpl.phpmẫu. Để cung cấp chúng, bạn sẽ tạo một biến mới để sử dụng trong node.tpl.phpmẫu của bạn sẽ chứa tất cả nội dung khu vực.

Tạo các biến mẫu mới được thực hiện bằng cách sử dụng hàm tiền xử lý. Trong template.phptệp chủ đề của bạn , hãy tạo một chức năng trông như thế này:

function mytheme_preprocess_node(&$variables) {
}

Thay thế mythemebằng tên ngắn của chủ đề của bạn. Bây giờ, để Drupal nhận ra chức năng tiền xử lý mới này, bạn cần xây dựng lại sổ đăng ký chủ đề trang web của mình. Điều này cũng đơn giản như đi đến Cấu hìnhPhát triểnHiệu suất và nhấn nút "Xóa tất cả bộ nhớ cache" ở trên cùng.

Bây giờ, cách các chức năng tiền xử lý hoạt động là $variableschứa một mảng tương ứng với các biến có sẵn của mẫu của bạn. Ví dụ, trong node.tpl.php, $submittedcó chứa các dòng tác giả. Trong chức năng tiền xử lý ở trên, nó được tìm thấy trong $variables['submitted'].

Để bắt chước những gì bạn có page.tpl.php, nơi bạn có một mảng được gọi là $pagechứa tất cả các vùng, bạn muốn cư trú $variables['page'].

Vấn đề là $pagetrong đó node.tpl.phpđã được điền với một giá trị đúng / sai cho phép bạn biết liệu bạn đang xem nút đó hay trong một danh sách.

Vì vậy, để tránh xung đột tên đó, $regionthay vào đó , hãy điền vào:

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Sau đó, trong node.tpl.phpmẫu của chủ đề , bạn có thể kết xuất bất kỳ vùng nào bằng cách thực hiện như sau:

<?php print render($region['sidebar_first']); ?>

Trong trường hợp sidebar_firstlà tên của khu vực bạn muốn render.


1
Cuối cùng là một giải pháp hiệu quả cho Drupal 7 :)
Eduard Luca

4
Ngoài ra còn có một giải pháp bẩn nhanh chóng phù hợp với tôi <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. Từ đây: webomelette.com/add-region-node-template
Darragh Enright

Giải pháp này là tiện lợi. Bạn có thể đưa ra ví dụ về việc khi nào nó có thể áp dụng nhất cho các vùng in trong node.tpl.php thay vì có nó trong page.tpl.php không?
Randell

Nó phụ thuộc vào thiết kế của bạn. Đôi khi bố cục có thể đặt thanh bên ở một nơi dễ chủ đề hơn nhiều nếu nó nằm trong div nút thay vì bên ngoài nó.
rooby

Đừng quên các trình bao bọc khu vực thích hợp! Xem system_page_alter () để tham khảo. Hãy nhớ rằng block_get_blocks_by_region()chỉ trả về mảng các khối và nếu bạn muốn hiển thị nó dưới dạng một vùng, bạn cần thêm trình bao bọc vùng.
SiliconMind
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.