web-dev-qa-db-ja.com

MODULE_preprocess_block()はdrupal 8でレンダリングされた領域を取得します

したがって、Drupal 7モジュールをDrupal 8に移植し、 "NAME_preprocess_block"メソッドを変換する方法に苦労しています。D7コードでは、ブロックがレンダリングされる領域でフィルタリングします

if ($vars['elements']['#block']->region == "my_region") {
   // Do stuff.
}

ただし、「['#block']-> region」オブジェクトはdrupal 8に存在せず、代替を見つけることができないようです。これを行うことはまだ可能ですか? ?

ありがとう!

1

ブロックをロードする必要があります(心配しないでください。すでにロードされているため、パフォーマンスへの影響はありません)。

$block = entity_load('block', $variables['elements']['#id']);
$region = $block->region;
1
user21641

したがって、ここですべてを機能させることが、私が機能させるコードです。

use Drupal\block\Entity\Block;
/**
 * Implements hook_preprocess_block().
 */
function harfang_preprocess_block(&$variables) {
  $block = Block::load($variables['elements']['#id']);
  $region = $block->getRegion();

 // Add classes to all bocks in footer region.
  if($region == 'footer') {
 // Do something.
  }
}

先頭に使用ステートメントを追加し、非結合者を削除しました

4
BiigNiick

drupal 8.2.xの場合、上記の提案は機能しなくなりました。

function MODULENAME_preprocess_block(&$variables ){
    $region = $variables['elements']['#configuration']['region'];
    if($region == "my_region"){
        //Do stuff
    }
}

.themeを使用してTHEMENAME_preprocess_blockファイル内に実装することもできます

[〜#〜] note [〜#〜]contextモジュールが有効(!?)の場合にのみ、モジュール前処理関数で構成領域を使用できるようです(そうでない場合、領域はテーマ前処理機能で利用可能

0
GiorgosK

ここでDrupal 8.xの正しいバージョン:

$block = \Drupal\block\Entity\Block::load('block', $variables['elements']['#id']);
$region = $block->getRegion();
0
kxo