Como faço para acessar dados de campo no Twig?

15

Eu tenho um campo de lista para um tipo de bloco personalizado que se parece com isso:

left|Align left
right|Align right

Eu posso acessar a chave no Twig fazendo algo assim:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

No entanto, se eu fizer uma comparação simples, ela gera FALSE.

{{ kint(content.field_align == 'right') }}

O código a seguir retorna TRUE.

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

Existe uma versão mais curta para obter a string "real" para que eu possa usar os filtros de string do Twigs e mantê-la arrumada?

estrar
fonte

Respostas:

16

content contém as matrizes de renderização com base nos formatadores configurados.

Se você deseja acessar os valores reais, deseja acessá-los através do objeto de entidade. Geralmente, isso já está disponível para o seu modelo, por exemplo node. Para o seu caso, é um pouco especial porque o block_content é renderizado no conteúdo do bloco sem seu próprio modelo, então você deve disponibilizá-lo da yourtheme_preprocess_block($variables)seguinte maneira:

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

Em seguida, você pode acessar um valor de campo com block_content.field_name.property. Então, no seu caso block_content.field_align.value. A propriedade é valuepara a maioria dos tipos de campos, para referências, você pode usar target_idpara o ID ou entitypara o objeto de entidade referenciado. Sim, você pode acessar diretamente os campos sobre isso, mas verifique sempre se existe uma referência, caso contrário, poderá acabar com erros ou exceções fatais. Para acessar o rótulo de uma referência de termo, por exemplo, você pode acessá-lo como block_content.field_tags.entity.name.value.

Se você não especificar o delta do campo, o padrão será o primeiro. Se você deseja acessar um delta diferente, pode usar entity.field_name.1.valuee assim por diante. Você também pode fazer um loop sobre eles.

Isso tudo mapeia diretamente para o PHP, você também pode fazer $block_content->field_tags->entity->name->valueno pré-processo e em outros lugares onde você tem o block_content.

Berdir
fonte
Obrigado pela sua resposta! Como estou fazendo isso no modelo de bloco de galho onde o objeto do nó não está disponível (sub-tema "Classy"), precisaria pré-processar os valores e injetá-los de alguma forma?
estrar 27/08/15
Desculpe, perdi a parte block_content. Atualizado a resposta.
Berdir 27/08/15
Perfeito! Eu poderia obter os valores fazendo o seguinte: block_content.field_name.value Obrigado por me ajudar a entender!
estrar 27/08/15
6

Aqui está uma maneira alternativa, apenas de modelo, que permite renderizar uma matriz de renderização e verificar seu valor (permite verificar a variável como se você a estivesse imprimindo, porque a impressão no Drupal 8 Twig renderiza automaticamente variáveis ​​que são matrizes de renderização):

{{ kint(content.field_align|render == 'right') }}

Ou outra opção para salvar a renderização extra se você estiver imprimindo a variável posteriormente:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}
Cottser
fonte
Muito útil e bom saber! Obrigado pela contribuição.
estrar
2

Você pode usar o módulo Twig Field Value neste caso. Permite obter dados parciais de matrizes de renderização de campo. Por ex. content.field_name | field_value -get valor do campo. Você pode usá-lo na instrução SE

Andrew Kozoriz
fonte