Змінні попередньої обробки лише для певних блоків


11

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

- EDIT -

Здається, це зафіксовано в Drupal 8 https://drupal.org/node/1751194


Зроблена вами редакція та вкладене посилання, здається, стосуються лише пропозицій щодо гакання теми, чи не так?
leymannx

Відповіді:


20

На жаль, немає способу зробити це так (подібне до mock_form_alter ()).

Найкращим способом зробити це було б використовувати $ змінні ['блок'] -> ставка, щоб застосувати модифікації лише до потрібних блоків:

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 ви можете записати функції попередньої обробки для конкретних блоків. Наприклад:

Друпал 8

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

Але ви можете також використовувати ku_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.