Кэширование и динамические данные в Drupal. Загружаем с помощью AJAX.

Аватар пользователя Koreychenko

Чтобы сайт работал быстро, очевидно, что контент нужно кэшировать. Но если делать "в лоб", например, используя модули display cache или закэшировать вывод views, то контент, который должен меняться для каждого пользователя тоже станет статичным.

Выход - часть контента кэшировать, а часть грузить с помощью AJAX.

Делюсь простым способом организовать AJAX подгрузку динамическиго контента после загрузки основного содержимого.

Ссылка на статью.

P.S. Интересно кто как решает эту задачу.

Тип материала:
Версия Drupal:
0 Thanks

Комментарии

Аватар пользователя sas@drupal.org
sas@drupal.org 3 года назад

По разному, зависит даже от функциональности сайт и ограничений клиента. А вообще на .org много модулей для ajaxify site page.

Аватар пользователя duozersk
duozersk 3 года назад
$('.product-get-data').each(function(){
  $(this).once('get-product-data',function(){
    dataAjaxLoadInfo[dataAjaxLoadInfo.length] = $(this).data();
  });
});

можно заменить на

$('.product-get-data', context).each(function() {
  dataAjaxLoadInfo[dataAjaxLoadInfo.length] = $(this).data();
});

Буквально недавно делал "то же самое точно так же" для подгрузки формы опроса в закэшированную страницу - http://www.ok-magazine.ru/oktop10/22531-10-samyh-privlekatelnyh-muzhskih... - теперь осталось ещё как-то прикрутить аяксовую посылку голоса :)

Аватар пользователя Koreychenko
Koreychenko 3 года назад
duozersk написал:
можно заменить на
$('.product-get-data', context)

Да, спасибо, так компактнее. А оно точно не будет при дальнейших AJAX запросах отрабатывать?

Аватар пользователя Виктор Степаньков ака RxB
Виктор Степаньк... 3 года назад

Волнует вопрос бекенда.
Друпал так-то не самое быстрее решение, даже для ajax.
Сколько уходит времени на ответ сервера с ajax-запросом?
https://www.drupal.org/project/js не изучался?

Аватар пользователя Koreychenko
Koreychenko 3 года назад
RxB написал:
Сколько уходит времени на ответ сервера с ajax-запросом?
https://www.drupal.org/project/js не изучался?

Отвечу глупо: "Смотря какой запрос" )))

Я смотрел модуль js - идея интересная, но работает только на простых запросах. Если нужно что-то сложное делать (например цены из Drupal Commerce подгружать или корзинку) все равно приходится делать бутстрап всего друпала, потому что иначе не отрабатывают хуки темы, Rules и еще дофига всего.

Если нужно просто получать данные (например, просто запросом к базе), то да - рекомендую. Оно позволяет время запроса снизить раз в 10.

Аватар пользователя Виктор Степаньков ака RxB
Виктор Степаньк... 3 года назад
Koreychenko написал:

Отвечу глупо: "Смотря какой запрос" )))

Банальная ситуация из твоего примера. Получение цен n-товаров в гриде, например.
Бенчмарки с клиента хорошо бы приложить.

Аватар пользователя duozersk
duozersk 3 года назад
Koreychenko написал:
А оно точно не будет при дальнейших AJAX запросах отрабатывать?

В этом как раз смысл переменной context в behaviors. Отрабатывать-то оно будет, но вот в context при начальной загрузке страницы будет приходить весь document, а в дальнейшем, при использовании Drupal.ajax, Drupal передаст в context только добавленные на страницу элементы.
Тут стоит упомянуть, что могут быть не очень качественные контрибы/кастомный код, которые сами навешивают behaviors, и могут делать это некорректно (и тогда либо их править, либо once - но с ядром таких траблов нет).

RxB написал:
https://www.drupal.org/project/js не изучался?

Я тоже его смотрел... и скажу, что работать с ним не очень удобно.
Первое неудобство - формат его ответа (структура отдаваемого json массива) строго фиксирована и использовать колбэк, реализованный с помощью этого модуля, вместе с Drupal.ajax и commands не получится.
Второе, вытекающее из первого - не подгрузятся за вас никакие ассеты (js, css), требуемые для работы добавленных элементов (это как следствие из первого пункта, что не получается заюзать Drupal.ajax).
Ещё одно неудобство - да, нужно руками указать все модули (даже ядрёные), которые нужно залоадить для обработки вашего колбэка - в итоге (после пятого фатала примерно :)) ставишь всё равно DRUPAL_BOOTSTRAP_FULL и ничего не выигрываешь.
Может я тут, конечно, мало пытался, но потратил на это несколько часов и сделал обычный колбэк в hook_menu + ajax_deliver

Аватар пользователя Koreychenko
Koreychenko 3 года назад
duozersk написал:
duozersk написал:
в итоге (после пятого фатала примерно :)) ставишь всё равно DRUPAL_BOOTSTRAP_FULL и ничего не выигрываешь.

Вот абсолютно такая же была ситуация, поэтому посчитал этот модуль интересным для общего развития, но очень узкоприменимым.

Аватар пользователя chilic
chilic 3 года назад

Просто оставлю это здесь  AuthCache

Аватар пользователя t1mm1
t1mm1 3 года назад

Это решение хорошо, но не для выборки по солру динамики с привязкой на внешний апи, где тоже происходит выборка и обработка данных (динамика, а не выбор статики с учетом привязки к ссылке).

Для более простого - да.
В документации на это с

Аватар пользователя batbug
batbug 3 года назад

P.S. Интересно кто как решает эту задачу.

примитивный самопальный модуль, который генерирует нужные данные по нужному адресу. Аяксом дергаешь эти данные и вставляешь в страницу. Куда уж проще и универсальнее.