Renderize um campo de nó dentro de page.html.twig

12

Eu tenho um campo de imagem no meu tipo de conteúdo (field_hero_image).

Não quero que ele seja renderizado no arquivo node.html.twig. No entanto, eu quero renderizá-lo no arquivo page.html.twig. Especificamente, quero renderizá-lo ao lado do título da página.

Que código eu usaria no meu arquivo page.html.twig para acessar os campos no nível do nó e renderizá-los?

(Existe uma pergunta semelhante postada, mas não consegui usar a resposta fornecida para resolver meu problema.)

Isso para o tema Drupal 8.

kraftybasterd
fonte
2
@kiamlaluno - por que você editou minha pergunta? Ter "Drupal 8" no título E na pergunta torna óbvio para possíveis fornecedores e também facilita a busca no Google, dada a prevalência do conteúdo do Drupal 6 e 7 por aí; tornar o Drupal 8 perguntas / respostas muito claras é útil para a comunidade em geral que procura respostas específicas para o D8. Estava imaginando qual era o seu raciocínio para mudar isso.
precisa saber é o seguinte
Por favor, não duplique tags nos títulos das perguntas; as tags são visíveis em todos os lugares em que uma pergunta é visível; portanto, não há necessidade de usar tags também no título da pergunta.
kiamlaluno
2
Obviamente, sou novo aqui ... mas as meta tags (neste caso, "8") ajudam nos resultados dos mecanismos de pesquisa? Eu sinto que os títulos de conteúdo que contêm Drupal 8 ou Drupal 7 poderiam ajudar as pessoas a procurar respostas no Google ... apenas uma idéia.
precisa saber é o seguinte

Respostas:

26

Depois de fazer um pouco mais de pesquisa, consegui encontrar peças suficientes em outras perguntas e no drupal.org para alcançar o que queria fazer.

Não é necessário pré-processamento para esta resposta, portanto, nenhum código precisa ser adicionado ao seu arquivo mytheme.theme.
Todas essas variáveis ​​já estão acessíveis em page.html.twig por padrão.

Para renderizar o valor padrão de um campo em page.html.twig, você normalmente usaria uma variável Twig como em {{ node.field_some_name.value }}.

Se você possui um campo de imagem e deseja renderizar o URL para a imagem armazenada nesse campo dentro do modelo page.html.twig, use-o {{ file_url(node.field_some_image.entity.fileuri) }}.

Por fim, se você deseja renderizar o título de um nó dentro do modelo page.html.twig, use-o {{ node.label }}.

Também aprendi como usar alguns condicionais do Twig para meu problema específico, mas isso está além do escopo desta pergunta / resposta.

kraftybasterd
fonte
Eu era cético, tendo a impressão de que em D7 esse tipo de coisa sempre deveria estar, por exemplo, em uma função de pré-processo. No entanto, o exemplo dos file_url()documentos ( drupal.org/docs/8/theming/twig/functions-in-twig-templates ) faz exatamente isso, portanto, com o voto positivo.
Graham C
Como você percorre um tipo de conteúdo específico e gera seus valores de campos dentro page.html.twig?
Naourass Derouichi
2

Existem três métodos úteis para trabalhar com isso, os quais economizam seu tempo procurando em matrizes de renderização complicadas.

  1. Usando o Display Suite (com o submódulo ds_extras), você pode atribuir à região do herói um bloco ("região do bloco") que é um modo de exibição diferente (ou seja, apenas um que contém a imagem do herói). Assim, você obtém dois modos de exibição diferentes exibidos ao mesmo tempo. Observe que alguns ganchos de pré-processamento podem não ser acionados conforme o esperado, se você fizer isso.

  2. O módulo twig_tweak simplifica bastante essas tarefas e pode fornecer instruções twig mais fáceis para os valores dos campos. Dê uma olhada na folha de dicas para alguns usos comuns: {{ drupal_field('field_image', 'node', 1) }}A assinatura da função é:drupalField($field_name, $entity_type, $id = NULL, $view_mode = 'default', $langcode = NULL)

  3. O módulo twig_field_value faz declarações de galhos mais simples. Por README.txt:<img src={{ file_url(content.field_image|field_target_entity.uri.value) }} alt={{ content.field_image|field_raw('alt') }} />

Se eu soubesse disso antes, teria me poupado muito tempo!

HongPong
fonte
1
Essa é a resposta correta. Na minha experiência, {{ node.field_some_name.value }}não processa o campo. Ele não chama o sistema de tema completo (função de pré-processamento, modelo, etc.). OTOH, se você usar o twig_tweakmódulo, poderá obter o campo totalmente renderizado com{{ node.field_some_name|view }}
kentr