एक काम कोड स्निपेट का उपयोग कैसे करें hook_block_access()
। यहाँ मैं वर्तमान नोड के एक क्षेत्र से स्थिति को पुनः प्राप्त करता हूं:
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();
}
धन्यवाद @ टिप्पणी में निम्नलिखित मणि साझा करने के लिए धन्यवाद। प्रोग्रामेटिक रूप से बनाए गए कस्टम ब्लॉक के माध्यम से आप सीधे ब्लॉक क्लास के अंदर से दृश्यता को नियंत्रित कर सकते हैं 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');
}
}
स्रोत: Drupal 8 में प्रोग्राम को ब्लॉक करने का तरीका