Como encontrar o URL do estilo da imagem no modelo de galho?

10

Estou implementando um modelo de nó que usa uma imagem duas vezes; uma vez de uma maneira 'normal' (ou seja, usando o estilo de imagem definido na configuração de exibição do campo para esse modo de exibição) e o outro como uma propriedade de imagem de plano de fundo do css.

Eu preciso de uma de duas coisas:

  1. (idealmente) uma maneira de obter o URL para um estilo de imagem diferente da mesma imagem.

  2. uma maneira de obter o URL para o campo da imagem.

Estou lutando para usar dump()e kint()me ajudar a responder. Ambos produzem demais (graças a links incorporados para "pai" etc.) e parecem não ter as informações de que preciso. por exemplo, olhando para a dump(content.field_image)saída, o URL real da imagem não existe (portanto, de onde ela vem para que possa ser renderizada com {{ content.field_image }}?!). kint()por outro lado, morre completamente se eu passar um argumento para ele e a versão de nível superior é novamente grande demais para navegar. A depuração foi muito mais fácil com o phptemplate + xdebug. (Sim, eu sei que é bom que eles não possam descartar o banco de dados.)

Há uma resposta para (1) que implica que você não pode fazê-lo , mas não entendo por que não consigo obter o URL existente em (2)?

artfulrobot
fonte

Respostas:

11

Você pode obter o URL do estilo da imagem em uma função de pré-processo e passá-lo para o modelo de nó. (no meu caso, eu precisava no nível da página, acho que isso ainda funcionaria para o nó)

Algo assim, com "myimagefield" sendo o nome da máquina para o seu campo de imagem e "myimagestyle" sendo o nome da máquina para o seu estilo, também inclua o Entity \ ImageStyle.

use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_preprocess_page().
*/
function mytheme_preprocess_page(&$variables, $hook) {
  if ($variables['node']) {
    $node = $variables['node'];
    if($node->myimagefield[0]){
        $cover_image = $node->myimagefield[0]->entity->getFileUri();
        $image_url = ImageStyle::load('myimagestyle')->buildUrl($cover_image);
        $variables['my_image'] = $image_url;
    }
  }
}
Greg
fonte
11
a pergunta diz para puxar o modo de visualização da configuração de exibição do campo. Ao fazer o $ image_url = ImageStyle :: load ('myimagestyle') -> buildUrl ($ cover_image); como você extrai o estilo da imagem da configuração do campo? Você simplesmente adicionou meu estilo de imagem, mas e se o mesmo campo estiver em várias entidades (por exemplo, nós) onde ele requer estilos de imagem diferentes?
usernameabc
14

A primeira parte já foi respondida na pergunta vinculada, onde há o código de como fazer isso. Para responder à segunda parte da pergunta, você pode acessar a imagem original no objeto do nó:

{{ file_url(node.field_image.entity.uri.value) }}

Uma observação sobre content:

Em um modelo de nó, o campo da imagem contentnão está pronto para ser renderizado. O campo contém a configuração de como deve ser exibida e o objeto de campo que contém todos os dados brutos. Posteriormente, isso será montado no campo, no formatador de imagens e nos modelos de imagem. Essa é a razão pela qual você não encontra o URL que está procurando contentneste momento.

No modelo de nó, você pode usar os campos no nível superior da matriz de conteúdo, por exemplo, exibir o campo de imagem

{{ content.field_image }}

conforme configurado no modo de visualização.

Editar:

Há um novo filtro no módulo Twig Tweak . Agora você pode gerar o URL do estilo da imagem em galho diretamente de um URL ou URL da imagem original:

{{ node.field_image.entity.uri.value | image_style('thumbnail') }} 
4k4
fonte
Obrigado. Então todos os ganchos de pré-processo são chamados quando chamadas de galho são renderizadas, por exemplo, no momento em que você vai {{ content.field_image }}e não antes? Além disso, acho que o URL que receberei da sua sugestão é o URL original - a parte 2 do meu Q estava pedindo o URL do estilo da imagem, conforme é configurado pelo modo de exibição. Isso é possível?
artfulrobot
Isso funciona apenas para imagens carregadas regulares e não para imagens referenciadas por entidade. Como isso pode ser feito para trabalhar com imagens referenciadas por entidade?
paulcap1
@ paulcap1, não sei exatamente o que você quer dizer, porque um campo de imagem é um campo de referência (para uma entidade de arquivo). Se você quer dizer que possui a imagem dentro de uma entidade referenciada, precisará .entityduas vezes, primeiro para chegar à entidade e depois para a imagem.
4k4
11
@ paulcap1, por exemplo{{ node.field_ref.entity.field_image.entity.uri.value }}
4k4
@ 4k4. Estou usando o tipo de conteúdo padrão da página. Eu tenho um campo referenciado pela entidade chamado field_global_image. Isso usa o pacote de imagens. O campo de imagem Bundles é chamado "" image "Eu tentei do seu jeito usando {{node.field_global_image.entity.image.entity.uri.value}} Também tentei alternar os campos dessa forma {{node.image.entity.field_global_image .entity.uri.value}} Nem trabalhou na minha resposta em um post separado, que é o que funcionou para mim..
paulcap1
6

Instale o Twig Tweak Module https://www.drupal.org/project/twig_tweak

E este módulo Twig Field https://www.drupal.org/project/twig_field_value

Se você estiver usando imagens regulares de campo de upload de imagens, use isso no seu modelo de nó:

<img src="{{ node.field_regular_image.entity.uri.value | image_style('thumbnail') }} " >

Se você estiver usando uma imagem de referência da entidade, use este:

<img src="{{ file_url(content.field_global_image|field_target_entity.image.entity.uri.value | image_style('thumbnail'))}} " >
paulcap1
fonte
Observe que no exemplo sobre o uso de entidades referenciadas imagedepois, field_target_entityrefere-se ao campo de imagem na entidade referenciada. Você pode precisar ajustá-lo.
Daniels
11
Obrigado! O exemplo de referência da entidade também pode ser realizado sem o módulo twig_field_value por:file_url(node.field_image.entity.field_referenced_image.entity.uri.value | image_style('thumbnail'))
John