Eu quero renderizar o campo de um nó dentro de um bloco. Funciona assim:
<?php
if ($node) {
if (isset($node->field_body_secondary) && $field = $node->field_body_secondary->value) {
$markup = render($field);
$build = array(
'#type' => 'markup',
'#markup' => $markup,
);
}
}
return $build;
Mas isso não é 100% como se eu apenas renderizasse o campo normalmente, tornando-o visível nas configurações do modo de exibição.
$nodeview
tem#node
como chavePara renderizar um único campo com a configuração de exibição de um modo de exibição, você pode usar o
view()
método do campo:Exemplo para renderizar a imagem no formato teaser:
Ou o corpo completamente:
fonte
['label' => 'inline' ]
$vars['var_name'] = $node_object->field_name->view()[0];
e depois em galho, I pode render {{var_name}}Esta resposta baseia-se em https://drupal.stackexchange.com/a/208061/394
Para renderizar completamente programaticamente o campo que você termina chamando
renderRoot()
, que estabelece um contexto de renderização separado do que as respostas típicas da página usariam - um único contexto de renderização para uma solicitação ou sub-solicitação. Também poderíamos usarrenderPlain()
, mas isso escaparia de todas as coisas.Na substituição do Drush, mas não na execução normal da página, isso lançou um aviso para mim:
fonte
relacionado à resposta de Alex , aqui está como eu a modifiquei para usar o config_pages e criar um bloco global_footer:
Provavelmente é melhor renderizar campos arbitrários a partir de uma configuração config_pages em vez de extrair dados de um nó, mas acho que depende realmente do caso de uso específico sobre qual método é o melhor.
fonte
Graças à resposta de Rainer Feike, cheguei à solução:
Usando
$viewBuilder->viewField
eu posso processar todos os campos separadamente que eu preciso. Eu só preciso descobrir como adicionar o cache, dependendo das configurações do modo de exibição, mas essa é outra questão :)fonte