drupal 8 – ¿Cómo puedo controlar la visibilidad del bloque con código?

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

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım