地域に応じたブロックのテーマフックの提案を作成する方法は?


14

Drupal 8以降、テンプレートの命名規則では、配置されている地域応じて特定のブロックテンプレートを読み込むことはできません(「地域ごとのブロックマークアップと地域ごとのブロックテンプレート機能が削除されました」)。しかし、特定の地域に配置する場合は、ブロック用に異なるhtmlが必要です。どうすればこれを達成できますか?

MYMODULE_theme_suggestions_block_alterを使用することを考えましたが、現在のリージョンを取得する方法がわかりません。

回答:


20

ブロックエンティティを取得すると、リージョンを取得できます。

.moduleまたは.themeファイル

use Drupal\block\Entity\Block;

function MODULE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  if (!empty($variables['elements']['#id'])) {
    $block = Block::load($variables['elements']['#id']);
    $suggestions[] = 'block__' . $block->getRegion() . '__' . $variables['elements']['#id'];
  }
  /* Use this 'else if' only if you are using page_manager module and want to know which region is the block */
  else if (isset($variables['elements']['#configuration']['region'])) {
    $suggestions[] = 'block__page_' . $variables['elements']['#configuration']['region'] . '__' . end(explode(':', $variables['elements']['#plugin_id']));
  }
  return $suggestions;
}

編集1: page_managerモジュールのケースをカバーします。


ほぼ完璧。#idが実際に存在することを確認するには、isset()を追加する必要があります。たとえば、page_managerを使用してそこにブロックを配置する場合、#idはありません。
ベルディール

@Berdirありがとう;)。この場合、isset()が存在しない場合、関数に#id渡さNULL::load、単に戻るため、必要ではないと思いますNULL。最後に、あります$blockNULL、何も起こりません。開発環境Drupal 8.0.4-page_manager-1.0-alpha23でテスト済み(以前はこのモジュールを使用したことはありません)。
ヴァグナー

はい、isset()が必要です。存在しない配列キーにアクセスすると、PHP通知が発生します。ログを確認してください。提供されるサンプルsettings.phpのデフォルトである、冗長なエラー表示で常に開発することをお勧めします。
ベルディール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.