Отримання 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-замовчуванням та деякими основними даними зображення. Як показати зображення або створити посилання на зображення всередині шаблону 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

Errr ... Я б припустив, що це потрібно зробити в гачку попередньої обробки, якщо тільки немає функції помічника Twig для перетворення FieldItemLists в рядкове представлення (яке я не можу знайти)
Clive

Ой, бачу, url()хоче маршрут. Як щодо url_from_path(node.field_image.0.entity.uri.value)?
Клайв

Хм, url_from_path()здається, генерує це: http://mywebsite.local/public%3A//image.pngтому, схоже, він кодує urlencoding та додає точне значення до URL
Ріас

Відповіді:


49

Ось оновлена ​​версія цієї відповіді після 8.0.x. Ця база на коментарі @joelpittet .

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

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())

Я не знаю, чи можливо це в гілочці. Якщо це неможливо, ви завжди можете обчислити його в попередній обробці та додати як нову змінну.


2
Ми намагаємося додати file_create_url () до основної, але відсутність інтересу зробила проблему несвіжою. drupal.org/node/2168231 Хоча якщо це потрапило, воно повинно бути {{file_url (node.field_image.entity.fileuri)}}
joelpittet

26

Якщо комусь знадобилося стильне зображення:

$styled_image_url = ImageStyle::load('large')->buildUrl($node->field_image->entity->getFileUri());

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+


Я думаю, що погано, що такі речі через деякий час застарівають. Оновлення 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) }}" />

що робити, якщо не вставлено зображення, і ми встановили значення за замовчуванням.
amol


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 і додав її з купою інших корисних речей до мого модуля стартера:

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

Функція приймає поле зображення та назву машини стилю зображення, а потім повертає цей шлях зображення.

Вона працює в багатьох ситуаціях - ви можете передати node.field_name, content.field_nameабо row._entity.field_name(в разі полів зору шаблону).


0

Боже, це фактично зайняло мої віки, щоб з'ясувати, чому мої URL-адреси в результаті не працюють. Всі 404'ed. Спочатку потрібно створити похідне, якщо воно ще не існує .

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

Замініть 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);

Хочеться, щоб це сталося автоматично.


0

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

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

тепер я можу використовувати цю змінну у своєму шаблоні гілочок

{{ media_img_url }}

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

Це працює у функціях попередньої обробки, але запускає a, Twig_Sandbox_SecurityErrorколи викликається у гілочному шаблоні.

Якщо ви отримаєте, Twig_Sandbox_SecurityErrorви можете сказати гілочку, щоб дозволити urlу вашому файлі settings.php, як згадується в цій публікації Stackoverflow

Дивіться документацію щодо Файл :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.x


-4

Зробити це можна двома способами!

1) file_create_url (---------) // всередині записуємо шлях вузла

2) file_url (-------) // всередині записуємо шлях вузла

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.