Entonces tengo este nodo:
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)
Ahora field_image tiene una matriz con x-default y algunos datos de imagen básicos. ¿Cómo muestro la imagen o creo un enlace a la imagen dentro de la plantilla Twig?
url(node.field_image.0.entity.uri)
( problema relevante )Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string
así que lo intenté con esto:url(node.field_image.0.entity.uri.value)
pero luego solo me dice esto:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
FieldItemList
s en una representación de cadena (que no puedo encontrar)url()
quiere una ruta. ¿Qué talurl_from_path(node.field_image.0.entity.uri.value)
?url_from_path()
parece generar esto:http://mywebsite.local/public%3A//image.png
por lo que parece estar codificando y agregando el valor exacto a la urlRespuestas:
Aquí hay una versión actualizada de esta respuesta después de 8.0.x. Esta base en el comentario de @joelpittet .
fuente
url()
método, por lo que simplemente puede llamar enentity.url()
lugar de pasarentity.fileuri
afile_url()
No sé acerca de Twig, pero obtienes el URI del archivo
$node->field_image->entity->getFileUri()
en PHP, y necesitas llamarfile_create_url()
a eso:No sé si eso es posible en Twig. Si no es posible, siempre puede calcularlo en el proceso previo y agregarlo como una nueva variable.
fuente
Si alguien necesita una imagen con estilo:
fuente
use Drupal\image\Entity\ImageStyle;
$relative = file_url_transform_relative($styled_image_url);
para asegurarse de que sea relativo. API aquíNinguna de las soluciones de ramitas anteriores funcionó para mí (quizás las que funcionaron para versiones anteriores de 8.x pero no para la versión 8.5
NOTA: debería funcionar para Drupal 8.5+
fuente
Así que he encontrado la respuesta con la ayuda de Clive .
La obtención del URI de la imagen en Twig se realiza utilizando
node.field_image.0.entity.uri.value
Puede obtener la URL completa de la imagen usando
file_create_url(node.field_image.0.entity.uri.value)
Hacer esto en Twig aún no es posible, pero están trabajando en ello -> ver aquí
fuente
Lo que terminó trabajando para mí en D8 es:
Usar
kint($node->get('field_image')->entity)
y mirar a través de la matriz fue muy útilLuego, en mi archivo de ramita, utilicé:
fuente
puedes obtener la url directamente usando field_image.entity.url
fuente
Siempre estoy usando una función auxiliar
fuente
De esta manera, si desea obtener la URL de la imagen con el estilo de imagen asociado para cualquier campo de imagen en una plantilla de ramita:
Primero instale el módulo Twig Tweak
Luego configure el URI de la imagen como una variable. Con el URI, puede usar un patrón de ajustes de ramita para obtener el camino con el estilo de imagen que desee. Vea abajo:
Twig Tweak v2.4 + ofrece un
file_url
filtro para extraer la URL del archivo de una entidad.fuente
Tuve el mismo problema, así que creé una
get_image_path()
función Twig y la agregué con un montón de otras cosas útiles a mi módulo de inicio:https://github.com/brynj-digital/starter
La función acepta el campo de imagen y el nombre de máquina de un estilo de imagen, luego devuelve esa ruta de imagen.
Funciona en muchos contextos: puede pasar
node.field_name
,content.field_name
orow._entity.field_name
(en el caso de una plantilla de campos Ver).fuente
Dios mío, en realidad me llevó mucho tiempo descubrir por qué las URL resultantes no funcionaban. Todos los 404'ed. Primero debe crear un derivado si aún no existe .
Entonces, por ejemplo, cuando agrega un estilo de imagen más tarde, después de cargar la imagen original, todavía no hay un archivo de imagen con estilo (el derivado de la imagen). Necesita ser creado primero.
Reemplace
field_MYIMAGE
yMYSTYLE
según lo necesite.Deseo que esto suceda automáticamente.
fuente
algo relacionado, esto es lo que usé (gracias a todas las respuestas anteriores para llevarme allí) para obtener una URL del archivo de imagen del campo de imagen de una entidad de medios en rama:
ahora puedo usar esta variable en mi plantilla de ramita
fuente
Para obtener atributos de imagen como URI, alt, título, etc., use la sintaxis como se muestra a continuación.
En plantilla de ramita de nodo
En campo plantilla de ramita
En otra plantilla de ramita de campo
Nota: Consulte también la hoja de trucos del módulo twig_tweaks para obtener detalles relacionados con el problema relacionado con la rama.
fuente
Puede usar el
url()
método que se encuentra en la clase File como acceso directo, por lo que:se puede acortar a:
Esto funciona en las funciones de preproceso, pero activa un
Twig_Sandbox_SecurityError
cuando se llama en una plantilla de ramita.Si lo recibe
Twig_Sandbox_SecurityError
, puede decirle a Twig que permitaurl
el archivo settings.php como se menciona en esta publicación de StackoverflowVer documentación en Archivo :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.x
fuente
¡Puedes hacerlo de dos maneras!
1) file_create_url (---------) // dentro de escribir la ruta del nodo
2) file_url (-------) // dentro de escribir la ruta del nodo
fuente