Obtener una imagen de un artículo / entidad

8

¿Cómo obtengo más fácilmente una imagen (su ruta) del tipo de contenido del artículo incluido en Drupal 8?

Lo que tengo es una entidad. Sin $image = $node->fields['field_image']embargo, usar me da una estructura infernal.

¿No hay una manera más fácil de obtener la ruta de la imagen? Además, no puedo encontrar la URL en esto, lo que obtengo es algún tipo de target_id (¿la ID del archivo?).

Undrium
fuente
¿Qué get_class ($node->fields['field_image'])te da?
Clive
Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList es lo que me da, esto solo parece contener propiedades de lo que está permitido cargar.
Undrium
Si itera la lista, ¿de qué tipos son sus miembros? No lo he comprobado, pero espero un tipeo del campo razonablemente fuerte. Si todo lo demás falla puede utilizar file_load()y uno de los métodos disponibles enDrupal\file\FileInterface
Clive
Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem es lo que obtengo, aunque no estoy seguro de cómo manejarlo correctamente.
Undrium
file_load es un último recurso, pero está desprovisto y se siente muy mal.
Undrium

Respuestas:

17

No vi esto antes.

La forma más corta de obtener la entidad referenciada para un campo de valor único es esta:

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

También puede especificar el delta explícitamente:

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

Esto funciona con mucha magia ArrayAccess y __get ().

Vea también la gran hoja de trucos en http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . y https://www.drupal.org/node/1795854 y las otras páginas de documentación allí para obtener más información (todavía hay mucho trabajo en progreso).

Berdir
fuente
¡Agradable! Me preguntaba cómo podemos obtener la imagen alt. Intenté $ node-> field_image [0] -> entity-> alt y $ node-> field_image [0] -> entity-> image-> alt; que encontré en la documentación que mencionó, pero no funciona con la entidad de nodo, creo.
Hedeshy
1
alt / title no está en la entidad de archivo referenciada sino en el elemento de campo en sí. Solo $ node-> field_image [0] -> alt debería funcionar bien.
Berdir
3

Lo que terminó trabajando para mí en D8 es:

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

Usar kint($node->get('field_image')->entity)y mirar a través de la matriz fue muy útil

ingrese la descripción de la imagen aquí

Luego, en mi archivo de ramita, utilicé:

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

Entonces, mi solución fue usar el método "referencedEntities ()" que se encuentra en el nodoobjeto. Esto me dio una matriz de objetos de archivo que pude recorrer y usar el método "url ()" de los objetos de archivo para recuperar una ruta válida.

Undrium
fuente
0

Si su nodo tiene más de una imagen, puede usar esto para obtener una matriz de las URL de imágenes (útil para crear módulos de presentación de diapositivas entre muchas otras cosas útiles)

$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;
    }
}

La matriz imageUrls contendrá todas las URL para cualquier imagen asociada con el campo de nodos. Espero que esto ayude.

Trey Ellis
fuente