特定のブロックに対してのみ変数を前処理する


11

特定のブロックに対してのみ変数を前処理することは可能ですか?私はそのような関数を作成しました:mytheme_preprocess_block__aggregator(&$vars)しかしそれは機能しません。

-編集-

Drupal 8で修正されているようです https://drupal.org/node/1751194


あなたが行った編集とそこに貼り付けたリンクは、テーマフックの提案しか扱っていないようですね。
leymannx 2016年

回答:


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 2009

2
「block_id」はそのブロックに固有ではないため、使用$variables['block']->bidしないでください$variables['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 2016年

2
mytheme_preprocess_block__{my_block_machine_name}(&$variables)D8.3で動作します
Tim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.