Biến tiền xử lý chỉ cho một số khối nhất định


11

Có thể các biến tiền xử lý chỉ cho các khối nhất định? Tôi đã tạo ra chức năng như vậy: mytheme_preprocess_block__aggregator(&$vars)nhưng nó không hoạt động.

-- BIÊN TẬP --

Nó dường như được sửa trong Drupal 8 https://drupal.org/node/1751194


Chỉnh sửa bạn đã thực hiện và liên kết bạn đã dán ở đó dường như chỉ xử lý các đề xuất móc chủ đề, phải không?
leymannx

Câu trả lời:


20

Thật không may, không có cách nào để làm điều đó như thế (tương tự như hook_form_alter ()).

Cách tốt nhất để làm điều này là sử dụng $ biến ['block'] -> giá thầu để chỉ áp dụng sửa đổi cho các khối bạn muốn:

function mytheme_preprocess_block(&$variables) {
  if ($variables['block']->bid === 'target_block_id') {
    // do something for this block
  } else if ($variables['block']->bid === 'other_target_block_id') {
    // do something else for this other block
  }
}

4
Tôi đã xem mã Drupal và Drupal không tìm kiếm hook_preprocess_block_MODULE()hoặc THEME_preprocess_block_MODULE(). Nó xử lý theo một cách cụ thể __có trong tên hàm chủ đề, khi theme()được gọi là theme('links__contextual__node', ...), ví dụ.
kiamlaluno

Hmm, tốt để biết!
Alex Weber

'block_id' thường là tên máy của khối chính xác?
chrisjlee

2
Vui lòng sử dụng $variables['block']->bidvà không phải $variables['block_id']là 'block_id' không phải là duy nhất cho khối đó.
Duncanmoo

3
Tôi nghĩ rằng nó thân thiện hơn một chút khi bật điều kiện $variables['block']->deltanếu$variables['block']->module == 'MODULE'
Pete

3

Chỉ cần xác nhận, trong Drupal 8, bạn có thể viết các hàm tiền xử lý cho các khối cụ thể. Ví dụ:

Drupal 8

mytheme_preprocess_block__system_branding_block(&$vars) {
  // Make changes to the the system branding block
}

Nhưng bạn cũng có thể sử dụng hook_pre process_block và ID plugin:

function mytheme_preprocess_block(&$vars) {
  if ($vars['plugin_id'] == 'system_branding_block') {
    // Make changes to the the system branding block
  }
}

Như Alex đã đề cập, trong Drupal 7, bạn sẽ phải gắn bó với HOOK_pre process_block và kiểm tra id:

Drupal 7

mytheme_preprocess_block(&$vars) {
  if ($vars['block']->bid === 'target_block_id') {
    // make changes to this block
  }
}

Đã thử nó ngay bây giờ trên D8, không MYTHEME_preprocess_block__system_branding_block(&$vars)hoạt động cũng không MYTHEME_preprocess_block__page_title_block(&$variables).
leymannx

2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)không hoạt động trên D8.3
Tim
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.