Кому-нибудь таки удалось подружить кеширование views c exposed filters и сортировкой?

Аватар пользователя Айдар Айдар 13 июня 2012 в 12:17

Views 2, Drupal 6, табличное представление с раскрытыми фильтрами и сортировкой (аякс: да) с включенным кешированием (0/xx часов/минут).

Десятки ишью на странице модуля, но ни одно не решено - может быть, кому-нибудь удавалось решить данную проблему?

Только не говорите, что все работает "на ура", и я один такой несчастный.

Комментарии

Аватар пользователя Orion76 Orion76 13 июня 2012 в 15:22

Когда-то давно специально проверял... как вьюс кеширует странички с экспозед-фильтрами и сортировкой..
Идентификатор записи кеша в БД строился из строки запроса, т.е. кешировались все варианты фильтров-сортировок для каждой страницы. -)))
Правда сейчас посмотреть настройки того сайта нет возможности (друпал 6, вьюс 2)

ЗЫ..А так... народ обычно интересуется, как отключить кэш у вьюса-)))

Аватар пользователя Айдар Айдар 13 июня 2012 в 15:47

"orion76" wrote:
Идентификатор записи кеша в БД строился из строки запроса, т.е. кешировались все варианты фильтров-сортировок для каждой страницы. -)))

Спасибо! Так и предполагал. Но вот почему может некорректно работать это все, вопрос в этом? Мое ишью висит уже несколько дней без ответа.

"orion76" wrote:
А так... народ обычно интересуется, как отключить кэш у вьюса-)))

Как бы выставить кеширование в настройке вьюс в "нет", не?

Аватар пользователя CSoft CSoft 28 октября 2012 в 0:10

Тоже сейчас столкнулся с этой гадкой проблемой. На сайте активно используется фильтр по каталогу, сделанному во Views. И безумно не хотелось отключать в нём cache...

Сходу смог придумать пока такое решение. Если заглянуть в views_plugin_cache.inc, то можно увидеть там, что при составлении ключей (cid) кеша теряется очень много информации, которая дала бы уникальность каждому выводу вьюсы. То есть, по-хорошему, нам нужно учитывать всё то, что у нас есть в $_GET.

Если посмотреть в вышеуказанном файле функции get_results_key и get_output_key, то туда GET можно засунуть, увы, через попу - только в массиве $GLOBALS['language'] Sad Ибо он единственный, кто в обоих функциях используется, и мы туда можем что-то приписать своё. Да, я понимаю, что это некрасиво всё, массив ведь содержит настройки языка, но что делать? Думаю, лучше пусть так будет, пока разработчики вьюса не решат проблемы с кешем, чем выключить его и терять производительность сайта.

Если вы всё ещё со мной, то объясню реализацию. Например, в своём модуле в хуке hook_views_pre_view прописываем:

if ($view->display_handler->uses_exposed()) {
  $cache = $view->display_handler->get_option('cache');
  if ($cache['type'] == 'time') {
    $GLOBALS['language']->views_key_data = $_GET;
  }
}
else {
  unset($GLOBALS['language']->views_key_data);
}

И таки работает. Погонял - вроде проблем не увидел. Посмотрите тоже, кому интересно. Вдруг найдёте побочные эффекты, но по идее быть не должно.

Всем успехов!

Аватар пользователя WebFamily WebFamily 1 ноября 2012 в 11:38

У меня проблема роста таблиц оказалась из-за модуля Fivestar, его отключил и удалил. Теперь даже не парюсь на счет таблиц, кеш максимум 30 мб.

Аватар пользователя CSoft CSoft 1 ноября 2012 в 14:51

WebFamily, извините меня, конечно, но Вы малость не по теме уже второй пост пишете. Мы хотим ВКЛЮЧИТЬ кеш и чтобы он корректно работал. И это касаемо конкретно модуля Views. К чему Ваши сообщения - совершенно не ясно...

Аватар пользователя beee beee 6 ноября 2012 в 19:10

присоединяюсь к вопросу. Есть вьюха c exposed кол-вом товаров на странице. Если включить кеширование, то фильтр кол-ва товаров не работает. Как заставить их дружить?

Аватар пользователя CSoft CSoft 6 ноября 2012 в 19:12

"beee" wrote:
Как заставить их дружить?

Поднять глаза вверх.

Честное слово вот, извините, конечно. Но для кого я выше написал всё это?

Аватар пользователя Айдар Айдар 6 ноября 2012 в 22:48

Правильно я понял, что весь код модуля будет выглядеть так:

<?php
function mymodule_views_pre_view(){
if (
$view->display_handler->uses_exposed()) {
  
$cache $view->display_handler->get_option('cache');
  if (
$cache['type'] == 'time') {
    
$GLOBALS['language']->views_key_data $_GET;
  }
}
else {
  unset(
$GLOBALS['language']->views_key_data);
}
}
?>

?

И почему бы не запостить ишью на орге? Там и потестят массово, думаю.

Аватар пользователя CSoft CSoft 6 ноября 2012 в 22:58

"Айдар" wrote:
Правильно я понял, что весь код модуля будет выглядеть так

Да, всё верно.

"Айдар" wrote:
И почему бы не запостить ишью на орге? Там и потестят массово, думаю.

Просто решение некрасивое... Я уверен, что они и сами знают, что делать. Вот почему не делают - это другой вопрос. Да и на скорую руку решение. Меня оно пока, в общем-то, устраивает. Работает - это главное.

Аватар пользователя Айдар Айдар 7 ноября 2012 в 2:36

"CSoft" wrote:
Вот почему не делают - это другой вопрос.

А 6 ветку вьюсов не перестали ли уже развивать вовсе?

Поставил код - пару дней на тестирование, отпишусь о результатах.

Спасибо за Ваши старания в любом случае!

Аватар пользователя CSoft CSoft 7 ноября 2012 в 2:38

"Айдар" wrote:
А 6 ветку вьюсов не перестали ли уже развивать вовсе?

Да ну, рано ещё Lol И судя по dev-версиям - порядок.

"Айдар" wrote:
Поставил код - пару дней на тестирование, отпишусь о результатах.

Ага, спасибо и Вам! Ждём.

Аватар пользователя AND_B AND_B 23 ноября 2012 в 0:08

Я столкнулся с похожей проблемой, но решил, что править буду все-таки ядро, а не обертки
Что в get_reuslts_key, что в get_output_key испольузется serialize($key_data), т.е. внутренний формат массива можно менять.
В итоге, не мудрствуя лукаво, просто добавил еще один ключ 'q' => $_GET['q']в массив в get_results_key (аналогично и в get_output_key)

<?php     $key_data = array(
        
'build_info' => $this->view->build_info,
        
'roles' => array_keys($user->roles),
        
'super-user' => $user->uid == 1// special caching for super user.
        
'language' => $GLOBALS['language'],
        
'q' => $_GET['q'],        
      );
?>

С точки зрения высоких идеалов меня может и линчуют за такую правку, с точки зрения оптимизации я вижу, что для синонимов и переадресаций на одно и то же будут разные кеши, но оно работает. И это главное для меня

Аватар пользователя CSoft CSoft 23 ноября 2012 в 0:08

"AND_B" wrote:
Я столкнулся с похожей проблемой, но решил, что править буду все-таки ядро, а не обертки

Я выше привёл это же решение, только при этом сам вьюс хакать не нужно. Ибо когда Вы его обновите - забудете про свою правку и останетесь опять без кеша.

Аватар пользователя Айдар Айдар 21 февраля 2013 в 22:45

"CSoft" wrote:

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

Аватар пользователя FORTIS FORTIS 1 октября 2013 в 1:23

"CSoft" wrote:
Если вы всё ещё со мной, то объясню реализацию. Например, в своём модуле в хуке hook_views_pre_view прописываем:

но лучше написать свой плагин кеширования (extends views_plugin) с более очевидной логикой

Аватар пользователя CSoft CSoft 7 октября 2013 в 20:05

"FORTIS" wrote:
но лучше написать свой плагин кеширования (extends views_plugin) с более очевидной логикой

Полностью поддерживаю Smile Но мне лично уже это не нужно - проект ушёл на семёрку.

Аватар пользователя CSoft CSoft 7 октября 2013 в 20:41

Блин, забыл написать - использую в паре с Search API Smile Там как раз свой плагин кэша сделан Smile