Pré-processar variáveis ​​apenas para determinados blocos

11

É possível pré-processar variáveis ​​apenas para determinados blocos? Eu criei essa função: mytheme_preprocess_block__aggregator(&$vars)mas não funciona.

- EDITAR -

Parece estar corrigido no Drupal 8 https://drupal.org/node/1751194

ya.teck
fonte
A edição que você fez e o link que você colou lá parecem lidar apenas com sugestões de temas, não é?
Leymannx

Respostas:

20

Infelizmente, não há como fazê-lo dessa maneira (semelhante a hook_form_alter ()).

A melhor maneira de fazer isso seria usar $ variables ['block'] -> bid para aplicar modificações apenas nos blocos que você deseja:

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
fonte
4
Eu olhei para o código Drupal, e o Drupal não procura hook_preprocess_block_MODULE()ou THEME_preprocess_block_MODULE(). Ele lida de maneira específica com o __contido nos nomes de função do tema, quando theme()é chamado como theme('links__contextual__node', ...), por exemplo.
kiamlaluno
Hmm, bom saber!
Alex Weber
'block_id' geralmente é o nome da máquina do bloco correto?
chrisjlee
2
Por favor, use $variables['block']->bide não $variables['block_id']como 'block_id' não é exclusivo para esse bloco.
Duncanmoo
3
Eu acho que é um pouco mais amigável ligar condicionalmente $variables['block']->deltase$variables['block']->module == 'MODULE'
Pete
3

Apenas para confirmar, no Drupal 8 você pode escrever funções de pré-processamento para blocos específicos. Por exemplo:

Drupal 8

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

Mas você também pode usar hook_preprocess_block e o ID do plug-in:

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

Conforme mencionado por Alex, no Drupal 7 você terá que seguir HOOK_preprocess_block e uma verificação de identificação:

Drupal 7

mytheme_preprocess_block(&$vars) {
  if ($vars['block']->bid === 'target_block_id') {
    // make changes to this block
  }
}
bryanbraun
fonte
Tentei agora no D8, nem MYTHEME_preprocess_block__system_branding_block(&$vars)funciona nem funciona MYTHEME_preprocess_block__page_title_block(&$variables).
Leymannx
2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)funciona no D8.3
Tim