Một đoạn mã làm việc làm thế nào để sử dụng hook_block_access()
. Ở đây tôi lấy điều kiện từ một trường của nút hiện tại:
use Drupal\block\Entity\Block;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\Core\Access\AccessResult;
/**
* Implements hook_block_access().
*/
function MYMODULE_block_access(Block $block, $operation, AccountInterface $account) {
$node = \Drupal::routeMatch()->getParameter('node');
$hero_image_exists = FALSE;
if ($node instanceof NodeInterface) {
if ($node->hasField('field_hero_image')) {
if (!$node->get('field_hero_image')->isEmpty()) {
$hero_image_exists = TRUE;
}
}
}
if ($operation == 'view' && $block->getPluginId() == 'MYBLOCK') {
return AccessResult::forbiddenIf($hero_image_exists == FALSE)->addCacheableDependency($block);
}
return AccessResult::neutral();
}
Cảm ơn @Insasse đã chia sẻ đá quý sau trong các bình luận. Đối với các khối tùy chỉnh được tạo theo chương trình, bạn có thể kiểm soát mức độ hiển thị trực tiếp từ bên trong lớp khối thông qua blockAccess()
:
class MyBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
return [
'#markup' => $this->t('This is a simple block!'),
];
}
/**
* {@inheritdoc}
*/
protected function blockAccess(AccountInterface $account) {
return AccessResult::allowedIfHasPermission($account, 'access content');
}
}
Nguồn: Cách lập trình tạo một khối trong Drupal 8