Zmienne wstępne przetwarzania tylko dla niektórych bloków

11

Czy możliwe są zmienne przetwarzania wstępnego tylko dla niektórych bloków? Stworzyłem taką funkcję: mytheme_preprocess_block__aggregator(&$vars)ale to nie działa.

-- EDYTOWAĆ --

Wydaje się, że zostało to naprawione w Drupal 8 https://drupal.org/node/1751194

ya.teck
źródło
Dokonana przez Ciebie edycja i wklejony tam link wydają się dotyczyć tylko sugestii haka motywu, prawda?
leymannx,

Odpowiedzi:

20

Niestety nie ma takiej możliwości (podobnie jak hook_form_alter ()).

Najlepszym sposobem na to byłoby użycie zmiennych $ [„blok”] -> licytacja, aby zastosować modyfikacje tylko do bloków, które chcesz:

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
  }
}
Alex Weber
źródło
4
Spojrzałem na kod Drupala, a Drupal nie szuka hook_preprocess_block_MODULE()ani THEME_preprocess_block_MODULE(). W szczególny sposób obsługuje nazwy __zawarte w nazwach funkcji motywu, gdy na przykład theme()jest wywoływany theme('links__contextual__node', ...).
kiamlaluno
Hmm, dobrze wiedzieć!
Alex Weber,
„block_id” to zazwyczaj nazwa komputera bloku, poprawna?
chrisjlee
2
Skorzystaj z, $variables['block']->bida nie $variables['block_id']dlatego, że „block_id” nie jest unikalny dla tego bloku.
Duncanmoo,
3
Myślę, że trochę łatwiej jest warunkowo włączyć, $variables['block']->deltajeśli$variables['block']->module == 'MODULE'
Pete
3

Aby to potwierdzić, w Drupal 8 możesz pisać funkcje przetwarzania wstępnego dla określonych bloków. Na przykład:

Drupal 8

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

Ale możesz również użyć hook_preprocess_block i identyfikatora wtyczki:

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

Jak wspomniane przez Alexa, w Drupal 7 będziesz musiał trzymać się HOOK_preprocess_block i kontroli tożsamości:

Drupal 7

mytheme_preprocess_block(&$vars) {
  if ($vars['block']->bid === 'target_block_id') {
    // make changes to this block
  }
}
bryanbraun
źródło
Wypróbowałem to teraz na D8, ani nie MYTHEME_preprocess_block__system_branding_block(&$vars)działa, ani nie działa MYTHEME_preprocess_block__page_title_block(&$variables).
leymannx
2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)działa na D8.3
Tim