Vùng in trong html.tpl.php


10

Tôi cần xuất một số vùng trong mẫu html.tpl.php vì các vùng này không thay đổi giữa page.tpl.php và page-front.tpl.php (chỉ để đặt tên hai). Về cơ bản tôi muốn tránh trùng lặp mã.

Tuy nhiên, dường như không có gì liên quan đến các vùng trong html.tpl.php, tôi cũng không thể truy xuất bất cứ thứ gì bằng cách sử dụng drupal_get_region_content (cả có và không có tham số, nó chỉ trả về một mảng trống).

Ý tưởng?


Bạn đã sử dụng drupal_set_region_content()để thiết lập nội dung khu vực?
kiamlaluno

2
Không có chức năng như vậy. Có thể bạn có ý drupal_add_region_content()nhưng tôi không thấy điểm nào trong đó: Tôi đặt nội dung của các vùng thông qua giao diện quản trị viên khối.
Morpheu5

1
Vâng, tôi muốn nói drupal_add_region_content().
kiamlaluno

Câu trả lời:


18

Tôi đã giải quyết như thế này:

function mytheme_preprocess_html(&$variables) {
    $variables['region_name'] = block_get_blocks_by_region('region_name');
}

và sau đó tôi có thể làm

<?php print render($region_name) ?>

Tại sao sử dụng tiếng vang? Tất nhiên nó hoạt động.
SDMulroy

Chắc chắn, nếu tôi đang thực hiện một mô-đun hoặc chủ đề công cộng, tôi sẽ buộc phải tuân theo các tiêu chuẩn cộng đồng. Đây là một chủ đề tùy chỉnh được sử dụng riêng bởi khách hàng của tôi.
Morpheu5

Tôi biết rằng đây là một bài viết cực kỳ cũ, nhưng tôi nghĩ rằng đó là sự phán xét kém để chấp nhận một câu trả lời trong đó tác giả của câu trả lời lười biếng trả lời câu hỏi. ví dụ: Bạn cung cấp một hàm để thêm, nhưng giả sử rằng tất cả người đọc sẽ biết một cách kỳ diệu nơi mã này sẽ sống. Đó là phần lười biếng và tôi không bình chọn điều này vì nó không cung cấp bất cứ điều gì cho người dùng / nhà phát triển mới làm quen.
Skittles

Tôi đánh giá cao ý kiến ​​của bạn và thực tế là người mới có thể không nhận được lời giải thích đầy đủ. Tuy nhiên, vui lòng xem xét rằng a) cho ăn bằng thìa làm cho những người mới lười biếng và b) cho bất kỳ ai thậm chí đã nhanh chóng đọc các tài liệu (như bất kỳ người mới không lười biếng nào nên có) vị trí của chức năng đó là tương đối rõ ràng. Nếu không, thì có một hướng dẫn cho một lý do tốt. Câu hỏi của tôi (và câu trả lời) liên quan đến một vấn đề ở cấp độ mà một kiến ​​thức cơ bản nhất định về chủ đề Drupal có thể được giả định. Hơn nữa, đây là trang web Hỏi & Đáp, trang Tài liệu ở bên cạnh.
Morpheu5

1
@Skitties Chúng tôi không thể sao chép tài liệu ở đây chỉ vì người dùng mới không thể biết các chức năng tiền xử lý như chức năng được hiển thị trong câu hỏi là gì. Đó thậm chí không phải là một phần của câu hỏi. Nếu người dùng có một chức năng tiền xử lý câu hỏi cụ thể, họ sẽ hỏi một câu hỏi mới.
kiamlaluno

2

drupal_get_region_content()trả về nội dung đã được đặt với các cuộc gọi trước đó drupal_add_region_content(), nhưng nó không bao gồm nội dung của các khối được hiển thị trong trang thông qua block_page_build () .

Nếu bạn tìm kiếm "drupal_add_region_content" trong mã nguồn Drupal, bạn sẽ nhận thấy rằng hàm được gọi bởi:

  • drupal_get_region_content()
  • install_display_output()
  • template_preprocess_maintenance_page()
  • update_task_list()

Những gì bạn đặt cho các khối trong trang quản trị là trong đó các khối sẽ được hiển thị, nhưng nội dung của chúng không được thêm vào drupal_add_region_content(); trong thực tế, không có chức năng nào được liệt kê ở trên (là các chức năng duy nhất gọi drupal_add_region_content(), ngoại trừ mã để kiểm tra cài đặt Drupal) là để kết xuất / thêm nội dung khối.

Nếu bạn cần kết xuất các khối trong mã của riêng mình, bạn nên kiểm tra mã được sử dụng trong block_page_build(). Đặc biệt, đây là mã có thể hữu ích hơn cho bạn:

  // Fetch a list of regions for the current theme.
  $all_regions = system_region_list($theme);

  $item = menu_get_item();
  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
    // Load all region content assigned via blocks.
    foreach (array_keys($all_regions) as $region) {
      // Assign blocks to region.
      if ($blocks = block_get_blocks_by_region($region)) {
        $page[$region] = $blocks;
      }
    }
    // …
  }

Hai dòng đầu tiên xác minh trang đang hiển thị không phải là trang demo được sử dụng để hiển thị nơi các khu vực chủ đề được đặt.

Nếu bạn cần kết xuất các khối theo một cách khác, có thể bạn sẽ quan tâm hơn đến việc ghi đè theme_block () trong chủ đề của mình hoặc (thậm chí có thể hơn) tạo tệp mẫu block.tpl.php tùy chỉnh. Một cách khác để thay đổi cách các khối được hiển thị là sử dụng hàm tiền xử lý cho các khối ( hook_pre process_block () ).

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.