Variablen nur für bestimmte Blöcke vorverarbeiten

10

Ist es möglich, Variablen nur für bestimmte Blöcke vorzuverarbeiten? Ich habe eine solche Funktion erstellt: mytheme_preprocess_block__aggregator(&$vars)aber es funktioniert nicht.

- BEARBEITEN -

Es scheint in Drupal 8 https://drupal.org/node/1751194 behoben zu sein

ya.teck
quelle
Die Bearbeitung, die Sie vorgenommen haben, und der Link, den Sie dort eingefügt haben, scheinen sich nur mit Themen-Hook-Vorschlägen zu befassen, nicht wahr?
Leymannx

Antworten:

20

Leider gibt es keine Möglichkeit, dies so zu tun (ähnlich wie hook_form_alter ()).

Der beste Weg, dies zu tun, wäre, $ variables ['block'] -> bid zu verwenden, um Änderungen nur auf die gewünschten Blöcke anzuwenden:

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
quelle
4
Ich habe mir Drupal-Code angesehen und Drupal sucht nicht nach hook_preprocess_block_MODULE()oder THEME_preprocess_block_MODULE(). Es behandelt in besonderer Weise die __in Themenfunktionsnamen enthaltenen Namen, wenn sie beispielsweise als theme()aufgerufen werden theme('links__contextual__node', ...).
Kiamlaluno
Hmm, gut zu wissen!
Alex Weber
'block_id' ist normalerweise der Maschinenname des Blocks korrekt?
Chrisjlee
2
Bitte verwenden Sie $variables['block']->bidund nicht, $variables['block_id']da 'block_id' nicht nur für diesen Block gilt.
Duncanmoo
3
Ich denke, es ist ein wenig freundlicher, bedingt einzuschalten, $variables['block']->deltawenn$variables['block']->module == 'MODULE'
Pete
2

Zur Bestätigung können Sie in Drupal 8 Vorverarbeitungsfunktionen für bestimmte Blöcke schreiben. Zum Beispiel:

Drupal 8

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

Sie können aber auch hook_preprocess_block und die Plugin-ID verwenden:

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

Wie von Alex erwähnt, müssen Sie in Drupal 7 bei HOOK_preprocess_block bleiben und eine ID überprüfen:

Drupal 7

mytheme_preprocess_block(&$vars) {
  if ($vars['block']->bid === 'target_block_id') {
    // make changes to this block
  }
}
Bryanbraun
quelle
Versuchte es jetzt auf D8, MYTHEME_preprocess_block__system_branding_block(&$vars)funktioniert weder noch funktioniert MYTHEME_preprocess_block__page_title_block(&$variables).
Leymannx
2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)arbeitet an D8.3
Tim