仅对某些块预处理变量


11

是否可能仅对某些块进行预处理变量?我已经创建了这样的功能:mytheme_preprocess_block__aggregator(&$vars)但是它不起作用。

-编辑-

它似乎在Drupal 8中已修复 https://drupal.org/node/1751194


您所做的编辑和粘贴到此处的链接似乎只处理主题挂钩建议,不是吗?
leymannx '16

Answers:


20

不幸的是,没有办法做到这一点(类似于hook_form_alter())。

最好的方法是使用$ variables ['block']-> bid仅将修改应用于所需的块:

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
我查看了Drupal代码,而Drupal不查找hook_preprocess_block_MODULE()THEME_preprocess_block_MODULE()。例如__,当以theme()方式调用时,它以特定方式处理主题函数名称中包含的内容theme('links__contextual__node', ...)
kiamlaluno

嗯,很高兴知道!
Alex Weber

“ block_id”通常是正确的块的机器名称吗?
chrisjlee 2011年

2
请使用$variables['block']->bid而不是,$variables['block_id']因为'block_id'并非该块唯一。
Duncanmoo

3
我认为它有点友好有条件地打开$variables['block']->delta,如果$variables['block']->module == 'MODULE'
皮特

3

只是要确认一下,您可以在Drupal 8中为特定块编写预处理功能。例如:

Drupal 8

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

但是您也可以使用hook_preprocess_block和插件ID:

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

如Alex所述,在Drupal 7中,您必须坚持使用HOOK_preprocess_block和id检查:

Drupal 7

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

现在在D8上对其进行了尝试,但既没有MYTHEME_preprocess_block__system_branding_block(&$vars)效果,也没有效果MYTHEME_preprocess_block__page_title_block(&$variables)
leymannx '16

2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)确实适用于D8.3
Tim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.