Prétraiter les variables uniquement pour certains blocs

11

Est-il possible de prétraiter des variables uniquement pour certains blocs? J'ai créé une telle fonction: mytheme_preprocess_block__aggregator(&$vars)mais cela ne fonctionne pas.

-- ÉDITER --

Il semble être corrigé dans Drupal 8 https://drupal.org/node/1751194

ya.teck
la source
La modification que vous avez effectuée et le lien que vous avez collé ne semblent traiter que des suggestions de crochets de thème, n'est-ce pas?
leymannx

Réponses:

20

Malheureusement, il n'y a aucun moyen de le faire comme ça (similaire à hook_form_alter ()).

La meilleure façon de le faire serait d'utiliser $ variables ['block'] -> bid pour appliquer les modifications uniquement aux blocs que vous souhaitez:

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
la source
4
J'ai regardé le code Drupal, et Drupal ne cherche pas hook_preprocess_block_MODULE()ou THEME_preprocess_block_MODULE(). Il gère d'une manière particulière le __contenu des noms de fonction de thème, lorsqu'il theme()est invoqué comme theme('links__contextual__node', ...), par exemple.
kiamlaluno
Hmm, bon à savoir!
Alex Weber
'block_id' est généralement le nom de la machine du bloc correct?
chrisjlee
2
Veuillez utiliser $variables['block']->bidet non $variables['block_id']car 'block_id' n'est pas unique à ce bloc.
Duncanmoo
3
Je pense que c'est un peu plus convivial d'activer conditionnellement $variables['block']->deltasi$variables['block']->module == 'MODULE'
Pete
3

Juste pour confirmer, dans Drupal 8, vous pouvez écrire des fonctions de prétraitement pour des blocs spécifiques. Par exemple:

Drupal 8

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

Mais vous pouvez également utiliser hook_preprocess_block et l'ID du plugin:

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

Comme mentionné par Alex, dans Drupal 7, vous devrez vous en tenir à HOOK_preprocess_block et à une vérification d'identité:

Drupal 7

mytheme_preprocess_block(&$vars) {
  if ($vars['block']->bid === 'target_block_id') {
    // make changes to this block
  }
}
bryanbraun
la source
Je l'ai essayé en ce moment sur D8, cela ne MYTHEME_preprocess_block__system_branding_block(&$vars)fonctionne ni ne fonctionne MYTHEME_preprocess_block__page_title_block(&$variables).
leymannx
2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)fonctionne sur D8.3
Tim