Bagaimana cara membuat saran kait tema untuk blok menurut wilayah?

14

Sejak Drupal 8 tidak mungkin dengan konvensi penamaan templat untuk memuat templat blok spesifik sesuai dengan wilayah tempat ia ditempatkan ( "Markup blok per-wilayah dan fitur templating blok per-wilayah dihapus" ). Tetapi saya perlu memiliki html berbeda untuk blok jika ditempatkan di wilayah tertentu. Bagaimana saya mencapai ini?

Saya sudah berpikir untuk menggunakan MYMODULE_theme_suggestions_block_alter tapi saya tidak tahu bagaimana mendapatkan wilayah saat ini.

Philipp Michael
sumber

Jawaban:

20

Anda bisa mendapatkan wilayah jika Anda mendapatkan Entitas Blok.

File .module atau .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;
}

Sunting 1: Sampul page_manager kasus modul.

Vagner
sumber
Hampir sempurna. Anda perlu menambahkan isset () untuk memastikan bahwa #id benar-benar ada. Misalnya, jika Anda menggunakan page_manager dan menempatkan blok di sana, maka Anda tidak akan memiliki #id.
Berdir
@Berdir terima kasih;). Saya berpikir bahwa dalam hal ini isset()tidak diperlukan, karena jika tidak ada suatu #id, maka lulus NULLuntuk ::loadfungsi, dan hanya kembali NULL. Pada akhirnya, $blockitu NULLdan tidak akan terjadi apa-apa. Diuji dalam dev saya, Drupal 8.0.4 - page_manager-1.0-alpha23 (tidak pernah menggunakan modul ini sebelumnya).
Vagner
Ya, isset () diperlukan. mengakses kunci larik yang tidak ada menghasilkan pemberitahuan PHP. Periksa log Anda dan Anda akan melihat. Saya akan merekomendasikan untuk selalu mengembangkan dengan tampilan kesalahan pada verbose, yang merupakan default dari contoh setting.php yang disediakan.
Berdir