Вы здесь

Как организовать несколько отдельных галерей colorbox на одной странице?

0

На одной странице теоретически могут присутствовать несколько разных блоков view, показывающих разные подмножества нод одного типа pictures, которые во всех случаях выводятся как Content | Teaser. Эти ноды содержат поле типа Image, сформатированное как Colorbox, то есть при клике на маленькую картинку она открывается на весь экран и по идее должна быть возможность гулять стрелками по всем картинкам того блока/view, из которого была открыта картинка.
В настройках форматтера Colorbox в pictures->manage display (напомню, что все view используют не поля, а один и тот же Content | Teaser, так что я не могу индивидуально что-то настраивать в каждом view) можно выбрать следующие значения:
Per post gallery - тогда каждая картинка сама себе галерея из одной картинки, так как colorbox подвязывается к $entity->id(), а он естественно у каждой ноды свой.
Per page gallery - тогда все картинки из всех вьюшек на странице сваливаются в одну большую галерею, что не здорово.
Custom (with tokens) - казалось бы, самый многообещающий вариант, но еще раз напомню, что настраивается это всё не в каждой вьюшке отдельно, а один раз для content-type pictures, то есть я не могу туда вбить разные gallery-id для разных вьюшек, а во всем богатстве предлагаемых токенов я не наблюдаю ни одного, который вернул бы идентификатор текущего блока или вью. А в идеале мне надо привязать data-colorbox-gallery как раз к идентификатору блока, в котором находится картинка, тогда всё, что внутри блока, будет одной галереей, а разные блоки будут разными галереями.
Тогда я решил написать хук MYMODULE_preprocess_colorbox_formatter(&$variables), который "перебил" бы хук template_preprocess_colorbox_formatter(&$variables) и присвоил бы правильные атрибуты data-colorbox-gallery, привязанные к текущему блоку. Только выяснилось, что и в этом хуке я не умею определить "текущий блок" - не вижу откуда взять эту информацию... Научите, а?

Версия Drupal: 
8.x
Вопрос задан 03.08.2017 - 09:44

Как вариант:
1. уберите класс colorbox с помощью preprocess функции ($variables['attributes']['class'])
2. Добавьте туда свой класс для запуска colorbox
3. Подключите файл скрипта(можно скопировать содержимое файла http://cgit.drupalcode.org/colorbox/tree/js/colorbox.js).
4. Проверяйте блоки и запускайте отдельные галереи.. (если не ошибаюсь галерея определяется в data('colorbox-gallery') (просто задаете элементам data('colorbox-gallery', 'my-gallery-ud').

Лучше решение не придумывается пока что...

Комментарий оставлен 08.08.2017 - 17:19

Геворг, спасибо. Как это сделать через js - очевидно, там я легко могу навигировать по структуре DOM, видеть в каком блоке что находится и соответственно программно менять атрибут data-colorbox-gallery.
Мне интересно как то же самое сделать на PHP в процессе генерации HTML - то есть как при рендеринге маленького фрагмента страницы понять где именно этот фрагмент находится в более широкой картине мира.

Комментарий оставлен 09.08.2017 - 08:14

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

Комментарий оставлен 09.08.2017 - 09:42

Ответы