Existem dois tipos de blocos, e o método para renderizar os dois é um pouco diferente:
Blocos de Conteúdo
Blocos de conteúdo são blocos criados na interface. Eles são muito parecidos com as estruturas de dados configuráveis dos nós, com campos etc. Se você deseja renderizar uma delas, pode fazer o que normalmente faria com entidades, carregá-las e renderizá-las com o construtor de vistas:
$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;
Blocos de plug-in
Os blocos também podem ser plugins, definidos em vários módulos. Um exemplo pode ser o bloco de trilha de navegação. Se você deseja renderizá-las, precisará usar o gerenciador de plug-ins de bloco.
$block_manager = \Drupal::service('plugin.manager.block');
// You can hard code configuration or you load from settings.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Some blocks might implement access check.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Return empty render array if user doesn't have access.
// $access_result can be boolean or an AccessResult class
if (is_object($access_result) && $access_result->isForbidden() || is_bool($access_result) && !$access_result) {
// You might need to add some cache tags/contexts.
return [];
}
$render = $plugin_block->build();
// In some cases, you need to add the cache tags/context depending on
// the block implemention. As it's possible to add the cache tags and
// contexts in the render method and in ::getCacheTags and
// ::getCacheContexts methods.
return $render;
Entidades de configuração
Os blocos compartilhados para os dois tipos são: depois que você os inserir em uma região, você criará uma entidade de configuração que possui todas as configurações para o bloco. Em alguns casos, será mais útil lidar com entidades de configuração. Como o mesmo bloco pode ser colocado em várias regiões com e com configurações diferentes, pode ficar mais complicado usando as entidades de configuração do bloco. O bom é que você pode renderizar um bloco com uma configuração específica, o ruim é que os IDs de configuração podem mudar ao mexer na interface, portanto, o código pode não funcionar depois de permitir que os usuários usem a interface do bloco.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
Para exibir apenas seu bloco em seus modelos com pré-processamento, a melhor maneira é
E no seu
page.html.twig
ounode.html.twig
ouxxx.html.twig
use sua variável My_region assim:E na matriz renderizável (módulo personalizado), por exemplo, em um controlador personalizado em content ():
Usando
não é útil, pois o Drupal já assume a renderização em D8 e isso foi preterido . Você deve usar em seudrupal_render
\Drupal::service('renderer')->renderRoot()
lugar.É um pouco pesado, é melhor usar o sistema de área máxima e não adiciona bloco de carga do pré-processo. No caso de usar um controlador em seus módulos, isso parece um uso justificado.
fonte
element-content
propriedade em uma matriz de renderização. Você sabe onde está documentado?\Drupal\block\Entity\Block::load
não retorna um bloco o tempo todo. Ele só retorna algo se o bloco que eu carrego é colocado dentro da visualização no layout do bloco . Se não for colocado, ele retornará nulo.\Drupal::entityTypeManager()->getViewBuilder('block')->view($block);
Além da resposta principal ... Se você deseja renderizar um bloco de uma exibição, talvez seja necessário fazer as coisas de maneira um pouco diferente.
(nome de exibição, por exemplo - -> bloco_1)
Como vamos passar para o galho, não precisamos renderizar (usando o serviço de renderização).
Então você pode simplesmente passá-lo como uma variável para galho (neste exemplo, é o retorno de um Controller):
no seu módulo, você precisa de um hook_theme () para sua variável:
E, finalmente, no seu modelo de galho:
fonte
Eu precisava obter o HTML de um bloco personalizado e obtê-lo usando:
fonte
__toString()
.fonte
drupal_render
ou o serviço de renderização.drupal_render
é depreciado, mas returing uma renderização de uma matriz com o conteúdo renderizado é muito ruim; você deve retornar$block_content
, a matriz de renderização pode ser alterada antes da renderização real e você deve permitir que o Drupal faça a renderização o máximo possível ou faça você mesmo.Basicamente, existem dois tipos de renderizações.
Quando existe uma instância existente do bloco no layout. o bloco pode ser renderizado em galho usando pré-processo como
$ block = Block :: load ('BLOCK_ID'); $ variable ['social_links'] = \ Drupal :: entityTypeManager () -> getViewBuilder ('block') -> view ($ block);
Não há instância ou configurações para o bloco. Em seguida, no pré-processador, precisamos criar a instância, criar o bloco e renderizá-lo
$ block_manager = \ Drupal :: service ('plugin.manager.block'); $ config = []; $ plugin_block = $ block_manager-> createInstance ('farmjournal_social_sharing', $ config); $ render = $ plugin_block-> build (); $ variable ['farmjournal_social_sharing'] = render ($ render);
fonte
Parece que isso funciona para blocos de plugins.
fonte
Você obtém a saída do bloco:
E então você pode retornar a saída de diferentes maneiras:
ou:
fonte
\Drupal::service ('renderer')->render ($block_content)
pode ser feito comodrupal_render ($block_content)
No entanto, o último é preterido no Drupal 8.drupal_render
ou o serviço de renderização.drupal_render
é depreciado, mas returing uma renderização de uma matriz com o conteúdo renderizado é muito ruim; você deve retornar$block_content
, a matriz de renderização pode ser alterada antes da renderização real e você deve permitir que o Drupal faça a renderização o máximo possível ou faça você mesmo. O que você retorna precisa ser renderizado novamente, o que torna a renderização real inútilCom base em minha pesquisa, você pode basear o código de Como renderizar um bloco programaticamente no drupal 8 . Você também pode mudar
em algo tão simples como:
para anexá-lo, por exemplo, à variável de retorno de uma página.
fonte
drupal_render
ou o serviço de renderização.drupal_render
é depreciado, mas returing uma renderização de uma matriz com o conteúdo renderizado é muito ruim; você deve retornar$block_content
, a matriz de renderização pode ser alterada antes da renderização real e você deve permitir que o Drupal faça a renderização o máximo possível ou faça você mesmo.