Получить изображение из статьи / объекта

8

Как мне проще всего получить изображение (его путь) из типа контента статьи, включенного в Drupal 8?

То, что у меня есть, это сущность. Использование $image = $node->fields['field_image']дает мне адскую структуру, хотя.

Нет ли более простого способа получить путь к изображению? Также я не могу найти URL в этом, что я получаю, это своего рода target_id (идентификатор файла?).

Undrium
источник
Что get_class ($node->fields['field_image'])тебе дает?
Клайв
Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList - это то, что он мне дает, кажется, он содержит только свойства того, что разрешено загружать.
Undrium
Если вы перебираете список, какие типы являются его членами? Я не проверял, но я бы надеялся на достаточно сильную типизацию поля. Если все остальное терпит неудачу, вы можете использовать file_load()один из методов, доступных наDrupal\file\FileInterface
Clive
Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem - это то, что я получаю, хотя и не знаю, как правильно его обрабатывать.
Undrium
file_load является последним средством, но он ограничен и чувствует себя так неправильно.
Undrium

Ответы:

17

Не видел этого раньше.

Кратчайший способ получить ссылочную сущность для поля с одним значением:

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

Вы также можете указать дельту явно:

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

Это работает с большим количеством волшебства ArrayAccess и __get ().

Смотрите также большой шпаргалку на http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . и https://www.drupal.org/node/1795854 и другие страницы документации для получения дополнительной информации (все еще очень много работы в процессе).

Berdir
источник
Ницца! Мне было интересно, как мы можем получить изображение alt. Я попытался $ node-> field_image [0] -> entity-> alt и $ node-> field_image [0] -> entity-> image-> alt; который я нашел в документации, которую вы упомянули, но она не работает с сущностью узла, я думаю.
Hedeshy
1
alt / title находится не в указанном объекте файла, а в самом элементе поля. Просто $ node-> field_image [0] -> alt должно работать нормально.
Бердир
3

То, что в итоге работало на меня в D8:

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

Использование kint($node->get('field_image')->entity)и просмотр массива было очень полезно

введите описание изображения здесь

Тогда в моем файле ветки я использовал:

<img class="top-article-image" src="{{ file_url(imageUrl) }}" />
crobicha
источник
1

Поэтому я решил использовать метод "referencedEntities ()", найденный в объекте node. Это дало мне массив File-объектов, которые я мог бы перебрать и использовать метод url () из файловых объектов для получения правильного пути.

Undrium
источник
0

Если ваш узел имеет более одного изображения, вы можете использовать это для получения массива URL-адресов изображений (полезно для создания модулей слайд-шоу среди множества других полезных вещей)

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

Массив imageUrls будет содержать все URL для любых изображений, связанных с полем узлов. Надеюсь это поможет.

Трей Эллис
источник