Variabel preproses hanya untuk blok tertentu


11

Apakah mungkin variabel preproses hanya untuk blok tertentu? Saya telah membuat fungsi seperti itu: mytheme_preprocess_block__aggregator(&$vars)tetapi tidak berfungsi.

- EDIT -

Tampaknya diperbaiki di Drupal 8 https://drupal.org/node/1751194


Hasil edit yang Anda lakukan dan tautan yang Anda tempel di sana tampaknya hanya berurusan dengan saran tema kait, bukan?
leymannx

Jawaban:


20

Sayangnya, tidak ada cara untuk melakukannya seperti itu (mirip dengan hook_form_alter ()).

Cara terbaik untuk melakukannya adalah dengan menggunakan $ variabel ['blok'] -> tawaran untuk menerapkan modifikasi hanya pada blok yang Anda inginkan:

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
Saya melihat kode Drupal, dan Drupal tidak mencari hook_preprocess_block_MODULE()atau THEME_preprocess_block_MODULE(). Ini menangani dengan cara tertentu yang __terkandung dalam nama-nama fungsi tema, ketika theme()dipanggil sebagai theme('links__contextual__node', ...), misalnya.
kiamlaluno

Hmm, senang tahu!
Alex Weber

'block_id' biasanya nama mesin dari blok itu benar?
chrisjlee

2
Silakan gunakan $variables['block']->biddan bukan $variables['block_id']karena 'block_id' tidak unik untuk blok itu.
Duncanmoo

3
Saya pikir ini sedikit ramah untuk mengaktifkan secara kondisional $variables['block']->deltajika$variables['block']->module == 'MODULE'
Pete

3

Sebagai konfirmasi, di Drupal 8 Anda dapat menulis fungsi preprocess untuk blok tertentu. Sebagai contoh:

Drupal 8

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

Tetapi Anda juga bisa menggunakan hook_preprocess_block, dan ID plugin:

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

Seperti yang disebutkan oleh Alex, di Drupal 7 Anda harus tetap menggunakan HOOK_preprocess_block, dan cek id:

Drupal 7

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

Sudah mencobanya sekarang di D8, tidak ada yang MYTHEME_preprocess_block__system_branding_block(&$vars)berhasil atau tidak MYTHEME_preprocess_block__page_title_block(&$variables).
leymannx

2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)bekerja pada D8.3
Tim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.