¿Cómo hacer una sugerencia de gancho de tema para bloques según la región?

14

Desde Drupal 8 no es posible con convenciones de nomenclatura de plantilla cargar una plantilla de bloque específica de acuerdo con la región en la que se encuentra ( "Se eliminó el marcado de bloque por región y la función de plantilla de bloque por región" ). Pero necesito tener diferentes html para los bloques si se colocan en una determinada región. ¿Cómo logro esto?

He pensado en usar MYMODULE_theme_suggestions_block_alter pero no sé cómo obtener la región actual.

Philipp Michael
fuente

Respuestas:

20

Puedes obtener región si obtienes Block Entity.

archivo .module o .theme

use Drupal\block\Entity\Block;

function MODULE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  if (!empty($variables['elements']['#id'])) {
    $block = Block::load($variables['elements']['#id']);
    $suggestions[] = 'block__' . $block->getRegion() . '__' . $variables['elements']['#id'];
  }
  /* Use this 'else if' only if you are using page_manager module and want to know which region is the block */
  else if (isset($variables['elements']['#configuration']['region'])) {
    $suggestions[] = 'block__page_' . $variables['elements']['#configuration']['region'] . '__' . end(explode(':', $variables['elements']['#plugin_id']));
  }
  return $suggestions;
}

Edición 1: cubierta del caso del módulo page_manager.

Vagner
fuente
Casi perfecto. Debe agregar un isset () para asegurarse de que el #id esté realmente allí. Por ejemplo, si usa page_manager y coloca bloques allí, entonces no tendrá un #id.
Berdir
@ Berdir gracias;). Creo que en este caso isset()no es obligatorio, porque si no existe #id, entonces pasa NULLa ::loadfuncionar y simplemente regresa NULL. Al final, $blockes NULLy no pasará nada. Probado en mi dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (nunca he usado este módulo antes).
Vagner
Sí, se requiere isset (). acceder a una clave de matriz que no existe da como resultado un aviso de PHP. Revisa tus registros y verás. Recomendaría desarrollar siempre con visualización de errores en verbose, que es el valor predeterminado de la configuración de ejemplo proporcionada.php.
Berdir