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

Чт, 26/03/2015 - 10:11

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

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

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

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

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

0 Спасибо

Комментарии

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

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

0 Спасибо
Аватар пользователя duozersk
2 года 2 months назад duozersk #
$('.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-professiy-v-kino - теперь осталось ещё как-то прикрутить аяксовую посылку голоса :)

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

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

0 Спасибо
Аватар пользователя Виктор Степаньков ака RxB
2 года 2 months назад Виктор Степаньк... #

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

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

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

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

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

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

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

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

0 Спасибо
Аватар пользователя duozersk
2 года 2 months назад duozersk #
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

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

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

0 Спасибо
Аватар пользователя chilic
2 года 2 months назад chilic #

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

0 Спасибо
Аватар пользователя t1mm1
2 года 2 months назад t1mm1 #

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

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

0 Спасибо
Аватар пользователя batbug
2 года 3 недели назад batbug #

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

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

0 Спасибо