Как найти URL-адрес стиля изображения из шаблона веточки?


10

Я реализую шаблон узла, который использует изображение дважды; один раз «нормальным» способом (т. е. используя стиль изображения, определенный в конфигурации отображения поля для этого режима просмотра), а другой - как свойство css background-image.

Мне нужна одна из двух вещей:

  1. (в идеале) способ получить URL для другого стиля изображения того же изображения.

  2. способ получить URL для поля изображения.

Я изо всех сил пытаюсь использовать dump()и kint()помочь себе ответить. Они оба выводят слишком много (благодаря встроенным ссылкам на «родитель» и т. Д.) И, похоже, не имеют нужной мне информации. например, глядя на dump(content.field_image)вывод, фактического URL изображения там нет (так откуда он взялся, чтобы его можно было визуализировать с помощью {{ content.field_image }}?!). kint()с другой стороны, полностью умирает, если я передам ему аргумент, и версия верхнего уровня снова слишком велика для навигации. Отладка была намного проще с phptemplate + xdebug. (Да, я знаю, что хорошо, что те не могут удалить базу данных.)

Есть ответ на (1), который подразумевает, что вы не можете сделать это , но я не понимаю, почему я не могу получить существующий URL в (2)?

Ответы:


11

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

Примерно так: «myimagefield» - это имя машины для вашего поля изображения, а «myimagestyle» - имя машины для вашего стиля, также убедитесь, что вы включили Entity \ ImageStyle.

use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_preprocess_page().
*/
function mytheme_preprocess_page(&$variables, $hook) {
  if ($variables['node']) {
    $node = $variables['node'];
    if($node->myimagefield[0]){
        $cover_image = $node->myimagefield[0]->entity->getFileUri();
        $image_url = ImageStyle::load('myimagestyle')->buildUrl($cover_image);
        $variables['my_image'] = $image_url;
    }
  }
}

1
вопрос говорит, чтобы вытащить режим просмотра из конфигурации дисплея поля. Делая $ image_url = ImageStyle :: load ('myimagestyle') -> buildUrl ($ cover_image); как вы вытягиваете стиль изображения из конфигурации поля? Вы просто добавили myimagestyle, но что, если одно и то же поле находится на нескольких объектах (например, на узлах), где оно требует разных стилей изображения?
usernameabc

14

На первую часть уже дан ответ в связанном вопросе, где есть код, как это сделать. Чтобы ответить на вторую часть вопроса, вы можете получить доступ к исходному изображению в объекте узла:

{{ file_url(node.field_image.entity.uri.value) }}

Одно замечание по поводу content:

В шаблоне узла поле изображения в contentне готово для визуализации. Поле содержит конфигурацию, как она должна отображаться, и объект поля, который содержит все необработанные данные. Позже это будет объединено в поле, форматирование изображения и шаблоны изображений. По этой причине вы не можете найти URL, который ищете в contentданный момент.

В шаблоне узла вы можете использовать поля на верхнем уровне массива контента, например, отображать поле изображения

{{ content.field_image }}

как настроено в режиме просмотра.

Редактировать:

В модуле Twig Tweak появился новый фильтр . Теперь вы можете сгенерировать URL-адрес стиля изображения в ветке непосредственно из URI или URL-адреса исходного изображения:

{{ node.field_image.entity.uri.value | image_style('thumbnail') }} 

Спасибо. Таким образом, все ловушки препроцессора вызываются при рендеринге вызовов веток, например, в той точке, куда вы идете, {{ content.field_image }}а не раньше? Кроме того, я думаю, что URL-адрес, который я получу из вашего предложения, является исходным URL-адресом. Во второй части моего Q запрашивался URL-адрес стиля изображения, который настраивается в режиме просмотра. Это возможно?
artfulrobot

Это работает только для обычных загруженных изображений, а не для изображений, на которые ссылаются объекты. Как это можно сделать для работы с изображениями, на которые ссылаются объекты?
paulcap1

@ paulcap1, не знаю точно, что вы имеете в виду, потому что поле изображения является справочным полем (для файловой сущности). Если вы имеете в виду, что у вас есть изображение внутри ссылочной сущности, то вам нужно .entityдважды, сначала добраться до сущности, а затем - до картинки.
4k4

1
@ paulcap1, например{{ node.field_ref.entity.field_image.entity.uri.value }}
4k4

@ 4k4. Я использую тип содержимого страницы по умолчанию. У меня есть поле, на которое ссылается объект, с именем field_global_image. Это использует пакет изображений. Поле изображения Bundles называется "" image ". Я попробовал его по-своему, используя {{node.field_global_image.entity.image.entity.uri.value}}. Я также попытался переключить такие поля как {{node.image.entity.field_global_image .entity.uri.value}} Не сработало. В моем Ответе в отдельном посте это то, что сработало для меня.
paulcap1

6

Установите модуль настройки Twig https://www.drupal.org/project/twig_tweak

И этот модуль Twig Field https://www.drupal.org/project/twig_field_value

Если вы используете обычные поля загрузки изображений, используйте это в шаблоне вашего узла:

<img src="{{ node.field_regular_image.entity.uri.value | image_style('thumbnail') }} " >

Если вы используете эталонное изображение объекта, используйте это:

<img src="{{ file_url(content.field_global_image|field_target_entity.image.entity.uri.value | image_style('thumbnail'))}} " >

Обратите внимание, что в примере об использовании ссылочных объектов imageпосле field_target_entityссылается на поле изображения на ссылочной сущности. Возможно, вам придется настроить его.
Даниэльс

1
Спасибо! Пример ссылки на сущность также может быть выполнен без модуля twig_field_value:file_url(node.field_image.entity.field_referenced_image.entity.uri.value | image_style('thumbnail'))
Джон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.