Как достать URI картинки в twig-шаблоне поля?

Главные вкладки

Аватар пользователя marassa marassa 20 июня 2019 в 11:08

Задача: сделать так, чтобы при отображении галереи картинок (Views Photo Grid) при общем количестве картинок в галерее меньше определенного порога брался другой Image Style, покрупнее.
Задумал сделать это всё в кастомном шаблоне поля.
Создал шаблон views-view-field--photo_slideshow--photo_gallery--field_picture.html.twig
Он совершенно точно подхватывается и отрабатывает.
В шаблоне пытаюсь сделать следующее (подглядел где-то):

{% set imagestyle = {
  '#theme':      'image_style',
  '#style_name': <нужный style в зависимости от view.total_rows >,
  '#uri':        <URI текущей картинки>,
} %}

{{ imagestyle }}

Всё работает как часы (на тестовом вручную вбитом URI) кроме определения URI текущей картинки. Прочёл всю документацию и StackExchange от корки до корки два раза, перепробовал все мыслимые сочетания букв и цыфр из гугла - не выходит каменный цветок. Кто сталкивался - как вытащить URI картинки?

Лучший ответ

Комментарии

Аватар пользователя marassa marassa 20 июня 2019 в 13:14

Осознал две вещи:
1. В качестве филд форматтера у меня используется не просто Image, а PhotoSwipe - возможно он тупо не предоставляет доступа к тем атрибутам картинки, которые мне нужны?
2. На выходе мне тоже нужен PhotoSwipe, а не простая картинка, как в примере выше.
Теперь думаю, что самым простым (хотя возможно и не самым красивым) решением будет тупо подменить название стиля в уже отрендеренном HTML посредством str_replace().

Аватар пользователя marassa marassa 20 июня 2019 в 13:48

Ага, спасибо, но пока решил не плодить модули, а пойти более простым путём:
Эта простая строчка
{{ output|replace({ '/styles/gallery_thumbnail/' : '/styles/large/' }) }}
творит чудеса, но почему-то результат replace пишется в страницу в двойных кавычках и соответственно не воспринимается как HTML-код Wink И даже trim животворящий не помогает.

Аватар пользователя marassa marassa 25 июня 2019 в 15:06

В общем, чтобы закрыть тему - с кавычками помог разобраться фильтр |raw, но тут выяснилось, что тупо подменить название стиля в пути к картинке недостаточно: если картинка в данном стиле еще не сгенерирована, то она и не будет сгенерирована без правильного itok. А вычислять itok с учетом private key сервера прямо в twig'е - это уже слишком экстремально даже для меня Wink
Решил пойти другим путем, но тоже ушел не слишком далеко - продолжение квеста в отдельном топике...

Аватар пользователя marassa marassa 25 июня 2019 в 17:13

Отключение itok грозятся убрать в одном из будущих релизов восьмерки (или уже девятки): https://www.drupal.org/project/drupal/issues/2568517
На крайний случай так и сделаю, но хочется еще немного поискать более изящное решение.

Аватар пользователя Orion76 Orion76 25 июня 2019 в 17:43

Более изящное решение - подготовить необходимые данные в препроцесс-хуке, а в шаблоне их только "вывести".
Потому что шаблон должен использоваться только для "генерации" html-кода, а препроцесс-хук для обработки некоторой логики и подготовке данных.
Тем более, что обрабатывать логику на PHP намного проще и удобнее чем на TWIG-)

https://www.drupal.org/docs/8/theming/twig/twig-best-practices-preproces...

Аватар пользователя marassa marassa 25 июня 2019 в 18:32

Проблема в том, что в препроцесс-хуке темы для отдельно взятого поля я не умею добыть views->total_rows, а в пререндер-хуке для view я почему-то не могу найти рендер-массивы этих самых отдельно взятых полей: https://drupal.ru/node/139800

Аватар пользователя Orion76 Orion76 25 июня 2019 в 21:54
1

Как я понял, суть задачи: в зависимости от количества элементов в выборке вьюса необходимо для определенного форматтера поля-картинки установить нужный "стиль" картинки?

Тогда более изящным решением будет вклиниться где-то после получения вьюсом данных из БД и перед рендерингом вьюса и установить в настройках данного поля картинки нужный "стиль" картинки.

кстати, в документации к hook_views_pre_render в первом комменте как раз решается подобная задача(изменение стиля картинки): https://api.drupal.org/api/drupal/core!modules!views!views.api.php/funct...

Аватар пользователя marassa marassa 26 июня 2019 в 15:31

Только сейчас осознал, что в результате получилось в точности как в том примере из документации. Почему сразу не получилось - загадко...

Аватар пользователя marassa marassa 25 июня 2019 в 22:05

Суть задачи понята правильно. По умолчанию выводится стенка из довольно маленьких миниатюр. Но если картинок немного, то чтобы не выводилась горстка миниатюр, сиротливо сбившихся в углу отведенного для них места, можно взять миниатюры побольше размером. А если картинка всего одна, то можно и оригинальный размер вывести.

более изящным решением будет вклиниться где-то после получения вьюсом данных из БД и перед рендерингом вьюса и установить в настройках данного поля картинки нужный "стиль" картинки

Спасибо, кэп - именно это я и пытаюсь сделать на протяжении последней недели Wink

в документации к hook_views_pre_render в первом комменте как раз решается подобная задача(изменение стиля картинки)

Это практически моя настольная страница! Wink
Проблема лишь в том, что в примере стиль поля типа Image установлен прямо в настройках поля views, где его действительно легко поменять один раз и навсегда, а вот форматтер PhotoSwipe в процессе своей работы прописывает этот стиль индивидуально для КАЖДОГО экземпляра картинки, выводимого вьюхой. Вот до этих самых экземпляров, точнее до их рендер-массивов, у меня и не получается достучаться из контекста hook_views_pre_render.

Аватар пользователя Orion76 Orion76 26 июня 2019 в 2:08

hook_preprocess_views_view_fields($variables)
подготаваливает данные для вывода "строки" вьюса.
в $variables есть и views , у него можно спросить total и поля строки в которых можно поправить настройки вывода