Получить URL-адрес изображения


Я хочу отобразить изображение в качестве фонового изображения с помощью встроенного стиля в twig. Я создал поле под названием bg_image и прикрепил его к стандартной простой странице.

После нескольких часов возни я смог получить URL-адрес изображения в node.html.twig

{{ file_url(node.field_bg_image.0.entity.uri.value) }}

Но я не смог заставить его работать внутри поля--field-bg_image.html.twig

Могу ли я все равно получить узел оттуда, чтобы затем получить изображение?

Как я могу получить URL-адрес изображения для использования в качестве встроенный стиль? Я подумал, может быть, я смогу передать переменную из field--field-bg_image.html.twig в image.html.twig, а затем просто отобразить

{{ uri }}

Вместо

<img{{ attributes.addClass(classes) }} />

Но я не мог заставить его передать переменную туда, если я не использую includes

{% include 'image.html.twig' with {'image': image, 'isFromField': isFromField} %}

(Значение isfromfield является истинным, когда оно исходит из поля --field-bg_image.html.twig) Но и это не сработало. Изображение никогда не отображалось таким образом.

Был бы очень рад, если вы сможете помочь - мои знания php очень основной. Спасибо

 24
Author: kiamlaluno, 2015-12-27

6 answers

Переменная node предварительно загружается только в шаблон узла (и шаблон страницы, если URL содержит узел). Теперь, если вы хотите получить доступ к полям узла в шаблоне поля, вам нужно искать в другом месте:

поле.html.ветка:

{{ file_url(element['#object'].field_image.0.entity.uri.value) }}

element['#object'] является родительской сущностью в шаблоне поля, и вы можете получить доступ к любому полю из этой сущности (в вашем случае к узлу).

Если вы хотите получить доступ к необработанным значениям из фактического поля, лучше следовать логике ветки поля и получить доступ к значению внутри цикла элементов непосредственно из объекта элемента поля #item:

{% for item in items %}
  {{ file_url(item.content['#item'].entity.uri.value) }}
{% endfor %}

Редактировать: Получить URL-адрес стиля изображения

Установите модуль Twig Tweak, и вы можете использовать uri для получения URL-адреса стиля изображения:

{% for item in items %}
  {{ item.content['#item'].entity.uri.value | image_style('thumbnail') }}
{% endfor %}
 35
Author: 4k4, 2017-03-09 13:12:00

Просто упомяну, что если вы хотите сделать то же самое в одном из новых пользовательских блоков, это работает:

{{ file_url(content.field_image['#items'].entity.uri.value) }}
 28
Author: Jonasdk, 2016-02-19 13:46:03

Я использую этот код в своем файле .theme:

function THEMENAME_preprocess_node(&$variables) {

  if ($variables['node']->field_image->entity) {
      $variables['image_url'] = $url = entity_load('image_style', 'medium')->buildUrl($variables['node']->field_image->entity->getFileUri());
  }
}

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

Затем в моем файле node-page.html.twig у меня есть это:

{% if image_url is not empty %}
    <div class="featured-thumb">
        <img src="{{ image_url }}"/>
    </div>
{% endif %}

<div>{{ content.body|without('field_image') }}</div>

Опять же, это можно было бы улучшить. спасибо

 3
Author: bennash, 2016-07-26 13:58:03

Я бы сделал это по-другому. В функции предварительной обработки вашего узла:

use Drupal\image\Entity\ImageStyle; // Don't forget this use.

function THEMENAME_preprocess_node__NODETYPE(&$variables){
    $node = $variables['node'];

    if(isset($node->get('field_image')->entity)){
        $image_style = 'large'; // Or whatever your image style's machine name is.
        $style = ImageStyle::load($style);
        $variables['image'] = $style->buildUrl($node->get('field_image')->entity->getFileUri()); // Generates file url.
    }
}

Затем в вашем шаблоне (node--NODETYPE.html.twig) просто отобразите изображение таким образом:

{% if image %}
    <img src="{{ image }}" />
{% endif %}

Хотя, если вам когда-нибудь придется отрисовывать большое количество изображений, я бы посоветовал вам загрузить стили в массив перед циклом на каждом изображении. Я говорю это, потому что у меня возникли серьезные проблемы со временем загрузки, потому что мне пришлось загрузить более 300 изображений, и для каждого изображения я загружал стиль по отдельности о загрузке их всех раньше, вот пример, та же база, что и выше:

use Drupal\image\Entity\ImageStyle; // Don't forget this use.

function THEMENAME_preprocess_node__NODETYPE(&$variables){
    $node = $variables['node'];

    if(isset(node->get('field_images')[0]->entity)){ // Notice how, this time, I check if the FIRST image is set (if it's true, then u'll allow the loop for at least 1 element)
        $images_styles = [
            'large' => ImageStyle::load('large'),
            'thumbnail' => ImageStyle::load('thumbnail')
        ];
        $count = 0;

        foreach($node->get('field_images') as $image){
            $variables['images'][$count]['large'] = $images_styles['large']->buildUrl($image->getFileUri());
            $variables['images'][$count]['thumbnail'] = $images_styles['thumbnail']->buildUrl($image->getFileUri());
            $count++;
        }
    }
}

Затем снова, в вашем шаблоне (node--NODETYPE.html.twig), просто отобразите изображения таким образом:

{% if images %}
    <ul>
        {% for image in images %}
            <li>
                <img src="{{ image.large }}" /> // Large image url.
                <img src="{{ image.thumbnail }}" /> // Thumbnail image url.
            </li>   
        {% endfor %}
    </ul>
{% endif %}

Я на самом деле не тестировал это, и я выкидываю все это из головы, поэтому в нем могут содержаться ошибки, не стесняйтесь предупреждать меня, чтобы я исправил это:-).

 1
Author: ZyDucksLover, 2018-05-14 08:50:58

Потратив два дня, я нашел ответ на свой аналогичный код. С включением и исключением некоторых полей.

{%
set classes = [
'block',
'block-' ~ configuration.provider|clean_class,
'block-' ~ plugin_id|clean_class,
'cover-image',
]
%}

{% set background_image = file_url(content.field_banner_image['#items'].entity.uri.value) %}

<div{{ attributes.addClass(classes) }} style="background-image: 
url({{background_image}})">

<div class="block-inner">
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
{% block content %}
{{ content.field_media_image }}
<div class="summary">
{{ content|without('field_banner_image') }}
</div>
{% endblock %}
</div>
</div>

Прекрасное имя в блоке темы --bundle--banner-block.html.twig Этот код предназначен для пользовательского блока с изображениями.

Еще один пример для простого файла. не перебираю весь код целиком, а только самое необходимое.

<a href="{{file_url(node.field_attachment1.entity.uri.value)  }}" ><h3> 
{{content.field_short_information}} </h3></a>

Эти фрагменты кода для узла node--all_notice.html.twig. Все, что в настоящее время работает в drupal 8.8.3

 0
Author: Pradeep, 2020-03-19 10:15:00

Я добился некоторого успеха, используя модуль фонового изображения , когда это позволяет вариант использования. Я использую один из этих вариантов кода, когда мне нужна настроенная структура DOM.

 -1
Author: Matt, 2018-10-09 17:16:45