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

Аватар пользователя Koreychenko Koreychenko 26 марта 2015 в 13:11

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

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

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

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

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

0 Thanks

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 26 марта 2015 в 14:55

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

Аватар пользователя duozersk duozersk 26 марта 2015 в 22:57
$('.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 27 марта 2015 в 0:07
"duozersk" wrote:

можно заменить на
$('.product-get-data', context)

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

Аватар пользователя Koreychenko Koreychenko 27 марта 2015 в 1:27
"RxB" wrote:

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

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

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

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

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 27 марта 2015 в 1:43
"Koreychenko" wrote:

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

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

Аватар пользователя duozersk duozersk 27 марта 2015 в 10:44
"Koreychenko" wrote:

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

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

"RxB" wrote:

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

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

Аватар пользователя Koreychenko Koreychenko 27 марта 2015 в 11:52
"duozersk" wrote:
"duozersk" wrote:

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

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

Аватар пользователя t1mm1 t1mm1 29 марта 2015 в 14:16

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

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

Аватар пользователя batbug batbug 6 мая 2015 в 10:14

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

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