Получение изображения URL из field_image на узле

42

Итак, у меня есть этот узел:

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)

Теперь у field_image есть массив с x-default и некоторыми базовыми данными изображения. Как мне показать изображение или создать ссылку на изображение внутри шаблона Twig?

Риас
источник
У меня нет времени, чтобы проверить, но, может быть, так просто, как url(node.field_image.0.entity.uri)( соответствующий вопрос )
Клайв
@Clive Я попробовал это и выдаю мне эту ошибку: Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string поэтому я попробовал это с этим: url(node.field_image.0.entity.uri.value)но тогда это просто говорит мне это:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
Rias
Э-э-э ... Я бы предположил, что это нужно сделать в хуке предварительной обработки, если только не существует вспомогательной функции Twig для преобразования FieldItemLists в строковое представление (которое я не могу найти)
Клайв
О, я вижу, url()хочет маршрут. Как насчет url_from_path(node.field_image.0.entity.uri.value)?
Клайв
Хм, url_from_path()кажется, генерирует это: http://mywebsite.local/public%3A//image.pngтак что кажется, что urlencoding и добавляет точное значение к URL-адресу
Rias

Ответы:

49

Вот обновленная версия для этого ответа после 8.0.x. Эта база основана на комментарии @joelpittet .

{{ file_url(node.field_image.entity.fileuri) }}
itsdarrylnorris
источник
2
Обратите внимание, что вы получите URL-адрес исходного изображения без стиля, а не определенный URL-адрес стиля изображения (например, миниатюру). Помимо ответа VladimirM, нет способа получить правильный стилизованный URL-адрес изображения в веточке. По крайней мере, в настоящее время ...
Филипп Майкл
2
... стили изображений теперь доступны в Twig Tweak - drupal.org/project/twig_tweak
4k4
1
Класс File имеет url()метод, так что вы можете просто позвонить , entity.url()а не проходя entity.fileuriкfile_url()
Kiee
36

Я не знаю о Twig, но вы получаете URI файла $node->field_image->entity->getFileUri()в PHP, и вам нужно вызвать его file_create_url():

file_create_url($node->field_image->entity->getFileUri())

Я не знаю, возможно ли это в ветке. Если это невозможно, вы всегда можете рассчитать его в предварительной обработке и добавить в качестве новой переменной.

Berdir
источник
2
Мы пытаемся внедрить file_create_url () в ядро, но отсутствие интереса сделало проблему устаревшей. drupal.org/node/2168231 Хотя, если он туда попал, он должен быть {{file_url (node.field_image.entity.fileuri)}}
joelpittet
27

Если кому-то нужно стилизованное изображение:

$styled_image_url = ImageStyle::load('large')->buildUrl($node->field_image->entity->getFileUri());
VladimirM
источник
4
Это отличный ответ. Обратите внимание, что в файле .theme или .module вы хотите добавить это в начало:use Drupal\image\Entity\ImageStyle;
mikeDOTexe
2
Я столкнулся с проблемой с https, когда Safari не будет показывать изображение, поскольку вместо этого он использует IP. Вы можете добавить, $relative = file_url_transform_relative($styled_image_url);чтобы убедиться, что это относительно. API здесь
mikeDOTexe
9

Ни одно из вышеперечисленных решений не помогло мне (возможно, те, которые работали для более старых версий 8.x, но не для версии 8.5

{{ file_url(node.field_image['#items'].entity.uri.value) }}

ПРИМЕЧАНИЕ: должно работать на Drupal 8.5+

GiorgosK
источник
Я думаю, это плохо, что такие вещи через некоторое время устаревают. Обновление Drupal должно поддерживать тех, кто работает! Это работает для меня в Drupal 8.6, спасибо.
Стеф Ван Луверен
7

Так что я узнал ответ с помощью Клайва .

Получение URI изображения в Twig выполняется с помощью node.field_image.0.entity.uri.value

Получить полный URL-адрес изображения можно с помощью file_create_url(node.field_image.0.entity.uri.value)

Сделать это в Twig пока невозможно, но они работают над этим -> см. Здесь

Риас
источник
6

То, что в итоге работало на меня в 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
источник
Что делать, если изображение не вставлено, и мы установили значение по умолчанию.
аттомоль
2

Вы можете получить URL-адрес напрямую, используя field_image.entity.url

Адриан Кремер
источник
2

Я всегда использую вспомогательную функцию

  /**
   * Get the Image URI.
   *
   * @param \Drupal\Core\Entity\Entity $entity
   * @param $fieldName
   * @param bool $imageStyle
   * @return mixed
   */
  public function getImageUri(\Drupal\Core\Entity\Entity $entity, $fieldName, $imageStyle = FALSE) {
    $imageField = $entity->get($fieldName)->getValue();
    if (!empty($imageField[0]['target_id'])) {
      $file = File::load($imageField[0]['target_id']);
      if ($imageStyle) {
        return ImageStyle::load($imageStyle)->buildUrl($file->getFileUri());
      }

      // Original URI.
      return file_create_url($file->getFileUri());
    }
  }
Хагронапхор
источник
1

Это способ, если вы хотите получить URL-адрес изображения со связанным стилем изображения для любого поля изображения в шаблоне ветки:

Сначала установите модуль Twig Tweak

Затем установите URI изображения в качестве переменной. С помощью URI вы можете использовать шаблон настройки веток, чтобы получить путь с любым стилем изображения, который вы хотите. Увидеть ниже:

{% set image_uri = content.field_feature_row_image['#items'].entity.uri.value %}

<img src="{{ image_uri|image_style('image1200x1103') }}"/>

Twig Tweak v2.4 + предлагает file_urlфильтр для извлечения URL файла из сущности.

<img src="{{ node.field_image|file_url|image_style('image1200x1103') }}"/>
Робб Дэвис
источник
0

У меня была та же проблема, поэтому я создал функцию get_image_path()Twig и добавил ее с кучей других полезных вещей в мой шаблонный модуль Starter:

https://github.com/brynj-digital/starter

Функция принимает поле изображения и имя компьютера стиля изображения, а затем возвращает этот путь изображения.

Это работает во многих контекстах - вы можете передать node.field_name, content.field_nameили row._entity.field_name(в случае шаблона поля View).


источник
0

Черт возьми, мне потребовались годы, чтобы выяснить, почему мои итоговые URL не работают. Все 404-е. Вы должны сначала создать производную, если она еще не существует .

Так, например, когда вы добавляете стиль изображения позже, после того, как исходное изображение было загружено, тогда еще нет стилизованного файла изображения (производное изображения). Это должно быть создано в первую очередь.

Замените field_MYIMAGEи по MYSTYLEмере необходимости.

$original_image = $node->field_MYIMAGE->entity->getFileUri();
$style = \Drupal::entityTypeManager()->getStorage('image_style')->load('MYSTYLE');

$destination = $style->buildUri($original_image);
if (!file_exists($destination)) {
  $style->createDerivative($original_image, $destination);
}

$url = $style->buildUrl($original_image);

Я хотел бы, чтобы это произошло автоматически.

leymannx
источник
0

В некоторой степени, вот что я использовал (благодаря всем предыдущим ответам, чтобы получить меня там), чтобы получить URL файла изображения из поля изображения медиа-объекта в ветке:

{% set media_img_url = file_url(content.field_media_image.0['#item'].entity.uri.value) %}

Теперь я могу использовать эту переменную в моем шаблоне ветки

{{ media_img_url }}
bdanin
источник
0

Чтобы получить атрибут изображения, такой как URI, alt, title и т. Д., Используйте синтаксис, подобный шаблону ниже

В шаблоне веточки узла

{{node.field_name.entity.fileuri}}

В поле веточка шаблона

{{content.field_name.entity.fileuri}}

В другом поле шаблон веточки

{{element['#object'].field_name.entity.fileuri}}

Примечание: Также проверьте twig_tweaks модуль шпаргалки для деталей , связанных с прутой связанным с этим вопрос.

Прем Патель
источник
0

Вы можете использовать url()метод класса File в качестве ярлыка, поэтому:

{{ file_url(node.field_image.entity.fileuri) }}

можно сократить до:

{{ node.field_image.entity.url }}

Это работает в функциях предварительной обработки, но срабатывает Twig_Sandbox_SecurityErrorпри вызове в шаблоне ветки.

Если вы получаете, Twig_Sandbox_SecurityErrorвы можете указать, чтобы twig разрешил urlв файле settings.php, как указано в этом сообщении Stackoverflow

См. Документацию по File :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.x

Kiee
источник
-4

Вы можете сделать это двумя способами!

1) file_create_url (---------) // внутри записи путь узла

2) file_url (-------) // внутри записи путь узла

Drock
источник