Переменные препроцессора только для определенных блоков


11

Возможна ли предварительная обработка переменных только для определенных блоков? Я создал такую ​​функцию: mytheme_preprocess_block__aggregator(&$vars)но она не работает.

-- РЕДАКТИРОВАТЬ --

Кажется, это исправлено в Drupal 8 https://drupal.org/node/1751194


Редактирование, которое вы сделали, и ссылка, которую вы вставили туда, похоже, имеют дело только с предложениями по теме, не так ли?
leymannx

Ответы:


20

К сожалению, нет способа сделать это так (аналогично hook_form_alter ()).

Лучший способ сделать это - использовать $ variable ['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

Хмм, приятно знать!
Алекс Вебер

'block_id' - обычно правильное имя машины блока?
chrisjlee

2
Пожалуйста, используйте, $variables['block']->bidа не $variables['block_id']как block_id не является уникальным для этого блока.
Дунканму

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 и идентификатор плагина:

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

Как упомянул Алекс, в Drupal 7 вам придется придерживаться HOOK_preprocess_block и проверки идентификатора:

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

2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)работает на D8.3
Тим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.