Обновление представления (views) через ajax

mbaev 13.10.2016, 13:53

Заставить работать какую-либо вьюху с ajax не сложно. Достаточно зайти в настройки и установить параметр Use Ajax: Yes.
ajax-view

К сожалению, модуль Views не предоставляет JS API для программного обновления этой вьюхи. Поэтому, пишем свою функцию (комментарии в коде):

  1. function refreshView(view_id, display_id) {
  2.   var instances = Drupal.views.instances,
  3.     views = Drupal.settings.views.ajaxViews;
  4.  
  5.   // Просматриваем все существующие в JS ajax вьюхи.
  6.   for (var viewDomId in views) {
  7.  
  8.     // Удостоверяемся, что такое свойство существует и
  9.     // ищем вьюху по переданным view_id и display_id
  10.     if (views.hasOwnProperty(viewDomId)
  11.       && views[viewDomId].view_name == view_id
  12.       && views[viewDomId].view_display_id == display_id) {
  13.  
  14.       // Получаем JS настройки вьюхи.
  15.       var viewSettings = views[viewDomId],
  16.  
  17.       // Выясняем dom id вьюхи. Это хэш, который автоматически
  18.       // генерируется на каждое обновление страницы.
  19.         dom_id = viewSettings.view_dom_id,
  20.  
  21.         // Получаем JS настройки инстанции вьюхи.
  22.         instance = instances['views_dom_id:' + dom_id];
  23.  
  24.       // Можно раскомментировать и посмотреть в консоли браузера логи.
  25.       // console.log(views[viewDomId]);
  26.       // console.log(instance);
  27.  
  28.       // Вообще у вьюхи нет понятия "обновить".
  29.       // При запуске триггера на обновление, вьюха загружает следующую страницу.
  30.       // Поэтому мы предварительно делаем текущую страницу-1,
  31.       // а вьюха, загружая следующусю страницу, загрузит текущую.
  32.       instance.refreshViewAjax.options.data.page--;
  33.  
  34.       // Можно установить какие-либо параметры для контекстного фильтра.
  35.       // К примеру, id пользователя.
  36.       // viewSettings.view_args = 1;
  37.  
  38.       // Инициируем триггер обновления вьюхи.
  39.       jQuery('.view-dom-id-' + dom_id).triggerHandler('RefreshView');
  40.     }
  41.   }
  42. }

Пример использования:

  1. refreshView('view_system_name', 'block');

P.S.

Функция не предусматривает моменты, когда не существует объекта Drupal.views или Drupal.settings.views. Думаю, ничего страшного не произойдет, но в консоли будут сыпаться ошибки типа TypeError: Drupal.views is undefined.

Функция также не будет работать при Use ajax: No, о котором написано в начале поста.