Эта тема уже поднималась на форуме раза три. Но я так и не нашёл готового решения.
Есть блок, в блоке сниппет который вытягивает из таблицы базы случайную запись и печатает её. Нужно, чтобы при перезагрузке страницы запрос к БД выполнялся заново и заново вытягивалась информация. Естественно, при включенном кэшировании ничего на странице не обновляется, а остаётся неизменным. Вижу два выхода из этой ситуации:
1. Каким-то образом отключить кэширование блока.
2. Создать блок не стандартным методом, а при помощи какого-то специального модуля, в котором кэширование отключено.
Может кто-то подсказать что-то конкретное? Может кто-то реализовывал такое?
Комментарии
никак не получится, т.к. друпал кэширует страницу целиком, а не собирает кэш по кусочкам
модуль Block cache посмотрите
georotor, что даже никаким хаком это сделать невозможно? Но ведь это непраильно. Есть материалы, которые должны обновлятся, как мне это реализовать?
deska, модуль Block cache работает для зарегистированных юзеров, а не для всех.
Интересно, а если я через VIEW создам блок и в VIEW укажу, чтобы выводился случайный нод, то кэширование тоже будет срабатывать? Или в этом случае всё будет ОК?
как вариант подгружать содержимое блока через Java скрипт, я еще как то делал свой кэш, когда каждый блок кэшируется отдельно + контент кэшируется отдельно, а в при обращении к странице страница собирается по кусочкам.
Да, это вариант (через Java-скрипт) и его реализовать очень легко. Но мне уже просто интересно, неужели нельзя иначе? Просто через Java-скрипт - это обходной путь, а прямого нет?
что даже никаким хаком это сделать невозможно?
Можно, отключите кэш:)
Как это сделано у меня: кэш включен в нормальном режиме, но тогда корзина кэшируется, сами понимаете это не есть гуд, по этому я поставил на таблицу с кэшем триггер, который не дает за кэшировать страницу с корзиной, а блок корзины я сделал на Яве, собственно это не совсем правильно, т.к. бывают пользователи с отключенной явой, но я решил что мне проще ими пожертвовать.
Если посмотрите таблицу cache_page, то увидите что страница кэшируется целиком. Решить Вашу проблему можно, но только от стандартного кэша придется отказаться.
Короче говоря, я попробовал такой вариант: создал view для блока и указал в сортировке вывод случайного нода. Всё работает как для залогиненых юзеров, так и для анонимов.
Только вот у меня возникли некоторые опасения на счёт кэширования. При рандомном выведении нода будет ли страница кэшироватся или нет? Я думаю, что будет, так как для view есть отдельная таблица для кэша - cache_views . И логично было бы предполагать, что именно в эту таблицу добавляется запись о кэшировании view. В моём же случае, как я понимаю, запись добавлена не будет и мой view будет выполнятся каждый раз.
Есть кто-то, кто хорошо разбирается в кэшировании drupal? Подскажите, насколько верны мои выводы? Как проверить кэшируется конкретная страница или нет?
Никто ничего не может сказать по этому поводу?
неужели в друпале такой тупой кеш что кеширует не как положено - блоки отдельно, страницы отдельно, комменты отдельно - а все целиком???!!!!!!!
я был лучшего мнения о умственных способностях его создателей, хотя помню что в 4.5 друпале даже не было возможности определить произвольную зону для блоков, а только лево-право - то да...
хотя все таки друпал создавал не один человек и это наверно его оправдывает
Я вот не пойму как и что кэширует Друпал. Таблица для кэша не одна, так что мне кажется, что есть какое-то разделение. Вот только по поводу моего решения через view никто ничего не отвечает.
какое-то разделение наметилось только в 5-м друпале и то... ну например - зачем кешировать меню когда надо кешировать блоки которые происходят из этого меню, зачем кешировать целиком контент когда надо кешировать отдельно страничку - отдельно комментарии - с кешем у друпала очень все плохо, в отличие от views - есть у views отдельный кеш, есть и инструменты для управления им и в случае надобности можно довольно неплохо при выводе в теме нужного вида продумать его кеширование, если-б еще и views было такое-же как остальной кеш - то оно наверно совсем туго работало-бы.
насчет вашего вопроса - у меня например в блоке на одном сайте сделан рандомный запрос к базе - запрос без views а так сам по себе - так вот вроде обновляется и для анонимных иногда - блок справа в левой колонке
У Вас наверное выставлено короткое время жизни кэша, поэтому и для анонимных иногда обновляется. У меня блок со снипетом закэшировался и не обновляется вовсе. Хотя, если у views свой кэш, то я сделаю через views. Спасибо за помощь!
не - я установил по умолчанию когда время обновления не лимитировано - я так понимаю что когда какое-то время установлено - то он сбросится по истечении этого времени гарантированно, а когда не установлено - то есть наверно вероятность что проживет больше.
Блин, как я ошибался, когда думал, что моя проблема решается через views. Просто тестировал на домашнем компе, а там кэширование было выключено. Короче говоря, сделал через JavaScript + PHP за 15 минут. Но я считаю, что это не правильно. Такая задача должна решатся стандартным Друпаловским функционалом.
))) стандартным друпаловским функционалом не решается даже проблема недостаточной длины заголовков статей - извольте отдельный модуль приставлять )))))