Então, eu tenho esse nó:
object(Drupal\node\Entity\Node)[1862]
protected 'values' =>
array (size=17)
'vid' =>
array (size=1)
'x-default' => string '7' (length=1)
'langcode' =>
array (size=1)
'x-default' =>
array (size=1)
0 =>
array (size=1)
'value' => string 'en' (length=2)
... (more fields)
'field_image' =>
array (size=1)
'x-default' =>
array (size=1)
0 =>
array (size=5)
'target_id' => string '1' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '150' (length=3)
'height' => string '120' (length=3)
Agora o field_image possui uma matriz com x-default e alguns dados básicos da imagem. Como mostro a imagem ou crio um link para a imagem dentro do modelo Twig?
url(node.field_image.0.entity.uri)
( questão relevante )Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string
então eu tentei com isso:url(node.field_image.0.entity.uri.value)
mas depois ele me diz o seguinte:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
FieldItemList
s em uma representação string (que não consigo encontrar)url()
quer uma rota. Que talurl_from_path(node.field_image.0.entity.uri.value)
?url_from_path()
parece gerar isso:http://mywebsite.local/public%3A//image.png
portanto, parece estar codificando url e acrescentando o valor exato ao URLRespostas:
Aqui está uma versão atualizada para esta resposta após 8.0.x. Esta base no comentário @joelpittet .
fonte
url()
método, então você pode simplesmente chamar ementity.url()
vez de passarentity.fileuri
parafile_url()
Eu não sei sobre o Twig, mas você obtém o URI do arquivo
$node->field_image->entity->getFileUri()
no PHP, e você precisa chamarfile_create_url()
isso:Não sei se isso é possível em galho. Se não for possível, você sempre pode calculá-lo no pré-processo e adicionar como uma nova variável.
fonte
Se alguém precisar de uma imagem estilizada:
fonte
use Drupal\image\Entity\ImageStyle;
$relative = file_url_transform_relative($styled_image_url);
para garantir que seja relativo. API aquiNenhuma das soluções de galho acima funcionou para mim (talvez as que funcionaram para as versões 8.x mais antigas, mas não para a versão 8.5
NOTA: deve estar funcionando para o Drupal 8.5+
fonte
Então, eu descobri a resposta com a ajuda de Clive .
A obtenção do URI da imagem no Twig é feita usando
node.field_image.0.entity.uri.value
A obtenção do URL completo da imagem pode ser feita usando
file_create_url(node.field_image.0.entity.uri.value)
Ainda não é possível fazer isso no Twig, mas eles estão trabalhando nisso -> veja aqui
fonte
O que acabou trabalhando para mim no D8 é:
Usar
kint($node->get('field_image')->entity)
e examinar a matriz foi muito útilEntão, no meu arquivo de galho, usei:
fonte
você pode obter o URL diretamente usando field_image.entity.url
fonte
Estou sempre usando uma função auxiliar
fonte
É assim que você deseja obter o URL da imagem com o estilo de imagem associado a qualquer campo de imagem em um modelo de galho:
Primeiro instale o módulo Twig Tweak
Em seguida, defina o URI da imagem como uma variável. Com o URI, você pode usar um padrão de twig tweaks para obter o caminho com o estilo de imagem desejado. Ver abaixo:
Twig Tweak v2.4 + oferece
file_url
filtro para extrair o URL do arquivo de uma entidade.fonte
Como tive o mesmo problema, criei uma
get_image_path()
função Twig e a adicionei com várias outras coisas úteis ao meu módulo Starter padrão:https://github.com/brynj-digital/starter
A função aceita o campo da imagem e o nome da máquina de um estilo de imagem e retorna o caminho da imagem.
Ele funciona em muitos contextos - você pode passar
node.field_name
,content.field_name
ourow._entity.field_name
(no caso de uma vista modelo de campos).fonte
Puxa, na verdade demorei minhas idades para descobrir por que meus URLs resultantes não funcionaram. Todos os 404'ed. Você precisa criar um derivado primeiro se ele ainda não existir .
Por exemplo, quando você adiciona um estilo de imagem posteriormente, após o upload da imagem original, ainda não existe um arquivo de imagem com estilo (o derivado da imagem). Ele precisa ser criado primeiro.
Substitua
field_MYIMAGE
eMYSTYLE
conforme necessário.Eu gostaria que isso acontecesse automaticamente.
fonte
um pouco relacionado, eis o que eu usei (graças a todas as respostas anteriores para chegar lá) para obter um URL de arquivo de imagem no campo de imagem de uma entidade de mídia em galho:
agora eu posso usar essa variável no meu template galho
fonte
Para obter atributos de imagem como URI, alt, título, etc, use a sintaxe como abaixo no modelo
No modelo de galho de nó
Modelo de galho de campo
Em outro modelo de galho de campo
Nota: Verifique também a folha de dicas do módulo twig_tweaks para obter detalhes relacionados ao problema relacionado ao galho.
fonte
Você pode usar o
url()
método que está na classe File como um atalho para:pode ser reduzido para:
Isso funciona nas funções de pré-processo, mas dispara um
Twig_Sandbox_SecurityError
quando chamado em um modelo de galho.Se você receber,
Twig_Sandbox_SecurityError
pode dizer ao twig para permitirurl
no seu arquivo settings.php, conforme mencionado neste post do StackoverflowConsulte a documentação em File :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.x
fonte
Você pode fazer isso de duas maneiras!
1) file_create_url (---------) // dentro escreve o caminho do nó
2) file_url (-------) // dentro escreve o caminho do nó
fonte