Obter uma imagem de um artigo / entidade

8

Como faço para obter mais facilmente uma imagem (seu caminho) do tipo de conteúdo do artigo incluído no Drupal 8?

O que eu tenho é uma entidade. Usar $image = $node->fields['field_image']me dá uma estrutura infernal, no entanto.

Não existe uma maneira mais fácil de obter o caminho da imagem? Também não consigo encontrar a URL, o que recebo é algum tipo de target_id (o ID do arquivo?).

Undrium
fonte
O que get_class ($node->fields['field_image'])você tem?
Clive
Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList é o que ele fornece, isso apenas parece conter propriedades do que é permitido fazer upload.
Undrium
Se você repetir a lista, que tipos são seus membros? Eu não verifiquei, mas espero ter uma digitação razoavelmente forte do campo. Se tudo mais falhar, você pode usar file_load()e um dos métodos disponíveis emDrupal\file\FileInterface
Clive
Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem é o que recebo, embora não saiba como lidar com isso adequadamente.
Undrium
file_load é o último recurso, mas é privado e parece tão errado.
Undrium

Respostas:

17

Não vi isso antes.

A maneira mais curta de obter a entidade referenciada para um campo de valor único é:

$node->field_image->entity->url()

Você também pode especificar o delta explicitamente:

$node->field_image[0]->entity->url()

Isso funciona com muita mágica ArrayAccess e __get ().

Veja também a grande folha de dicas em http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . e https://www.drupal.org/node/1795854 e as outras páginas de documentação lá para obter mais informações (ainda há muito trabalho em andamento).

Berdir
fonte
Agradável! Fiquei me perguntando como podemos obter a imagem alt. Eu tentei $ node-> field_image [0] -> entidade-> alt e $ node-> field_image [0] -> entidade-> imagem-> alt; que eu encontrei na documentação que você mencionou, mas não funciona com a entidade do nó, eu acho.
Hedeshy
11
o alt / title não está na entidade do arquivo referenciado, mas no próprio item do campo. Apenas $ node-> field_image [0] -> alt deve funcionar bem.
Berdir
3

O que acabou trabalhando para mim no D8 é:

$imageUrl = $node->get('field_image')->entity->uri->value;

Usar kint($node->get('field_image')->entity)e examinar a matriz foi muito útil

insira a descrição da imagem aqui

Então, no meu arquivo de galho, usei:

<img class="top-article-image" src="{{ file_url(imageUrl) }}" />
crobicha
fonte
1

Portanto, minha solução foi usar o método "referencedEntities ()" encontrado no objeto node. Isso me deu uma matriz de objetos de arquivo que eu poderia percorrer e usar o método "url ()" dos objetos de arquivo para recuperar um caminho válido.

Undrium
fonte
0

Se o seu nó tiver mais de uma imagem, você poderá usá-lo para obter uma matriz dos URLs da imagem (útil para criar módulos de apresentação de slides entre muitas outras coisas úteis)

$allImagesFound = false;
$imageUrls = array();
$numberOfImages = 0;
while(!$allImagesFound)
{
    //make sure we are not calling a null value, if so then we have found all images
    if($node->get('your_image_field_name')[$numberOfImages] != null) {
        $imageUrls[] = $node->get('your_image_field_name')[$numberOfImages]->entity->url();
        $numberOfImages++;
    } else {
        $allImagesFound = true;
        break;
    }
}

A matriz imageUrls retém todos os URLs de todas as imagens associadas ao campo de nós. Espero que isto ajude.

Trey Ellis
fonte