Pregunta:
En Drupal 6, pude controlar la visibilidad del bloque usando código PHP en la configuración de la interfaz de usuario del bloque como:
<?php return MYMODULE_abc() || MYMODULE_def() ; ?>
Estas funciones buscaron el nodo actual, la taxonomía, etc. para decidir si mostrar el bloque. Esta opción de PHP desapareció en Drupal 8, pero hay un campo de $visibility
en BlockBase
. ¿Puedo usar esto para configurar programáticamente la visibilidad en tiempo de ejecución?
Respuesta:
Un fragmento de código de trabajo sobre cómo usar hook_block_access()
. Aquí recupero la condición de un campo del nodo actual:
use Drupal\block\Entity\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
/**
* Implements hook_block_access().
*/
function MYMODULE_block_access(Block $block, $operation, AccountInterface $account) {
if ($operation === 'view' && $block->getPluginId() === 'MYBLOCK') {
$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;
}
}
}
return AccessResult::forbiddenIf($hero_image_exists === FALSE)->addCacheableDependency($block);
}
return AccessResult::neutral();
}
Gracias @Insasse por compartir la siguiente joya en los comentarios. Para bloques personalizados creados mediante programación, puede controlar la visibilidad directamente desde el interior de la clase de bloque a través de 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'); } }
Fuente:Cómo crear un bloque mediante programación en Drupal 8