Хочется дать посетителю возможность выбора режима просмотра нод на сайте - либо с большой картой и маленьким слайдшоу картинок в углу, либо с большой галереей картинок на месте карты и с маленькой статической картой на месте слайдшоу в углу. То есть нода одна, маршрут/путь по идее тоже один, общая раскладка регионов тоже одна, только некоторые блоки должны рендериться (или не рендериться) в зависимости от текущего режима, выбранного посетителем (в т.ч. анонимом). Выбранный посетителем режим должен запоминаться навсегда при навигации по всему сайту, пока посетитель в явном виде не сменит его (ну или пока не зайдет с другого компа/браузера, ессно).
Не буду вас грузить длинным списком вариантов реализации, которые я рассматривал, сразу расскажу на чем остановился (хотя к реализации пока не приступал), а вы мне скажете, почему я не прав, и как надо, ok?
Итак, текущий режим просмотра хочу сохранять в куке, а в условиях видимости затронутых блоков добавить условие по значению этой самой куки. Для реализации последнего есть в восьмерке модуль в разработке (Request data conditions), да можно и в свой модуль нужный Condition plugin ввернуть, там вроде ничего сложного не должно быть.
Что думает общественность? Может есть какое вообще готовое решение, которое мне на глаза не попалось?
Комментарии
Я бы сделал так:
1. Создаём два вью-мода.
2. Создаём блок с переключалкой - форма, которая пишет в сессию выбранный режим.
3. Перекрываем ноду своим контроллером, который показывает ноду в том или ином режиме в зависимости от условий.
Тут, наверное, следует пояснить, что отображение полей самой ноды не меняется вообще никак - они сидят в одном и том же виде и в одном и том же месте страницы независимо от режима. Все блоки, которые отображаются по-разному в разных режимах (карты, фотогалереи), являются вьюшками, увязанными с текущей нодой через контекстный фильтр.
Если это вьюхи, то тут сложнее. Нужно писать плагины видимости для блоков. Либо использовать page_manager, но для него всё равно придётся писать плагин Selection Criteria
Можно попробовать через js, vue.js
Так уже написаны - в упомянутом Request data conditions реализованы условия и по cookie, и по session storage, и по query parameter. Они появляются прям в Block Layout/Configure Block. Имя куки и ее значение вводятся там же в условиях, в код ничего не зашито.
PS Кстати, придется ведь еще с кэшированием бороться - отключить Internal Page Cache и куда-то вкрячить
$build['#cache']['contexts'][] = 'cookies:my-cookie-name'
Вот не факт, что Internal Page Cache придётся отключать.
Сначала так попробую, конечно. Но, судя по нагугленному, придется.
Я про куки раньше только слышал, в руках ни разу не держал
Еще как придется. Во всей красе узнаете, что такое "костылить кэш" под 8ку. В чате постоянно вижу подобное негодование
Уже попробовал "на коленке" - действительно при включенном IPC анониму всегда отдается единожды закэшированная страница независимо от куки. Но при выключенном IPC даже кэш-контекст не пришлось в явном виде настраивать - страницы отдаются чотко разные с кукою и без. Возможно модуль Request data conditions что-то сам колдует с кэшем - я не вникал пока.
PS Да, модулёк сам грамотно проставляет правильный кэш-контекст, ничего дополнительного делать не нужно.