Не работает кэширование представлений (views) с фильтром по дате со смещением

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

Аватар пользователя Alandr Alandr 15 декабря 2014 в 23:59

Столкнулся со странной ситуацией: если в представлении (views) используется фильтр "Дата публикации" (или подобный) со смещением (например, ">= -1 month"), то данное представление не хочет кэшироваться.

Поясню на примере. Создаем простейший views с отображением в блоке.
Поле: "Содержимое: Заголовок"
Кэширование: "По времени | 6 часов/6 часов"
Кэширование блока: "Кэшировать единожды всё (глобально)"
Если этот блок поместить на какую-то страницу, то по статистике запросов Devel видно, что данный блок кэшируется нормально (т.е. он берется из кэша, и не происходит новых запросов к БД).

Но стоит только добавить фильтр публикаций за некоторый промежуток времени (например, "Содержимое: Дата публикации >= -1 month"), то блок перестает кэшироваться! При каждой загрузке блока происходит новое обращение к БД с запросом. Кроме того, в таблице "cache_views_data" постоянно добавляются все новые и новые записи с названием этого views и блока.

Не пойму, это какой-то баг, или так и должно быть? Как добиться кэширования блока, чтобы не происходили постоянные обращения к БД?

Спасибо!

Комментарии

Аватар пользователя Orion76 Orion76 16 декабря 2014 в 14:42

">= -1 month" - -вычисляется в конкретную дату-время.
При кэшировании кэш-ID генерируется в соответствии с параметрами запроса(MD-хэш от сериализированного массива с параметрами).
Он при каждом вызове вьюса получается разный.
Придумайте, как установить фильтр на конкретное время (напримерн на 00ч01мин - 30 дней назад)..
И должно кэшироваться.

Аватар пользователя Alandr Alandr 16 декабря 2014 в 16:34

> Глупо было бы со смещением в кеш делать запросы.

А что глупого в запросе "получить ноды за последний месяц", и в том, чтобы его кэшировать? Мне ведь не нужна точность до секунды (в таком случае, я бы не пользовался кэшем вообще), но, к сожалению, Views не дает установить степень детализации в фильтре (в отличие от сортировки).

> Придумайте, как установить фильтр на конкретное время

Перепробовал варианты отсюда, но получается или какой-то бред, или все равно расчет идет относительно текущего времени. Через контекстные фильтры тоже ничего путного не выходит. Неужели придется применять какой-нибудь Views PHP или вроде того? Очень не хотелось бы.

Может, есть более умные варианты?

Аватар пользователя voviko voviko 16 декабря 2014 в 20:26

Views - Сложный модуль. Над оптимизацией и кешем работало очень много человеков.
Вам написали ранее, что При кэшировании кэш-ID генерируется в соответствии с параметрами запроса(MD-хэш от сериализированного массива с параметрами).

Можно через хак изменить запрос, но лучше сделать выборку самостоятельно, без views + cache_block

Аватар пользователя Orion76 Orion76 16 декабря 2014 в 20:53

Кроме этого, ничего на ум не приходит..
http://precessionmedia.com/blog/how-create-custom-filter-handler-views

Остальное только костыль-на-костыле, для ,вроде бы, простейшего функционала-))

UPD. Кстати модуль Date не стоит?
У него есть субмодуль Date Views.
Может там что полезное есть..

Аватар пользователя Alandr Alandr 16 декабря 2014 в 21:16

> Над оптимизацией и кешем работало очень много человеков.

Так вот именно поэтому меня и смущает, что в случае такого тривиального, очень часто встречающегося запроса, кэш работает не так, как ожидается. Просто не могу в это поверить Smile

> Можно через хак изменить запрос

А может через хук? Хм, надо подумать...

> Кроме этого, ничего на ум не приходит..

Угу, тоже постепенно начинаю склоняться к этой мысли...

> У него есть субмодуль Date Views. Может там что полезное есть..

Модуль стоит, но ничего полезного не вижу. Там именно работа с полями типа "Дата", а не с "Датой публикации".