如何根据区域对块进行主题挂钩建议?


Answers:


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模块的情况。


几乎完美。您需要添加一个isset()以确保#id确实存在。例如,如果您使用page_manager并在其中放置块,那么您将没有#id。
贝尔迪尔'16

@ Berdir谢谢;)。我认为在这种情况下isset()不是必需的,因为如果没有an #id,那么它将传递NULL::load函数,然后返回即可NULL。最后,$blockNULL,什么也不会发生。在我的开发环境Drupal 8.0.4-page_manager-1.0-alpha23中进行了测试(以前从未使用过此模块)。
瓦格纳

是的,需要isset()。访问不存在的数组键会导致PHP通知。检查您的日志,您会看到。我建议始终使用冗长的错误显示进行开发,这是所提供的示例settings.php的默认设置。
贝尔迪尔'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.