Разные режимы просмотра одной и той же ноды - как лучше реализовать

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

Аватар пользователя marassa marassa 27 ноября 2018 в 10:42

Хочется дать посетителю возможность выбора режима просмотра нод на сайте - либо с большой картой и маленьким слайдшоу картинок в углу, либо с большой галереей картинок на месте карты и с маленькой статической картой на месте слайдшоу в углу. То есть нода одна, маршрут/путь по идее тоже один, общая раскладка регионов тоже одна, только некоторые блоки должны рендериться (или не рендериться) в зависимости от текущего режима, выбранного посетителем (в т.ч. анонимом). Выбранный посетителем режим должен запоминаться навсегда при навигации по всему сайту, пока посетитель в явном виде не сменит его (ну или пока не зайдет с другого компа/браузера, ессно).
Не буду вас грузить длинным списком вариантов реализации, которые я рассматривал, сразу расскажу на чем остановился (хотя к реализации пока не приступал), а вы мне скажете, почему я не прав, и как надо, ok? Wink
Итак, текущий режим просмотра хочу сохранять в куке, а в условиях видимости затронутых блоков добавить условие по значению этой самой куки. Для реализации последнего есть в восьмерке модуль в разработке (Request data conditions), да можно и в свой модуль нужный Condition plugin ввернуть, там вроде ничего сложного не должно быть.
Что думает общественность? Может есть какое вообще готовое решение, которое мне на глаза не попалось?

Комментарии

Аватар пользователя gun_dose gun_dose 27 ноября 2018 в 11:09

Я бы сделал так:
1. Создаём два вью-мода.
2. Создаём блок с переключалкой - форма, которая пишет в сессию выбранный режим.
3. Перекрываем ноду своим контроллером, который показывает ноду в том или ином режиме в зависимости от условий.

Аватар пользователя marassa marassa 27 ноября 2018 в 11:39

gun_dose wrote:

Создаём два вью-мода.

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

Аватар пользователя gun_dose gun_dose 27 ноября 2018 в 13:29

Если это вьюхи, то тут сложнее. Нужно писать плагины видимости для блоков. Либо использовать page_manager, но для него всё равно придётся писать плагин Selection Criteria

Аватар пользователя marassa marassa 27 ноября 2018 в 13:56

gun_dose wrote:

Нужно писать плагины видимости для блоков

Так уже написаны - в упомянутом Request data conditions реализованы условия и по cookie, и по session storage, и по query parameter. Они появляются прям в Block Layout/Configure Block. Имя куки и ее значение вводятся там же в условиях, в код ничего не зашито.
PS Кстати, придется ведь еще с кэшированием бороться - отключить Internal Page Cache и куда-то вкрячить $build['#cache']['contexts'][] = 'cookies:my-cookie-name'

Аватар пользователя marassa marassa 27 ноября 2018 в 14:43

gun_dose wrote:

Вот не факт, что Internal Page Cache придётся отключать.

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

Аватар пользователя adano adano 27 ноября 2018 в 16:43

Еще как придется. Во всей красе узнаете, что такое "костылить кэш" под 8ку. В чате постоянно вижу подобное негодование Smile

Аватар пользователя marassa marassa 27 ноября 2018 в 17:01

adano wrote:

Еще как придется.


Уже попробовал "на коленке" - действительно при включенном IPC анониму всегда отдается единожды закэшированная страница независимо от куки. Но при выключенном IPC даже кэш-контекст не пришлось в явном виде настраивать - страницы отдаются чотко разные с кукою и без. Возможно модуль Request data conditions что-то сам колдует с кэшем - я не вникал пока.

Аватар пользователя marassa marassa 27 ноября 2018 в 19:31

marassa wrote:

Возможно модуль Request data conditions что-то сам колдует с кэшем - я не вникал пока.

PS Да, модулёк сам грамотно проставляет правильный кэш-контекст, ничего дополнительного делать не нужно.