Drupal 8부터는 템플릿 이름 지정 규칙 을 사용하여 배치 된 영역에 따라 특정 블록 템플릿 을로드 할 수 없습니다 ( "영역 별 블록 마크 업 및 영역 별 블록 템플릿 기능 제거" ). 그러나 특정 지역에 배치하면 블록에 대해 다른 HTML이 필요합니다. 어떻게하면 되나요?
MYMODULE_theme_suggestions_block_alter 사용에 대해 생각 했지만 현재 지역을 얻는 방법을 모르겠습니다.
Drupal 8부터는 템플릿 이름 지정 규칙 을 사용하여 배치 된 영역에 따라 특정 블록 템플릿 을로드 할 수 없습니다 ( "영역 별 블록 마크 업 및 영역 별 블록 템플릿 기능 제거" ). 그러나 특정 지역에 배치하면 블록에 대해 다른 HTML이 필요합니다. 어떻게하면 되나요?
MYMODULE_theme_suggestions_block_alter 사용에 대해 생각 했지만 현재 지역을 얻는 방법을 모르겠습니다.
답변:
당신은 블록 엔터티를 얻을 경우 지역을 얻을 수 있습니다.
.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 모듈 사례.
isset()
이 생길 수없는 경우 때문에, 필요하지 않습니다 #id
다음은 전달 NULL
에 ::load
기능, 그냥 돌아갑니다 NULL
. 결국, $block
이다 NULL
아무것도 일어나지 않습니다. 내 dev env Drupal 8.0.4-page_manager-1.0-alpha23에서 테스트되었습니다 (이 모듈은 이전에 사용한 적이 없습니다).