Столкнулся со странной ситуацией: если в представлении (views) используется фильтр "Дата публикации" (или подобный) со смещением (например, ">= -1 month"), то данное представление не хочет кэшироваться.
Поясню на примере. Создаем простейший views с отображением в блоке.
Поле: "Содержимое: Заголовок"
Кэширование: "По времени | 6 часов/6 часов"
Кэширование блока: "Кэшировать единожды всё (глобально)"
Если этот блок поместить на какую-то страницу, то по статистике запросов Devel видно, что данный блок кэшируется нормально (т.е. он берется из кэша, и не происходит новых запросов к БД).
Но стоит только добавить фильтр публикаций за некоторый промежуток времени (например, "Содержимое: Дата публикации >= -1 month"), то блок перестает кэшироваться! При каждой загрузке блока происходит новое обращение к БД с запросом. Кроме того, в таблице "cache_views_data" постоянно добавляются все новые и новые записи с названием этого views и блока.
Не пойму, это какой-то баг, или так и должно быть? Как добиться кэширования блока, чтобы не происходили постоянные обращения к БД?
Спасибо!
Комментарии
Глупо было бы со смещением в кеш делать запросы.
">= -1 month" - -вычисляется в конкретную дату-время.
При кэшировании кэш-ID генерируется в соответствии с параметрами запроса(MD-хэш от сериализированного массива с параметрами).
Он при каждом вызове вьюса получается разный.
Придумайте, как установить фильтр на конкретное время (напримерн на 00ч01мин - 30 дней назад)..
И должно кэшироваться.
> Глупо было бы со смещением в кеш делать запросы.
А что глупого в запросе "получить ноды за последний месяц", и в том, чтобы его кэшировать? Мне ведь не нужна точность до секунды (в таком случае, я бы не пользовался кэшем вообще), но, к сожалению, Views не дает установить степень детализации в фильтре (в отличие от сортировки).
> Придумайте, как установить фильтр на конкретное время
Перепробовал варианты отсюда, но получается или какой-то бред, или все равно расчет идет относительно текущего времени. Через контекстные фильтры тоже ничего путного не выходит. Неужели придется применять какой-нибудь Views PHP или вроде того? Очень не хотелось бы.
Может, есть более умные варианты?
Views - Сложный модуль. Над оптимизацией и кешем работало очень много человеков.
Вам написали ранее, что При кэшировании кэш-ID генерируется в соответствии с параметрами запроса(MD-хэш от сериализированного массива с параметрами).
Можно через хак изменить запрос, но лучше сделать выборку самостоятельно, без views + cache_block
Кроме этого, ничего на ум не приходит..
http://precessionmedia.com/blog/how-create-custom-filter-handler-views
Остальное только костыль-на-костыле, для ,вроде бы, простейшего функционала-))
UPD. Кстати модуль Date не стоит?
У него есть субмодуль Date Views.
Может там что полезное есть..
> Над оптимизацией и кешем работало очень много человеков.
Так вот именно поэтому меня и смущает, что в случае такого тривиального, очень часто встречающегося запроса, кэш работает не так, как ожидается. Просто не могу в это поверить
> Можно через хак изменить запрос
А может через хук? Хм, надо подумать...
> Кроме этого, ничего на ум не приходит..
Угу, тоже постепенно начинаю склоняться к этой мысли...
> У него есть субмодуль Date Views. Может там что полезное есть..
Модуль стоит, но ничего полезного не вижу. Там именно работа с полями типа "Дата", а не с "Датой публикации".