কীভাবে ব্যবহার করবেন তা একটি ওয়ার্কিং কোড স্নিপেট 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');
}
}
উত্স: ড্রুপাল 8 এ প্রোগ্রামিয়ালি ব্লক কীভাবে তৈরি করা যায়