지역에 따라 블록에 대한 테마 후크 제안을 만드는 방법은 무엇입니까?


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

@ Berdir 감사합니다;). 나는이 경우에 생각 isset()이 생길 수없는 경우 때문에, 필요하지 않습니다 #id다음은 전달 NULL::load기능, 그냥 돌아갑니다 NULL. 결국, $block이다 NULL아무것도 일어나지 않습니다. 내 dev env Drupal 8.0.4-page_manager-1.0-alpha23에서 테스트되었습니다 (이 모듈은 이전에 사용한 적이 없습니다).
Vagner

예, isset ()이 필요합니다. 존재하지 않는 배열 키에 액세스하면 PHP 알림이 ​​표시됩니다. 로그를 확인하면 볼 수 있습니다. 제공된 예제 settings.php의 기본값 인 verbose에서 오류 표시로 항상 개발하는 것이 좋습니다.
Berdir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.